Move A Monster Application
<< Image Movement Application | Applications | Mouse Listener Application >>
a single version for Monster.draw()
a double version for Monster.draw2()The Monster object can have a image or not. There are two different applications: one which moves the Monster, the other has a movable Monster that avoids falling monsters.
Monster.java
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
public class Monster
{
private BufferedImage image;
private int x,y;
public Monster()
{
x=20;
y=20;
image=null;
}
public Monster(String imageFileName)
{
this();
image = loadImage(imageFileName);
}
public Monster(int x, int y)
{
this.x=x;
this.y=y;
image=null;
}
public Monster(int x, int y, String imageFileName)
{
this(x,y);
image = loadImage(imageFileName);
}
public void draw(Graphics g){
if (image==null){
g.setColor(Color.BLUE);
g.fillOval(x, y, 10, 10);
}else{
g.drawImage(image, x, y, null);
}
}
public void up(int amt){
y-=amt;
}
public void down(int amt){
y+=amt;
}
public void left(int amt){
x-=amt;
}
public void right(int amt){
x+=amt;
}
public Rectangle getRectangle(){
int height=10;
int width=10;
if(image!=null){
height=image.getHeight();
width=image.getWidth();
}
return new Rectangle(x,y,width, height);
}
public boolean collides(Rectangle box){
return box.intersects(getRectangle());
}
public BufferedImage loadImage(String imageFileName)
{
URL url = getClass().getResource(imageFileName);
if (url == null)
throw new RuntimeException("cannot find file: " + imageFileName);
try
{
return ImageIO.read(url);
}
catch(IOException e)
{
throw new RuntimeException("unable to read from file: " + imageFileName);
}
}
public int getX(){return x;}
public int getY(){return y;}
public void setX(int x){this.x=x;}
public void setY(int y){this.y=y;}
}
MonsterMove.java
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class MonsterMove extends JPanel implements KeyListener
{
public static int WIDTH=800;
public static int HEIGHT=600;
public static int SPEED=6;
private Font titleFont, regularFont;
private Monster fred;
private int code=0;
public MonsterMove()
{
//initialize variables here...
titleFont = new Font("Roman", Font.BOLD, 18);
regularFont = new Font("Helvetica", Font.PLAIN, 12);
fred = new Monster("pinky.gif");
}
public static void main(String[] args) {
MonsterMove app= new MonsterMove();
JFrame window = new JFrame("My Generic Application");
window.setSize(WIDTH, HEIGHT);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.getContentPane().add(app);
window.addKeyListener(app);
//window.pack();
window.setVisible(true);
}
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(Color.WHITE);
g.fillRect(0, 0, getWidth(),getHeight());
g.setColor(Color.BLUE);
g.setFont(titleFont);
g.drawString("My Generic Application", 20, 20);
g.setColor(Color.BLACK);
g.setFont(regularFont);
g.drawString("Version 1.0", 20, 40);
fred.draw(g);
g.drawString("code = "+code, 20, 140);
}
// update is a workaround to cure Windows screen flicker problem
public void update(Graphics g){
paint(g);
}
// These 3 methods need to be declares to implement the KeyListener Interface
@Override
public void keyTyped(KeyEvent e) {}
@Override
public void keyPressed(KeyEvent e) {
code=e.getKeyCode();
// left=37
// right = 39
// up=38
// down =40
if (code==37)
fred.left(SPEED);
if (code==39)
fred.right(SPEED);
if (code==38)
fred.up(SPEED);
if (code==40)
fred.down(SPEED);
repaint();
}
@Override
public void keyReleased(KeyEvent e) {}
}
DodgingMonster.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.ArrayList;
public class DodgingMonster extends JPanel implements KeyListener,ActionListener
{
public static int WIDTH=800;
public static int HEIGHT=600;
public static int SPEED=6;
private Font titleFont, regularFont;
private Monster fred;
private ArrayList<Monster> obsticles;
private Timer spawnTimer, moveTimer;
private int hits, code;
public DodgingMonster()
{
//initialize variables here...
titleFont = new Font("Roman", Font.BOLD, 18);
regularFont = new Font("Helvetica", Font.PLAIN, 12);
fred = new Monster("pinky.gif");
obsticles = new ArrayList<Monster>();
spawnTimer=new Timer(300,this);
moveTimer = new Timer(60, this);
spawnTimer.start();
moveTimer.start();
}
public static void main(String[] args) {
DodgingMonster app= new DodgingMonster();
JFrame window = new JFrame("Avoid Obsticles by pressing arrow keys");
window.setSize(WIDTH, HEIGHT);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.getContentPane().add(app);
window.addKeyListener(app);
//window.pack();
window.setVisible(true);
}
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(Color.WHITE);
g.fillRect(0, 0, getWidth(),getHeight());
g.setColor(Color.BLUE);
g.setFont(titleFont);
g.drawString("Dodging Monster", 20, 20);
g.setColor(Color.BLACK);
g.setFont(regularFont);
g.drawString("Version 1.0", 20, 40);
fred.draw(g);
g.drawString("hits = "+hits, 20, 160);
g.drawString("obstile count = "+obsticles.size(), 20, 140);
for(Monster o: obsticles){
o.draw(g);
}
}
// update is a workaround to cure Windows screen flicker problem
public void update(Graphics g){
paint(g);
}
// This is the method that responds to the timer's ActionEvent
@Override
public void actionPerformed(ActionEvent e){
Object source = e.getSource();
if (source==spawnTimer){
obsticles.add(new Monster((int)(WIDTH*Math.random()),20));
}else {
for(Monster o: obsticles){
o.down(SPEED);
if (o.collides(fred.getRectangle()))
hits++;
}
int i=0;
while ( i< obsticles.size()){
if (obsticles.get(i).getY()>HEIGHT)
obsticles.remove(i);
else
i++;
}
}
repaint();
}
// These 3 methods need to be declares to implement the KeyListener Interface
@Override
public void keyTyped(KeyEvent e) {}
@Override
public void keyPressed(KeyEvent e) {
code=e.getKeyCode();
// left=37
// right = 39
// up=38
// down =40
if (code==37)
fred.left(SPEED);
if (code==39)
fred.right(SPEED);
if (code==38)
fred.up(SPEED);
if (code==40)
fred.down(SPEED);
repaint();
}
@Override
public void keyReleased(KeyEvent e) {}
}
