本章概述:本章主要讲了
1、定义坦克方向的enum,根据按键状态确定坦克方向,根据坦克方向确定坦克位移。
2、抽象出坦克类,封装相应的属性和方法,在tankFrame中直接调用。
3、添加坦克静止的处理,只要四个键都没有按下去,坦克就是静止的。
4、定义子弹类,设定属性和方法,new出一颗新的子弹,在屏幕上画出来。
5、按下space键,tank会火出一颗子弹,必须持有tankFrame的引用,把子弹传递给窗口,画出来
目录
本章概述:
一、定义坦克方向的enum,根据按键状态确定坦克方向,根据坦克方向确定坦克位移
1、TankFrame
2、Dir
二、抽象出坦克类,封装相应的属性和方法,在tankFrame中直接调用
1、TankFrame
2、Tank
三、添加坦克静止的处理,只要四个键都没有按下去,坦克就是静止的
1、TankFrame
2、Tank
四、定义子弹类,设定属性和方法,new出一颗新的子弹,在屏幕上画出来
1、TankFrame
2、Tank
3、Bullet
五、按下space键,tank会火出一颗子弹,必须持有tankFrame的引用,把子弹传递给窗口,画出来
1、TankFrame
2、Tank
运行效果
本章概述:
一、定义坦克方向的enum,根据按键状态确定坦克方向,根据坦克方向确定坦克位移
1、TankFrame
package com.tencent.tank;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TankFrame extends Frame {
int x = 200,y=200;
Dir dir = Dir.DOWN;
static final int SPEED = 10;
public TankFrame(){
@ -33,10 +35,25 @@ public class TankFrame extends Frame {
@Override
public void paint(Graphics g) {
// System.out.println("paint");
g.fillRect(x,y,50,50);
// x += 10;
// y += 50;
switch(dir){
case LEFT:
x -= SPEED;
break;
case UP:
y -= SPEED;
break;
case RIGHT:
x += SPEED;
break;
case DOWN:
y += SPEED;
break;
default:
break;
}
}
class MyListener extends KeyAdapter{
@ -47,7 +64,6 @@ public class TankFrame extends Frame {
boolean bD = false;
@Override
public void keyPressed(KeyEvent e) {
// System.out.println("pressed");
int key = e.getKeyCode();
switch(key){
case KeyEvent.VK_LEFT:
@ -65,11 +81,40 @@ public class TankFrame extends Frame {
default:
break;
}
setMainTankDir();
}
@Override
public void keyReleased(KeyEvent e) {
// System.out.println("released");
int key = e.getKeyCode();
switch(key){
case KeyEvent.VK_LEFT:
bL = false;
break;
case KeyEvent.VK_UP:
bU = false;
break;
case KeyEvent.VK_RIGHT:
bR = false;
break;
case KeyEvent.VK_DOWN:
bD = false;
break;
default:
break;
}
setMainTankDir();
}
private void setMainTankDir() {
if(bL) dir = Dir.LEFT;
if(bU) dir = Dir.UP;
if(bR) dir = Dir.RIGHT;
if(bD) dir = Dir.DOWN;
}
}
}
2、Dir
public enum Dir {
LEFT,UP,RIGHT,DOWN
}
二、抽象出坦克类,封装相应的属性和方法,在tankFrame中直接调用
1、TankFrame
package com.tencent.tank;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TankFrame extends Frame {
int x = 200,y=200;
Dir dir = Dir.DOWN;
static final int SPEED = 10;
Tank myTank = new Tank(200,200,Dir.DOWN);
public TankFrame(){
setTitle("tank war");
@ -35,24 +32,8 @@ public class TankFrame extends Frame {
@Override
public void paint(Graphics g) {
g.fillRect(x,y,50,50);
switch(dir){
case LEFT:
x -= SPEED;
break;
case UP:
y -= SPEED;
break;
case RIGHT:
x += SPEED;
break;
case DOWN:
y += SPEED;
break;
default:
break;
}
myTank.paint(g);
}
@ -109,13 +90,13 @@
}
private void setMainTankDir() {
if(bL) dir = Dir.LEFT;
if(bU) dir = Dir.UP;
if(bR) dir = Dir.RIGHT;
if(bD) dir = Dir.DOWN;
if(bL) myTank.setDir(Dir.LEFT);
if(bU) myTank.setDir(Dir.UP);
if(bR) myTank.setDir(Dir.RIGHT);
if(bD) myTank.setDir(Dir.DOWN);
}
}
}
2、Tank
package com.tencent.tank;
import java.awt.*;
public class Tank {
private int x,y;
private Dir dir;
private static final int SPEED = 10;
public Tank(int x,int y,Dir dir){
this.x = x;
this.y = y;
this.dir = dir;
}
public Dir getDir() {
return dir;
}
public void setDir(Dir dir) {
this.dir = dir;
}
public void paint(Graphics g){
g.fillRect(x,y,50,50);
move();
}
public void move(){
switch(dir){
case LEFT:
x -= SPEED;
break;
case UP:
y -= SPEED;
break;
case RIGHT:
x += SPEED;
break;
case DOWN:
y += SPEED;
break;
default:
break;
}
}
}
三、添加坦克静止的处理,只要四个键都没有按下去,坦克就是静止的
1、TankFrame
package com.tencent.tank;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TankFrame extends Frame {
Tank myTank = new Tank(200,200,Dir.DOWN);
public TankFrame(){
setTitle("tank war");
setSize(800,600);
setResizable(false);
setVisible(true);
this.addKeyListener(new MyListener());
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
@Override
public void paint(Graphics g) {
myTank.paint(g);
}
class MyListener extends KeyAdapter{
boolean bL = false;
boolean bU = false;
boolean bR = false;
boolean bD = false;
@Override
public void keyPressed(KeyEvent e) {
myTank.setMoving(true);
int key = e.getKeyCode();
switch(key){
case KeyEvent.VK_LEFT:
@ -68,6 +70,7 @@ public class TankFrame extends Frame {
@Override
public void keyReleased(KeyEvent e) {
int key = e.getKeyCode();
switch(key){
case KeyEvent.VK_LEFT:
@ -94,9 +97,11 @@
if(bU) myTank.setDir(Dir.UP);
if(bR) myTank.setDir(Dir.RIGHT);
if(bD) myTank.setDir(Dir.DOWN);
if(!bL && !bU && !bR && !bD) myTank.setMoving(false);
}
}
}
2、Tank
package com.tencent.tank;
import java.awt.*;
public class Tank {
private int x,y;
private Dir dir;
private static final int SPEED = 10;
private boolean moving = false;
public Tank(int x,int y,Dir dir){
this.x = x;
this.y = y;
this.dir = dir;
}
public boolean isMoving() {
return moving;
}
public void setMoving(boolean moving) {
this.moving = moving;
}
public Dir getDir() {
return dir;
}
@ -29,24 +39,26 @@
}
public void move(){
if(!moving) return;
switch(dir){
case LEFT:
x -= SPEED;
break;
case UP:
y -= SPEED;
break;
case RIGHT:
x += SPEED;
break;
case DOWN:
y += SPEED;
break;
default:
break;
}
}
}
四、定义子弹类,设定属性和方法,new出一颗新的子弹,在屏幕上画出来
1、TankFrame
package com.tencent.tank;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TankFrame extends Frame {
Tank myTank = new Tank(200,200,Dir.DOWN);
Bullet b = new Bullet(300,300,Dir.DOWN);
public TankFrame(){
setTitle("tank war");
@ -20,7 +21,7 @@ public class TankFrame extends Frame {
setResizable(false);
setVisible(true);
this.addKeyListener(new MyListener());
this.addKeyListener(new MyKeyListener());
addWindowListener(new WindowAdapter() {
@Override
@ -34,10 +35,11 @@ public class TankFrame extends Frame {
public void paint(Graphics g) {
myTank.paint(g);
b.paint(g);
}
class MyListener extends KeyAdapter{
class MyKeyListener extends KeyAdapter{
boolean bL = false;
boolean bU = false;
@ -45,8 +47,6 @@ public class TankFrame extends Frame {
boolean bD = false;
@Override
public void keyPressed(KeyEvent e) {
myTank.setMoving(true);
int key = e.getKeyCode();
switch(key){
case KeyEvent.VK_LEFT:
@ -93,14 +93,20 @@ public class TankFrame extends Frame {
}
private void setMainTankDir() {
if(bL) myTank.setDir(Dir.LEFT);
if(bU) myTank.setDir(Dir.UP);
if(bR) myTank.setDir(Dir.RIGHT);
if(bD) myTank.setDir(Dir.DOWN);
if(!bL && !bU && !bR && !bD) myTank.setMoving(false);
else {
myTank.setMoving(true);
if (bL) myTank.setDir(Dir.LEFT);
if (bU) myTank.setDir(Dir.UP);
if (bR) myTank.setDir(Dir.RIGHT);
if (bD) myTank.setDir(Dir.DOWN);
}
}
}
}
2、Tank
package com.tencent.tank;
import java.awt.*;
public class Tank {
private int x,y;
private Dir dir;
private static final int SPEED = 10;
private static final int SPEED = 5;
private boolean moving = false;
public Tank(int x,int y,Dir dir){
this.x = x;
this.y = y;
this.dir = dir;
}
public boolean isMoving() {
return moving;
}
public void setMoving(boolean moving) {
this.moving = moving;
}
public Dir getDir() {
return dir;
}
public void setDir(Dir dir) {
this.dir = dir;
}
public void paint(Graphics g){
g.fillRect(x,y,50,50);
move();
}
public void move(){
if(!moving) return;
switch(dir){
case LEFT:
x -= SPEED;
break;
case UP:
y -= SPEED;
break;
case RIGHT:
x += SPEED;
break;
case DOWN:
y += SPEED;
break;
default:
break;
}
}
}
3、Bullet
package com.tencent.tank;
import java.awt.*;
public class Bullet {
private int x,y;
private static final int SPEED = 1;
private Dir dir;
static final int WIDTH = 30,HEIGHT = 30;
public Bullet(int x,int y,Dir dir){
this.x = x;
this.y = y;
this.dir = dir;
}
public void paint(Graphics g){
Color c = g.getColor();
g.setColor(Color.RED);
g.fillOval(x,y,WIDTH,HEIGHT);
g.setColor(c);
move();
}
public void move(){
switch(dir){
case LEFT:
x -= SPEED;
break;
case UP:
y -= SPEED;
break;
case RIGHT:
x += SPEED;
break;
case DOWN:
y += SPEED;
break;
default:
break;
}
}
五、按下space键,tank会火出一颗子弹,必须持有tankFrame的引用,把子弹传递给窗口,画出来
1、TankFrame
package com.tencent.tank;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TankFrame extends Frame {
Tank myTank = new Tank(200,200,Dir.DOWN);
Tank myTank = new Tank(200,200,Dir.DOWN,this);
Bullet b = new Bullet(300,300,Dir.DOWN);
static final int GAME_WIDTH = 800,GAME_HEIGHT = 600;
public TankFrame(){
setTitle("tank war");
setSize(GAME_WIDTH,GAME_HEIGHT);
setResizable(false);
setVisible(true);
this.addKeyListener(new MyKeyListener());
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
Image offScreenImage = null;
@Override
public void update(Graphics g) {
if (offScreenImage == null) {
offScreenImage = this.createImage(GAME_WIDTH, GAME_HEIGHT);
}
Graphics gOffScreen = offScreenImage.getGraphics();
Color c = gOffScreen.getColor();
gOffScreen.setColor(Color.BLACK);
gOffScreen.fillRect(0, 0, GAME_WIDTH, GAME_HEIGHT);
gOffScreen.setColor(c);
paint(gOffScreen);
g.drawImage(offScreenImage, 0, 0, null);
}
@Override
public void paint(Graphics g) {
myTank.paint(g);
b.paint(g);
}
class MyKeyListener extends KeyAdapter{
boolean bL = false;
boolean bU = false;
boolean bR = false;
boolean bD = false;
@Override
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
switch(key){
case KeyEvent.VK_LEFT:
bL = true;
break;
case KeyEvent.VK_UP:
bU = true;
break;
case KeyEvent.VK_RIGHT:
bR = true;
break;
case KeyEvent.VK_DOWN:
bD = true;
break;
case KeyEvent.VK_SPACE:
myTank.fire();
break;
default:
break;
}
setMainTankDir();
}
@Override
public void keyReleased(KeyEvent e) {
int key = e.getKeyCode();
switch(key){
case KeyEvent.VK_LEFT:
bL = false;
break;
case KeyEvent.VK_UP:
bU = false;
break;
case KeyEvent.VK_RIGHT:
bR = false;
break;
case KeyEvent.VK_DOWN:
bD = false;
break;
default:
break;
}
setMainTankDir();
}
private void setMainTankDir() {
if(!bL && !bU && !bR && !bD) myTank.setMoving(false);
else {
myTank.setMoving(true);
if (bL) myTank.setDir(Dir.LEFT);
if (bU) myTank.setDir(Dir.UP);
if (bR) myTank.setDir(Dir.RIGHT);
if (bD) myTank.setDir(Dir.DOWN);
}
}
}
}
2、Tank
package com.tencent.tank;
import java.awt.*;
public class Tank {
private int x,y;
private Dir dir;
private static final int SPEED = 5;
private boolean moving = false;
public Tank(int x,int y,Dir dir){
TankFrame tf = null;
public Tank(int x,int y,Dir dir,TankFrame tf){
this.x = x;
this.y = y;
this.dir = dir;
this.tf = tf;
}
public boolean isMoving() {
return moving;
}
public void setMoving(boolean moving) {
this.moving = moving;
}
public Dir getDir() {
return dir;
}
public void setDir(Dir dir) {
this.dir = dir;
}
public void paint(Graphics g){
Color c = g.getColor();
g.setColor(Color.BLUE);
g.fillRect(x,y,50,50);
g.setColor(c);
move();
}
public void move(){
if(!moving) return;
switch(dir){
case LEFT:
x -= SPEED;
break;
case UP:
y -= SPEED;
break;
case RIGHT:
x += SPEED;
break;
case DOWN:
y += SPEED;
break;
default:
break;
}
}
public void fire() {
tf.b = new Bullet(this.x,this.y,this.dir);
}
}
运行效果
1、TankFrame
package com.tencent.tank;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TankFrame extends Frame {
int x = 200,y=200;
Dir dir = Dir.DOWN;
static final int SPEED = 10;
public TankFrame(){
@ -33,10 +35,25 @@ public class TankFrame extends Frame {
@Override
public void paint(Graphics g) {
// System.out.println("paint");
g.fillRect(x,y,50,50);
// x += 10;
// y += 50;
switch(dir){
case LEFT:
x -= SPEED;
break;
case UP:
y -= SPEED;
break;
case RIGHT:
x += SPEED;
break;
case DOWN:
y += SPEED;
break;
default:
break;
}
}
class MyListener extends KeyAdapter{
@ -47,7 +64,6 @@ public class TankFrame extends Frame {
boolean bD = false;
@Override
public void keyPressed(KeyEvent e) {
// System.out.println("pressed");
int key = e.getKeyCode();
switch(key){
case KeyEvent.VK_LEFT:
@ -65,11 +81,40 @@ public class TankFrame extends Frame {
default:
break;
}
setMainTankDir();
}
@Override
public void keyReleased(KeyEvent e) {
// System.out.println("released");
int key = e.getKeyCode();
switch(key){
case KeyEvent.VK_LEFT:
bL = false;
break;
case KeyEvent.VK_UP:
bU = false;
break;
case KeyEvent.VK_RIGHT:
bR = false;
break;
case KeyEvent.VK_DOWN:
bD = false;
break;
default:
break;
}
setMainTankDir();
}
private void setMainTankDir() {
if(bL) dir = Dir.LEFT;
if(bU) dir = Dir.UP;
if(bR) dir = Dir.RIGHT;
if(bD) dir = Dir.DOWN;
}
}
}
2、Dir
public enum Dir {
LEFT,UP,RIGHT,DOWN
}
二、抽象出坦克类,封装相应的属性和方法,在tankFrame中直接调用
1、TankFrame
package com.tencent.tank;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TankFrame extends Frame {
int x = 200,y=200;
Dir dir = Dir.DOWN;
static final int SPEED = 10;
Tank myTank = new Tank(200,200,Dir.DOWN);
public TankFrame(){
setTitle("tank war");
@ -35,24 +32,8 @@ public class TankFrame extends Frame {
@Override
public void paint(Graphics g) {
g.fillRect(x,y,50,50);
switch(dir){
case LEFT:
x -= SPEED;
break;
case UP:
y -= SPEED;
break;
case RIGHT:
x += SPEED;
break;
case DOWN:
y += SPEED;
break;
default:
break;
}
myTank.paint(g);
}
@ -109,13 +90,13 @@
}
private void setMainTankDir() {
if(bL) dir = Dir.LEFT;
if(bU) dir = Dir.UP;
if(bR) dir = Dir.RIGHT;
if(bD) dir = Dir.DOWN;
if(bL) myTank.setDir(Dir.LEFT);
if(bU) myTank.setDir(Dir.UP);
if(bR) myTank.setDir(Dir.RIGHT);
if(bD) myTank.setDir(Dir.DOWN);
}
}
}
2、Tank
package com.tencent.tank;
import java.awt.*;
public class Tank {
private int x,y;
private Dir dir;
private static final int SPEED = 10;
public Tank(int x,int y,Dir dir){
this.x = x;
this.y = y;
this.dir = dir;
}
public Dir getDir() {
return dir;
}
public void setDir(Dir dir) {
this.dir = dir;
}
public void paint(Graphics g){
g.fillRect(x,y,50,50);
move();
}
public void move(){
switch(dir){
case LEFT:
x -= SPEED;
break;
case UP:
y -= SPEED;
break;
case RIGHT:
x += SPEED;
break;
case DOWN:
y += SPEED;
break;
default:
break;
}
}
}
三、添加坦克静止的处理,只要四个键都没有按下去,坦克就是静止的
1、TankFrame
package com.tencent.tank;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TankFrame extends Frame {
Tank myTank = new Tank(200,200,Dir.DOWN);
public TankFrame(){
setTitle("tank war");
setSize(800,600);
setResizable(false);
setVisible(true);
this.addKeyListener(new MyListener());
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
@Override
public void paint(Graphics g) {
myTank.paint(g);
}
class MyListener extends KeyAdapter{
boolean bL = false;
boolean bU = false;
boolean bR = false;
boolean bD = false;
@Override
public void keyPressed(KeyEvent e) {
myTank.setMoving(true);
int key = e.getKeyCode();
switch(key){
case KeyEvent.VK_LEFT:
@ -68,6 +70,7 @@ public class TankFrame extends Frame {
@Override
public void keyReleased(KeyEvent e) {
int key = e.getKeyCode();
switch(key){
case KeyEvent.VK_LEFT:
@ -94,9 +97,11 @@
if(bU) myTank.setDir(Dir.UP);
if(bR) myTank.setDir(Dir.RIGHT);
if(bD) myTank.setDir(Dir.DOWN);
if(!bL && !bU && !bR && !bD) myTank.setMoving(false);
}
}
}
2、Tank
package com.tencent.tank;
import java.awt.*;
public class Tank {
private int x,y;
private Dir dir;
private static final int SPEED = 10;
private boolean moving = false;
public Tank(int x,int y,Dir dir){
this.x = x;
this.y = y;
this.dir = dir;
}
public boolean isMoving() {
return moving;
}
public void setMoving(boolean moving) {
this.moving = moving;
}
public Dir getDir() {
return dir;
}
@ -29,24 +39,26 @@
}
public void move(){
if(!moving) return;
switch(dir){
case LEFT:
x -= SPEED;
break;
case UP:
y -= SPEED;
break;
case RIGHT:
x += SPEED;
break;
case DOWN:
y += SPEED;
break;
default:
break;
}
}
}
四、定义子弹类,设定属性和方法,new出一颗新的子弹,在屏幕上画出来
1、TankFrame
package com.tencent.tank;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TankFrame extends Frame {
Tank myTank = new Tank(200,200,Dir.DOWN);
Bullet b = new Bullet(300,300,Dir.DOWN);
public TankFrame(){
setTitle("tank war");
@ -20,7 +21,7 @@ public class TankFrame extends Frame {
setResizable(false);
setVisible(true);
this.addKeyListener(new MyListener());
this.addKeyListener(new MyKeyListener());
addWindowListener(new WindowAdapter() {
@Override
@ -34,10 +35,11 @@ public class TankFrame extends Frame {
public void paint(Graphics g) {
myTank.paint(g);
b.paint(g);
}
class MyListener extends KeyAdapter{
class MyKeyListener extends KeyAdapter{
boolean bL = false;
boolean bU = false;
@ -45,8 +47,6 @@ public class TankFrame extends Frame {
boolean bD = false;
@Override
public void keyPressed(KeyEvent e) {
myTank.setMoving(true);
int key = e.getKeyCode();
switch(key){
case KeyEvent.VK_LEFT:
@ -93,14 +93,20 @@ public class TankFrame extends Frame {
}
private void setMainTankDir() {
if(bL) myTank.setDir(Dir.LEFT);
if(bU) myTank.setDir(Dir.UP);
if(bR) myTank.setDir(Dir.RIGHT);
if(bD) myTank.setDir(Dir.DOWN);
if(!bL && !bU && !bR && !bD) myTank.setMoving(false);
else {
myTank.setMoving(true);
if (bL) myTank.setDir(Dir.LEFT);
if (bU) myTank.setDir(Dir.UP);
if (bR) myTank.setDir(Dir.RIGHT);
if (bD) myTank.setDir(Dir.DOWN);
}
}
}
}
2、Tank
package com.tencent.tank;
import java.awt.*;
public class Tank {
private int x,y;
private Dir dir;
private static final int SPEED = 10;
private static final int SPEED = 5;
private boolean moving = false;
public Tank(int x,int y,Dir dir){
this.x = x;
this.y = y;
this.dir = dir;
}
public boolean isMoving() {
return moving;
}
public void setMoving(boolean moving) {
this.moving = moving;
}
public Dir getDir() {
return dir;
}
public void setDir(Dir dir) {
this.dir = dir;
}
public void paint(Graphics g){
g.fillRect(x,y,50,50);
move();
}
public void move(){
if(!moving) return;
switch(dir){
case LEFT:
x -= SPEED;
break;
case UP:
y -= SPEED;
break;
case RIGHT:
x += SPEED;
break;
case DOWN:
y += SPEED;
break;
default:
break;
}
}
}
3、Bullet
package com.tencent.tank;
import java.awt.*;
public class Bullet {
private int x,y;
private static final int SPEED = 1;
private Dir dir;
static final int WIDTH = 30,HEIGHT = 30;
public Bullet(int x,int y,Dir dir){
this.x = x;
this.y = y;
this.dir = dir;
}
public void paint(Graphics g){
Color c = g.getColor();
g.setColor(Color.RED);
g.fillOval(x,y,WIDTH,HEIGHT);
g.setColor(c);
move();
}
public void move(){
switch(dir){
case LEFT:
x -= SPEED;
break;
case UP:
y -= SPEED;
break;
case RIGHT:
x += SPEED;
break;
case DOWN:
y += SPEED;
break;
default:
break;
}
}
五、按下space键,tank会火出一颗子弹,必须持有tankFrame的引用,把子弹传递给窗口,画出来
1、TankFrame
package com.tencent.tank;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TankFrame extends Frame {
Tank myTank = new Tank(200,200,Dir.DOWN);
Tank myTank = new Tank(200,200,Dir.DOWN,this);
Bullet b = new Bullet(300,300,Dir.DOWN);
static final int GAME_WIDTH = 800,GAME_HEIGHT = 600;
public TankFrame(){
setTitle("tank war");
setSize(GAME_WIDTH,GAME_HEIGHT);
setResizable(false);
setVisible(true);
this.addKeyListener(new MyKeyListener());
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
Image offScreenImage = null;
@Override
public void update(Graphics g) {
if (offScreenImage == null) {
offScreenImage = this.createImage(GAME_WIDTH, GAME_HEIGHT);
}
Graphics gOffScreen = offScreenImage.getGraphics();
Color c = gOffScreen.getColor();
gOffScreen.setColor(Color.BLACK);
gOffScreen.fillRect(0, 0, GAME_WIDTH, GAME_HEIGHT);
gOffScreen.setColor(c);
paint(gOffScreen);
g.drawImage(offScreenImage, 0, 0, null);
}
@Override
public void paint(Graphics g) {
myTank.paint(g);
b.paint(g);
}
class MyKeyListener extends KeyAdapter{
boolean bL = false;
boolean bU = false;
boolean bR = false;
boolean bD = false;
@Override
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
switch(key){
case KeyEvent.VK_LEFT:
bL = true;
break;
case KeyEvent.VK_UP:
bU = true;
break;
case KeyEvent.VK_RIGHT:
bR = true;
break;
case KeyEvent.VK_DOWN:
bD = true;
break;
case KeyEvent.VK_SPACE:
myTank.fire();
break;
default:
break;
}
setMainTankDir();
}
@Override
public void keyReleased(KeyEvent e) {
int key = e.getKeyCode();
switch(key){
case KeyEvent.VK_LEFT:
bL = false;
break;
case KeyEvent.VK_UP:
bU = false;
break;
case KeyEvent.VK_RIGHT:
bR = false;
break;
case KeyEvent.VK_DOWN:
bD = false;
break;
default:
break;
}
setMainTankDir();
}
private void setMainTankDir() {
if(!bL && !bU && !bR && !bD) myTank.setMoving(false);
else {
myTank.setMoving(true);
if (bL) myTank.setDir(Dir.LEFT);
if (bU) myTank.setDir(Dir.UP);
if (bR) myTank.setDir(Dir.RIGHT);
if (bD) myTank.setDir(Dir.DOWN);
}
}
}
}
2、Tank
package com.tencent.tank;
import java.awt.*;
public class Tank {
private int x,y;
private Dir dir;
private static final int SPEED = 5;
private boolean moving = false;
public Tank(int x,int y,Dir dir){
TankFrame tf = null;
public Tank(int x,int y,Dir dir,TankFrame tf){
this.x = x;
this.y = y;
this.dir = dir;
this.tf = tf;
}
public boolean isMoving() {
return moving;
}
public void setMoving(boolean moving) {
this.moving = moving;
}
public Dir getDir() {
return dir;
}
public void setDir(Dir dir) {
this.dir = dir;
}
public void paint(Graphics g){
Color c = g.getColor();
g.setColor(Color.BLUE);
g.fillRect(x,y,50,50);
g.setColor(c);
move();
}
public void move(){
if(!moving) return;
switch(dir){
case LEFT:
x -= SPEED;
break;
case UP:
y -= SPEED;
break;
case RIGHT:
x += SPEED;
break;
case DOWN:
y += SPEED;
break;
default:
break;
}
}
public void fire() {
tf.b = new Bullet(this.x,this.y,this.dir);
}
}
运行效果
public enum Dir {
LEFT,UP,RIGHT,DOWN
}
二、抽象出坦克类,封装相应的属性和方法,在tankFrame中直接调用
1、TankFrame
package com.tencent.tank;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TankFrame extends Frame {
int x = 200,y=200;
Dir dir = Dir.DOWN;
static final int SPEED = 10;
Tank myTank = new Tank(200,200,Dir.DOWN);
public TankFrame(){
setTitle("tank war");
@ -35,24 +32,8 @@ public class TankFrame extends Frame {
@Override
public void paint(Graphics g) {
g.fillRect(x,y,50,50);
switch(dir){
case LEFT:
x -= SPEED;
break;
case UP:
y -= SPEED;
break;
case RIGHT:
x += SPEED;
break;
case DOWN:
y += SPEED;
break;
default:
break;
}
myTank.paint(g);
}
@ -109,13 +90,13 @@
}
private void setMainTankDir() {
if(bL) dir = Dir.LEFT;
if(bU) dir = Dir.UP;
if(bR) dir = Dir.RIGHT;
if(bD) dir = Dir.DOWN;
if(bL) myTank.setDir(Dir.LEFT);
if(bU) myTank.setDir(Dir.UP);
if(bR) myTank.setDir(Dir.RIGHT);
if(bD) myTank.setDir(Dir.DOWN);
}
}
}
2、Tank
package com.tencent.tank;
import java.awt.*;
public class Tank {
private int x,y;
private Dir dir;
private static final int SPEED = 10;
public Tank(int x,int y,Dir dir){
this.x = x;
this.y = y;
this.dir = dir;
}
public Dir getDir() {
return dir;
}
public void setDir(Dir dir) {
this.dir = dir;
}
public void paint(Graphics g){
g.fillRect(x,y,50,50);
move();
}
public void move(){
switch(dir){
case LEFT:
x -= SPEED;
break;
case UP:
y -= SPEED;
break;
case RIGHT:
x += SPEED;
break;
case DOWN:
y += SPEED;
break;
default:
break;
}
}
}
三、添加坦克静止的处理,只要四个键都没有按下去,坦克就是静止的
1、TankFrame
package com.tencent.tank;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TankFrame extends Frame {
Tank myTank = new Tank(200,200,Dir.DOWN);
public TankFrame(){
setTitle("tank war");
setSize(800,600);
setResizable(false);
setVisible(true);
this.addKeyListener(new MyListener());
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
@Override
public void paint(Graphics g) {
myTank.paint(g);
}
class MyListener extends KeyAdapter{
boolean bL = false;
boolean bU = false;
boolean bR = false;
boolean bD = false;
@Override
public void keyPressed(KeyEvent e) {
myTank.setMoving(true);
int key = e.getKeyCode();
switch(key){
case KeyEvent.VK_LEFT:
@ -68,6 +70,7 @@ public class TankFrame extends Frame {
@Override
public void keyReleased(KeyEvent e) {
int key = e.getKeyCode();
switch(key){
case KeyEvent.VK_LEFT:
@ -94,9 +97,11 @@
if(bU) myTank.setDir(Dir.UP);
if(bR) myTank.setDir(Dir.RIGHT);
if(bD) myTank.setDir(Dir.DOWN);
if(!bL && !bU && !bR && !bD) myTank.setMoving(false);
}
}
}
2、Tank
package com.tencent.tank;
import java.awt.*;
public class Tank {
private int x,y;
private Dir dir;
private static final int SPEED = 10;
private boolean moving = false;
public Tank(int x,int y,Dir dir){
this.x = x;
this.y = y;
this.dir = dir;
}
public boolean isMoving() {
return moving;
}
public void setMoving(boolean moving) {
this.moving = moving;
}
public Dir getDir() {
return dir;
}
@ -29,24 +39,26 @@
}
public void move(){
if(!moving) return;
switch(dir){
case LEFT:
x -= SPEED;
break;
case UP:
y -= SPEED;
break;
case RIGHT:
x += SPEED;
break;
case DOWN:
y += SPEED;
break;
default:
break;
}
}
}
四、定义子弹类,设定属性和方法,new出一颗新的子弹,在屏幕上画出来
1、TankFrame
package com.tencent.tank;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TankFrame extends Frame {
Tank myTank = new Tank(200,200,Dir.DOWN);
Bullet b = new Bullet(300,300,Dir.DOWN);
public TankFrame(){
setTitle("tank war");
@ -20,7 +21,7 @@ public class TankFrame extends Frame {
setResizable(false);
setVisible(true);
this.addKeyListener(new MyListener());
this.addKeyListener(new MyKeyListener());
addWindowListener(new WindowAdapter() {
@Override
@ -34,10 +35,11 @@ public class TankFrame extends Frame {
public void paint(Graphics g) {
myTank.paint(g);
b.paint(g);
}
class MyListener extends KeyAdapter{
class MyKeyListener extends KeyAdapter{
boolean bL = false;
boolean bU = false;
@ -45,8 +47,6 @@ public class TankFrame extends Frame {
boolean bD = false;
@Override
public void keyPressed(KeyEvent e) {
myTank.setMoving(true);
int key = e.getKeyCode();
switch(key){
case KeyEvent.VK_LEFT:
@ -93,14 +93,20 @@ public class TankFrame extends Frame {
}
private void setMainTankDir() {
if(bL) myTank.setDir(Dir.LEFT);
if(bU) myTank.setDir(Dir.UP);
if(bR) myTank.setDir(Dir.RIGHT);
if(bD) myTank.setDir(Dir.DOWN);
if(!bL && !bU && !bR && !bD) myTank.setMoving(false);
else {
myTank.setMoving(true);
if (bL) myTank.setDir(Dir.LEFT);
if (bU) myTank.setDir(Dir.UP);
if (bR) myTank.setDir(Dir.RIGHT);
if (bD) myTank.setDir(Dir.DOWN);
}
}
}
}
2、Tank
package com.tencent.tank;
import java.awt.*;
public class Tank {
private int x,y;
private Dir dir;
private static final int SPEED = 10;
private static final int SPEED = 5;
private boolean moving = false;
public Tank(int x,int y,Dir dir){
this.x = x;
this.y = y;
this.dir = dir;
}
public boolean isMoving() {
return moving;
}
public void setMoving(boolean moving) {
this.moving = moving;
}
public Dir getDir() {
return dir;
}
public void setDir(Dir dir) {
this.dir = dir;
}
public void paint(Graphics g){
g.fillRect(x,y,50,50);
move();
}
public void move(){
if(!moving) return;
switch(dir){
case LEFT:
x -= SPEED;
break;
case UP:
y -= SPEED;
break;
case RIGHT:
x += SPEED;
break;
case DOWN:
y += SPEED;
break;
default:
break;
}
}
}
3、Bullet
package com.tencent.tank;
import java.awt.*;
public class Bullet {
private int x,y;
private static final int SPEED = 1;
private Dir dir;
static final int WIDTH = 30,HEIGHT = 30;
public Bullet(int x,int y,Dir dir){
this.x = x;
this.y = y;
this.dir = dir;
}
public void paint(Graphics g){
Color c = g.getColor();
g.setColor(Color.RED);
g.fillOval(x,y,WIDTH,HEIGHT);
g.setColor(c);
move();
}
public void move(){
switch(dir){
case LEFT:
x -= SPEED;
break;
case UP:
y -= SPEED;
break;
case RIGHT:
x += SPEED;
break;
case DOWN:
y += SPEED;
break;
default:
break;
}
}
五、按下space键,tank会火出一颗子弹,必须持有tankFrame的引用,把子弹传递给窗口,画出来
1、TankFrame
package com.tencent.tank;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TankFrame extends Frame {
Tank myTank = new Tank(200,200,Dir.DOWN);
Tank myTank = new Tank(200,200,Dir.DOWN,this);
Bullet b = new Bullet(300,300,Dir.DOWN);
static final int GAME_WIDTH = 800,GAME_HEIGHT = 600;
public TankFrame(){
setTitle("tank war");
setSize(GAME_WIDTH,GAME_HEIGHT);
setResizable(false);
setVisible(true);
this.addKeyListener(new MyKeyListener());
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
Image offScreenImage = null;
@Override
public void update(Graphics g) {
if (offScreenImage == null) {
offScreenImage = this.createImage(GAME_WIDTH, GAME_HEIGHT);
}
Graphics gOffScreen = offScreenImage.getGraphics();
Color c = gOffScreen.getColor();
gOffScreen.setColor(Color.BLACK);
gOffScreen.fillRect(0, 0, GAME_WIDTH, GAME_HEIGHT);
gOffScreen.setColor(c);
paint(gOffScreen);
g.drawImage(offScreenImage, 0, 0, null);
}
@Override
public void paint(Graphics g) {
myTank.paint(g);
b.paint(g);
}
class MyKeyListener extends KeyAdapter{
boolean bL = false;
boolean bU = false;
boolean bR = false;
boolean bD = false;
@Override
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
switch(key){
case KeyEvent.VK_LEFT:
bL = true;
break;
case KeyEvent.VK_UP:
bU = true;
break;
case KeyEvent.VK_RIGHT:
bR = true;
break;
case KeyEvent.VK_DOWN:
bD = true;
break;
case KeyEvent.VK_SPACE:
myTank.fire();
break;
default:
break;
}
setMainTankDir();
}
@Override
public void keyReleased(KeyEvent e) {
int key = e.getKeyCode();
switch(key){
case KeyEvent.VK_LEFT:
bL = false;
break;
case KeyEvent.VK_UP:
bU = false;
break;
case KeyEvent.VK_RIGHT:
bR = false;
break;
case KeyEvent.VK_DOWN:
bD = false;
break;
default:
break;
}
setMainTankDir();
}
private void setMainTankDir() {
if(!bL && !bU && !bR && !bD) myTank.setMoving(false);
else {
myTank.setMoving(true);
if (bL) myTank.setDir(Dir.LEFT);
if (bU) myTank.setDir(Dir.UP);
if (bR) myTank.setDir(Dir.RIGHT);
if (bD) myTank.setDir(Dir.DOWN);
}
}
}
}
2、Tank
package com.tencent.tank;
import java.awt.*;
public class Tank {
private int x,y;
private Dir dir;
private static final int SPEED = 5;
private boolean moving = false;
public Tank(int x,int y,Dir dir){
TankFrame tf = null;
public Tank(int x,int y,Dir dir,TankFrame tf){
this.x = x;
this.y = y;
this.dir = dir;
this.tf = tf;
}
public boolean isMoving() {
return moving;
}
public void setMoving(boolean moving) {
this.moving = moving;
}
public Dir getDir() {
return dir;
}
public void setDir(Dir dir) {
this.dir = dir;
}
public void paint(Graphics g){
Color c = g.getColor();
g.setColor(Color.BLUE);
g.fillRect(x,y,50,50);
g.setColor(c);
move();
}
public void move(){
if(!moving) return;
switch(dir){
case LEFT:
x -= SPEED;
break;
case UP:
y -= SPEED;
break;
case RIGHT:
x += SPEED;
break;
case DOWN:
y += SPEED;
break;
default:
break;
}
}
public void fire() {
tf.b = new Bullet(this.x,this.y,this.dir);
}
}
运行效果
package com.tencent.tank;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TankFrame extends Frame {
int x = 200,y=200;
Dir dir = Dir.DOWN;
static final int SPEED = 10;
Tank myTank = new Tank(200,200,Dir.DOWN);
public TankFrame(){
setTitle("tank war");
@ -35,24 +32,8 @@ public class TankFrame extends Frame {
@Override
public void paint(Graphics g) {
g.fillRect(x,y,50,50);
switch(dir){
case LEFT:
x -= SPEED;
break;
case UP:
y -= SPEED;
break;
case RIGHT:
x += SPEED;
break;
case DOWN:
y += SPEED;
break;
default:
break;
}
myTank.paint(g);
}
@ -109,13 +90,13 @@
}
private void setMainTankDir() {
if(bL) dir = Dir.LEFT;
if(bU) dir = Dir.UP;
if(bR) dir = Dir.RIGHT;
if(bD) dir = Dir.DOWN;
if(bL) myTank.setDir(Dir.LEFT);
if(bU) myTank.setDir(Dir.UP);
if(bR) myTank.setDir(Dir.RIGHT);
if(bD) myTank.setDir(Dir.DOWN);
}
}
}
2、Tank
package com.tencent.tank;
import java.awt.*;
public class Tank {
private int x,y;
private Dir dir;
private static final int SPEED = 10;
public Tank(int x,int y,Dir dir){
this.x = x;
this.y = y;
this.dir = dir;
}
public Dir getDir() {
return dir;
}
public void setDir(Dir dir) {
this.dir = dir;
}
public void paint(Graphics g){
g.fillRect(x,y,50,50);
move();
}
public void move(){
switch(dir){
case LEFT:
x -= SPEED;
break;
case UP:
y -= SPEED;
break;
case RIGHT:
x += SPEED;
break;
case DOWN:
y += SPEED;
break;
default:
break;
}
}
}
三、添加坦克静止的处理,只要四个键都没有按下去,坦克就是静止的
1、TankFrame
package com.tencent.tank;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TankFrame extends Frame {
Tank myTank = new Tank(200,200,Dir.DOWN);
public TankFrame(){
setTitle("tank war");
setSize(800,600);
setResizable(false);
setVisible(true);
this.addKeyListener(new MyListener());
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
@Override
public void paint(Graphics g) {
myTank.paint(g);
}
class MyListener extends KeyAdapter{
boolean bL = false;
boolean bU = false;
boolean bR = false;
boolean bD = false;
@Override
public void keyPressed(KeyEvent e) {
myTank.setMoving(true);
int key = e.getKeyCode();
switch(key){
case KeyEvent.VK_LEFT:
@ -68,6 +70,7 @@ public class TankFrame extends Frame {
@Override
public void keyReleased(KeyEvent e) {
int key = e.getKeyCode();
switch(key){
case KeyEvent.VK_LEFT:
@ -94,9 +97,11 @@
if(bU) myTank.setDir(Dir.UP);
if(bR) myTank.setDir(Dir.RIGHT);
if(bD) myTank.setDir(Dir.DOWN);
if(!bL && !bU && !bR && !bD) myTank.setMoving(false);
}
}
}
2、Tank
package com.tencent.tank;
import java.awt.*;
public class Tank {
private int x,y;
private Dir dir;
private static final int SPEED = 10;
private boolean moving = false;
public Tank(int x,int y,Dir dir){
this.x = x;
this.y = y;
this.dir = dir;
}
public boolean isMoving() {
return moving;
}
public void setMoving(boolean moving) {
this.moving = moving;
}
public Dir getDir() {
return dir;
}
@ -29,24 +39,26 @@
}
public void move(){
if(!moving) return;
switch(dir){
case LEFT:
x -= SPEED;
break;
case UP:
y -= SPEED;
break;
case RIGHT:
x += SPEED;
break;
case DOWN:
y += SPEED;
break;
default:
break;
}
}
}
四、定义子弹类,设定属性和方法,new出一颗新的子弹,在屏幕上画出来
1、TankFrame
package com.tencent.tank;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TankFrame extends Frame {
Tank myTank = new Tank(200,200,Dir.DOWN);
Bullet b = new Bullet(300,300,Dir.DOWN);
public TankFrame(){
setTitle("tank war");
@ -20,7 +21,7 @@ public class TankFrame extends Frame {
setResizable(false);
setVisible(true);
this.addKeyListener(new MyListener());
this.addKeyListener(new MyKeyListener());
addWindowListener(new WindowAdapter() {
@Override
@ -34,10 +35,11 @@ public class TankFrame extends Frame {
public void paint(Graphics g) {
myTank.paint(g);
b.paint(g);
}
class MyListener extends KeyAdapter{
class MyKeyListener extends KeyAdapter{
boolean bL = false;
boolean bU = false;
@ -45,8 +47,6 @@ public class TankFrame extends Frame {
boolean bD = false;
@Override
public void keyPressed(KeyEvent e) {
myTank.setMoving(true);
int key = e.getKeyCode();
switch(key){
case KeyEvent.VK_LEFT:
@ -93,14 +93,20 @@ public class TankFrame extends Frame {
}
private void setMainTankDir() {
if(bL) myTank.setDir(Dir.LEFT);
if(bU) myTank.setDir(Dir.UP);
if(bR) myTank.setDir(Dir.RIGHT);
if(bD) myTank.setDir(Dir.DOWN);
if(!bL && !bU && !bR && !bD) myTank.setMoving(false);
else {
myTank.setMoving(true);
if (bL) myTank.setDir(Dir.LEFT);
if (bU) myTank.setDir(Dir.UP);
if (bR) myTank.setDir(Dir.RIGHT);
if (bD) myTank.setDir(Dir.DOWN);
}
}
}
}
2、Tank
package com.tencent.tank;
import java.awt.*;
public class Tank {
private int x,y;
private Dir dir;
private static final int SPEED = 10;
private static final int SPEED = 5;
private boolean moving = false;
public Tank(int x,int y,Dir dir){
this.x = x;
this.y = y;
this.dir = dir;
}
public boolean isMoving() {
return moving;
}
public void setMoving(boolean moving) {
this.moving = moving;
}
public Dir getDir() {
return dir;
}
public void setDir(Dir dir) {
this.dir = dir;
}
public void paint(Graphics g){
g.fillRect(x,y,50,50);
move();
}
public void move(){
if(!moving) return;
switch(dir){
case LEFT:
x -= SPEED;
break;
case UP:
y -= SPEED;
break;
case RIGHT:
x += SPEED;
break;
case DOWN:
y += SPEED;
break;
default:
break;
}
}
}
3、Bullet
package com.tencent.tank;
import java.awt.*;
public class Bullet {
private int x,y;
private static final int SPEED = 1;
private Dir dir;
static final int WIDTH = 30,HEIGHT = 30;
public Bullet(int x,int y,Dir dir){
this.x = x;
this.y = y;
this.dir = dir;
}
public void paint(Graphics g){
Color c = g.getColor();
g.setColor(Color.RED);
g.fillOval(x,y,WIDTH,HEIGHT);
g.setColor(c);
move();
}
public void move(){
switch(dir){
case LEFT:
x -= SPEED;
break;
case UP:
y -= SPEED;
break;
case RIGHT:
x += SPEED;
break;
case DOWN:
y += SPEED;
break;
default:
break;
}
}
五、按下space键,tank会火出一颗子弹,必须持有tankFrame的引用,把子弹传递给窗口,画出来
1、TankFrame
package com.tencent.tank;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TankFrame extends Frame {
Tank myTank = new Tank(200,200,Dir.DOWN);
Tank myTank = new Tank(200,200,Dir.DOWN,this);
Bullet b = new Bullet(300,300,Dir.DOWN);
static final int GAME_WIDTH = 800,GAME_HEIGHT = 600;
public TankFrame(){
setTitle("tank war");
setSize(GAME_WIDTH,GAME_HEIGHT);
setResizable(false);
setVisible(true);
this.addKeyListener(new MyKeyListener());
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
Image offScreenImage = null;
@Override
public void update(Graphics g) {
if (offScreenImage == null) {
offScreenImage = this.createImage(GAME_WIDTH, GAME_HEIGHT);
}
Graphics gOffScreen = offScreenImage.getGraphics();
Color c = gOffScreen.getColor();
gOffScreen.setColor(Color.BLACK);
gOffScreen.fillRect(0, 0, GAME_WIDTH, GAME_HEIGHT);
gOffScreen.setColor(c);
paint(gOffScreen);
g.drawImage(offScreenImage, 0, 0, null);
}
@Override
public void paint(Graphics g) {
myTank.paint(g);
b.paint(g);
}
class MyKeyListener extends KeyAdapter{
boolean bL = false;
boolean bU = false;
boolean bR = false;
boolean bD = false;
@Override
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
switch(key){
case KeyEvent.VK_LEFT:
bL = true;
break;
case KeyEvent.VK_UP:
bU = true;
break;
case KeyEvent.VK_RIGHT:
bR = true;
break;
case KeyEvent.VK_DOWN:
bD = true;
break;
case KeyEvent.VK_SPACE:
myTank.fire();
break;
default:
break;
}
setMainTankDir();
}
@Override
public void keyReleased(KeyEvent e) {
int key = e.getKeyCode();
switch(key){
case KeyEvent.VK_LEFT:
bL = false;
break;
case KeyEvent.VK_UP:
bU = false;
break;
case KeyEvent.VK_RIGHT:
bR = false;
break;
case KeyEvent.VK_DOWN:
bD = false;
break;
default:
break;
}
setMainTankDir();
}
private void setMainTankDir() {
if(!bL && !bU && !bR && !bD) myTank.setMoving(false);
else {
myTank.setMoving(true);
if (bL) myTank.setDir(Dir.LEFT);
if (bU) myTank.setDir(Dir.UP);
if (bR) myTank.setDir(Dir.RIGHT);
if (bD) myTank.setDir(Dir.DOWN);
}
}
}
}
2、Tank
package com.tencent.tank;
import java.awt.*;
public class Tank {
private int x,y;
private Dir dir;
private static final int SPEED = 5;
private boolean moving = false;
public Tank(int x,int y,Dir dir){
TankFrame tf = null;
public Tank(int x,int y,Dir dir,TankFrame tf){
this.x = x;
this.y = y;
this.dir = dir;
this.tf = tf;
}
public boolean isMoving() {
return moving;
}
public void setMoving(boolean moving) {
this.moving = moving;
}
public Dir getDir() {
return dir;
}
public void setDir(Dir dir) {
this.dir = dir;
}
public void paint(Graphics g){
Color c = g.getColor();
g.setColor(Color.BLUE);
g.fillRect(x,y,50,50);
g.setColor(c);
move();
}
public void move(){
if(!moving) return;
switch(dir){
case LEFT:
x -= SPEED;
break;
case UP:
y -= SPEED;
break;
case RIGHT:
x += SPEED;
break;
case DOWN:
y += SPEED;
break;
default:
break;
}
}
public void fire() {
tf.b = new Bullet(this.x,this.y,this.dir);
}
}
运行效果
package com.tencent.tank;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TankFrame extends Frame {
Tank myTank = new Tank(200,200,Dir.DOWN);
public TankFrame(){
setTitle("tank war");
setSize(800,600);
setResizable(false);
setVisible(true);
this.addKeyListener(new MyListener());
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
@Override
public void paint(Graphics g) {
myTank.paint(g);
}
class MyListener extends KeyAdapter{
boolean bL = false;
boolean bU = false;
boolean bR = false;
boolean bD = false;
@Override
public void keyPressed(KeyEvent e) {
myTank.setMoving(true);
int key = e.getKeyCode();
switch(key){
case KeyEvent.VK_LEFT:
@ -68,6 +70,7 @@ public class TankFrame extends Frame {
@Override
public void keyReleased(KeyEvent e) {
int key = e.getKeyCode();
switch(key){
case KeyEvent.VK_LEFT:
@ -94,9 +97,11 @@
if(bU) myTank.setDir(Dir.UP);
if(bR) myTank.setDir(Dir.RIGHT);
if(bD) myTank.setDir(Dir.DOWN);
if(!bL && !bU && !bR && !bD) myTank.setMoving(false);
}
}
}
2、Tank
package com.tencent.tank;
import java.awt.*;
public class Tank {
private int x,y;
private Dir dir;
private static final int SPEED = 10;
private boolean moving = false;
public Tank(int x,int y,Dir dir){
this.x = x;
this.y = y;
this.dir = dir;
}
public boolean isMoving() {
return moving;
}
public void setMoving(boolean moving) {
this.moving = moving;
}
public Dir getDir() {
return dir;
}
@ -29,24 +39,26 @@
}
public void move(){
if(!moving) return;
switch(dir){
case LEFT:
x -= SPEED;
break;
case UP:
y -= SPEED;
break;
case RIGHT:
x += SPEED;
break;
case DOWN:
y += SPEED;
break;
default:
break;
}
}
}
四、定义子弹类,设定属性和方法,new出一颗新的子弹,在屏幕上画出来
1、TankFrame
package com.tencent.tank;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TankFrame extends Frame {
Tank myTank = new Tank(200,200,Dir.DOWN);
Bullet b = new Bullet(300,300,Dir.DOWN);
public TankFrame(){
setTitle("tank war");
@ -20,7 +21,7 @@ public class TankFrame extends Frame {
setResizable(false);
setVisible(true);
this.addKeyListener(new MyListener());
this.addKeyListener(new MyKeyListener());
addWindowListener(new WindowAdapter() {
@Override
@ -34,10 +35,11 @@ public class TankFrame extends Frame {
public void paint(Graphics g) {
myTank.paint(g);
b.paint(g);
}
class MyListener extends KeyAdapter{
class MyKeyListener extends KeyAdapter{
boolean bL = false;
boolean bU = false;
@ -45,8 +47,6 @@ public class TankFrame extends Frame {
boolean bD = false;
@Override
public void keyPressed(KeyEvent e) {
myTank.setMoving(true);
int key = e.getKeyCode();
switch(key){
case KeyEvent.VK_LEFT:
@ -93,14 +93,20 @@ public class TankFrame extends Frame {
}
private void setMainTankDir() {
if(bL) myTank.setDir(Dir.LEFT);
if(bU) myTank.setDir(Dir.UP);
if(bR) myTank.setDir(Dir.RIGHT);
if(bD) myTank.setDir(Dir.DOWN);
if(!bL && !bU && !bR && !bD) myTank.setMoving(false);
else {
myTank.setMoving(true);
if (bL) myTank.setDir(Dir.LEFT);
if (bU) myTank.setDir(Dir.UP);
if (bR) myTank.setDir(Dir.RIGHT);
if (bD) myTank.setDir(Dir.DOWN);
}
}
}
}
2、Tank
package com.tencent.tank;
import java.awt.*;
public class Tank {
private int x,y;
private Dir dir;
private static final int SPEED = 10;
private static final int SPEED = 5;
private boolean moving = false;
public Tank(int x,int y,Dir dir){
this.x = x;
this.y = y;
this.dir = dir;
}
public boolean isMoving() {
return moving;
}
public void setMoving(boolean moving) {
this.moving = moving;
}
public Dir getDir() {
return dir;
}
public void setDir(Dir dir) {
this.dir = dir;
}
public void paint(Graphics g){
g.fillRect(x,y,50,50);
move();
}
public void move(){
if(!moving) return;
switch(dir){
case LEFT:
x -= SPEED;
break;
case UP:
y -= SPEED;
break;
case RIGHT:
x += SPEED;
break;
case DOWN:
y += SPEED;
break;
default:
break;
}
}
}
3、Bullet
package com.tencent.tank;
import java.awt.*;
public class Bullet {
private int x,y;
private static final int SPEED = 1;
private Dir dir;
static final int WIDTH = 30,HEIGHT = 30;
public Bullet(int x,int y,Dir dir){
this.x = x;
this.y = y;
this.dir = dir;
}
public void paint(Graphics g){
Color c = g.getColor();
g.setColor(Color.RED);
g.fillOval(x,y,WIDTH,HEIGHT);
g.setColor(c);
move();
}
public void move(){
switch(dir){
case LEFT:
x -= SPEED;
break;
case UP:
y -= SPEED;
break;
case RIGHT:
x += SPEED;
break;
case DOWN:
y += SPEED;
break;
default:
break;
}
}
五、按下space键,tank会火出一颗子弹,必须持有tankFrame的引用,把子弹传递给窗口,画出来
1、TankFrame
package com.tencent.tank;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TankFrame extends Frame {
Tank myTank = new Tank(200,200,Dir.DOWN);
Tank myTank = new Tank(200,200,Dir.DOWN,this);
Bullet b = new Bullet(300,300,Dir.DOWN);
static final int GAME_WIDTH = 800,GAME_HEIGHT = 600;
public TankFrame(){
setTitle("tank war");
setSize(GAME_WIDTH,GAME_HEIGHT);
setResizable(false);
setVisible(true);
this.addKeyListener(new MyKeyListener());
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
Image offScreenImage = null;
@Override
public void update(Graphics g) {
if (offScreenImage == null) {
offScreenImage = this.createImage(GAME_WIDTH, GAME_HEIGHT);
}
Graphics gOffScreen = offScreenImage.getGraphics();
Color c = gOffScreen.getColor();
gOffScreen.setColor(Color.BLACK);
gOffScreen.fillRect(0, 0, GAME_WIDTH, GAME_HEIGHT);
gOffScreen.setColor(c);
paint(gOffScreen);
g.drawImage(offScreenImage, 0, 0, null);
}
@Override
public void paint(Graphics g) {
myTank.paint(g);
b.paint(g);
}
class MyKeyListener extends KeyAdapter{
boolean bL = false;
boolean bU = false;
boolean bR = false;
boolean bD = false;
@Override
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
switch(key){
case KeyEvent.VK_LEFT:
bL = true;
break;
case KeyEvent.VK_UP:
bU = true;
break;
case KeyEvent.VK_RIGHT:
bR = true;
break;
case KeyEvent.VK_DOWN:
bD = true;
break;
case KeyEvent.VK_SPACE:
myTank.fire();
break;
default:
break;
}
setMainTankDir();
}
@Override
public void keyReleased(KeyEvent e) {
int key = e.getKeyCode();
switch(key){
case KeyEvent.VK_LEFT:
bL = false;
break;
case KeyEvent.VK_UP:
bU = false;
break;
case KeyEvent.VK_RIGHT:
bR = false;
break;
case KeyEvent.VK_DOWN:
bD = false;
break;
default:
break;
}
setMainTankDir();
}
private void setMainTankDir() {
if(!bL && !bU && !bR && !bD) myTank.setMoving(false);
else {
myTank.setMoving(true);
if (bL) myTank.setDir(Dir.LEFT);
if (bU) myTank.setDir(Dir.UP);
if (bR) myTank.setDir(Dir.RIGHT);
if (bD) myTank.setDir(Dir.DOWN);
}
}
}
}
2、Tank
package com.tencent.tank;
import java.awt.*;
public class Tank {
private int x,y;
private Dir dir;
private static final int SPEED = 5;
private boolean moving = false;
public Tank(int x,int y,Dir dir){
TankFrame tf = null;
public Tank(int x,int y,Dir dir,TankFrame tf){
this.x = x;
this.y = y;
this.dir = dir;
this.tf = tf;
}
public boolean isMoving() {
return moving;
}
public void setMoving(boolean moving) {
this.moving = moving;
}
public Dir getDir() {
return dir;
}
public void setDir(Dir dir) {
this.dir = dir;
}
public void paint(Graphics g){
Color c = g.getColor();
g.setColor(Color.BLUE);
g.fillRect(x,y,50,50);
g.setColor(c);
move();
}
public void move(){
if(!moving) return;
switch(dir){
case LEFT:
x -= SPEED;
break;
case UP:
y -= SPEED;
break;
case RIGHT:
x += SPEED;
break;
case DOWN:
y += SPEED;
break;
default:
break;
}
}
public void fire() {
tf.b = new Bullet(this.x,this.y,this.dir);
}
}
运行效果
package com.tencent.tank;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TankFrame extends Frame {
Tank myTank = new Tank(200,200,Dir.DOWN);
Bullet b = new Bullet(300,300,Dir.DOWN);
public TankFrame(){
setTitle("tank war");
@ -20,7 +21,7 @@ public class TankFrame extends Frame {
setResizable(false);
setVisible(true);
this.addKeyListener(new MyListener());
this.addKeyListener(new MyKeyListener());
addWindowListener(new WindowAdapter() {
@Override
@ -34,10 +35,11 @@ public class TankFrame extends Frame {
public void paint(Graphics g) {
myTank.paint(g);
b.paint(g);
}
class MyListener extends KeyAdapter{
class MyKeyListener extends KeyAdapter{
boolean bL = false;
boolean bU = false;
@ -45,8 +47,6 @@ public class TankFrame extends Frame {
boolean bD = false;
@Override
public void keyPressed(KeyEvent e) {
myTank.setMoving(true);
int key = e.getKeyCode();
switch(key){
case KeyEvent.VK_LEFT:
@ -93,14 +93,20 @@ public class TankFrame extends Frame {
}
private void setMainTankDir() {
if(bL) myTank.setDir(Dir.LEFT);
if(bU) myTank.setDir(Dir.UP);
if(bR) myTank.setDir(Dir.RIGHT);
if(bD) myTank.setDir(Dir.DOWN);
if(!bL && !bU && !bR && !bD) myTank.setMoving(false);
else {
myTank.setMoving(true);
if (bL) myTank.setDir(Dir.LEFT);
if (bU) myTank.setDir(Dir.UP);
if (bR) myTank.setDir(Dir.RIGHT);
if (bD) myTank.setDir(Dir.DOWN);
}
}
}
}
2、Tank
package com.tencent.tank;
import java.awt.*;
public class Tank {
private int x,y;
private Dir dir;
private static final int SPEED = 10;
private static final int SPEED = 5;
private boolean moving = false;
public Tank(int x,int y,Dir dir){
this.x = x;
this.y = y;
this.dir = dir;
}
public boolean isMoving() {
return moving;
}
public void setMoving(boolean moving) {
this.moving = moving;
}
public Dir getDir() {
return dir;
}
public void setDir(Dir dir) {
this.dir = dir;
}
public void paint(Graphics g){
g.fillRect(x,y,50,50);
move();
}
public void move(){
if(!moving) return;
switch(dir){
case LEFT:
x -= SPEED;
break;
case UP:
y -= SPEED;
break;
case RIGHT:
x += SPEED;
break;
case DOWN:
y += SPEED;
break;
default:
break;
}
}
}
3、Bullet
package com.tencent.tank;
import java.awt.*;
public class Bullet {
private int x,y;
private static final int SPEED = 1;
private Dir dir;
static final int WIDTH = 30,HEIGHT = 30;
public Bullet(int x,int y,Dir dir){
this.x = x;
this.y = y;
this.dir = dir;
}
public void paint(Graphics g){
Color c = g.getColor();
g.setColor(Color.RED);
g.fillOval(x,y,WIDTH,HEIGHT);
g.setColor(c);
move();
}
public void move(){
switch(dir){
case LEFT:
x -= SPEED;
break;
case UP:
y -= SPEED;
break;
case RIGHT:
x += SPEED;
break;
case DOWN:
y += SPEED;
break;
default:
break;
}
}
五、按下space键,tank会火出一颗子弹,必须持有tankFrame的引用,把子弹传递给窗口,画出来
1、TankFrame
package com.tencent.tank;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TankFrame extends Frame {
Tank myTank = new Tank(200,200,Dir.DOWN);
Tank myTank = new Tank(200,200,Dir.DOWN,this);
Bullet b = new Bullet(300,300,Dir.DOWN);
static final int GAME_WIDTH = 800,GAME_HEIGHT = 600;
public TankFrame(){
setTitle("tank war");
setSize(GAME_WIDTH,GAME_HEIGHT);
setResizable(false);
setVisible(true);
this.addKeyListener(new MyKeyListener());
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
Image offScreenImage = null;
@Override
public void update(Graphics g) {
if (offScreenImage == null) {
offScreenImage = this.createImage(GAME_WIDTH, GAME_HEIGHT);
}
Graphics gOffScreen = offScreenImage.getGraphics();
Color c = gOffScreen.getColor();
gOffScreen.setColor(Color.BLACK);
gOffScreen.fillRect(0, 0, GAME_WIDTH, GAME_HEIGHT);
gOffScreen.setColor(c);
paint(gOffScreen);
g.drawImage(offScreenImage, 0, 0, null);
}
@Override
public void paint(Graphics g) {
myTank.paint(g);
b.paint(g);
}
class MyKeyListener extends KeyAdapter{
boolean bL = false;
boolean bU = false;
boolean bR = false;
boolean bD = false;
@Override
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
switch(key){
case KeyEvent.VK_LEFT:
bL = true;
break;
case KeyEvent.VK_UP:
bU = true;
break;
case KeyEvent.VK_RIGHT:
bR = true;
break;
case KeyEvent.VK_DOWN:
bD = true;
break;
case KeyEvent.VK_SPACE:
myTank.fire();
break;
default:
break;
}
setMainTankDir();
}
@Override
public void keyReleased(KeyEvent e) {
int key = e.getKeyCode();
switch(key){
case KeyEvent.VK_LEFT:
bL = false;
break;
case KeyEvent.VK_UP:
bU = false;
break;
case KeyEvent.VK_RIGHT:
bR = false;
break;
case KeyEvent.VK_DOWN:
bD = false;
break;
default:
break;
}
setMainTankDir();
}
private void setMainTankDir() {
if(!bL && !bU && !bR && !bD) myTank.setMoving(false);
else {
myTank.setMoving(true);
if (bL) myTank.setDir(Dir.LEFT);
if (bU) myTank.setDir(Dir.UP);
if (bR) myTank.setDir(Dir.RIGHT);
if (bD) myTank.setDir(Dir.DOWN);
}
}
}
}
2、Tank
package com.tencent.tank;
import java.awt.*;
public class Tank {
private int x,y;
private Dir dir;
private static final int SPEED = 5;
private boolean moving = false;
public Tank(int x,int y,Dir dir){
TankFrame tf = null;
public Tank(int x,int y,Dir dir,TankFrame tf){
this.x = x;
this.y = y;
this.dir = dir;
this.tf = tf;
}
public boolean isMoving() {
return moving;
}
public void setMoving(boolean moving) {
this.moving = moving;
}
public Dir getDir() {
return dir;
}
public void setDir(Dir dir) {
this.dir = dir;
}
public void paint(Graphics g){
Color c = g.getColor();
g.setColor(Color.BLUE);
g.fillRect(x,y,50,50);
g.setColor(c);
move();
}
public void move(){
if(!moving) return;
switch(dir){
case LEFT:
x -= SPEED;
break;
case UP:
y -= SPEED;
break;
case RIGHT:
x += SPEED;
break;
case DOWN:
y += SPEED;
break;
default:
break;
}
}
public void fire() {
tf.b = new Bullet(this.x,this.y,this.dir);
}
}
运行效果
package com.tencent.tank;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TankFrame extends Frame {
Tank myTank = new Tank(200,200,Dir.DOWN);
Tank myTank = new Tank(200,200,Dir.DOWN,this);
Bullet b = new Bullet(300,300,Dir.DOWN);
static final int GAME_WIDTH = 800,GAME_HEIGHT = 600;
public TankFrame(){
setTitle("tank war");
setSize(GAME_WIDTH,GAME_HEIGHT);
setResizable(false);
setVisible(true);
this.addKeyListener(new MyKeyListener());
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
Image offScreenImage = null;
@Override
public void update(Graphics g) {
if (offScreenImage == null) {
offScreenImage = this.createImage(GAME_WIDTH, GAME_HEIGHT);
}
Graphics gOffScreen = offScreenImage.getGraphics();
Color c = gOffScreen.getColor();
gOffScreen.setColor(Color.BLACK);
gOffScreen.fillRect(0, 0, GAME_WIDTH, GAME_HEIGHT);
gOffScreen.setColor(c);
paint(gOffScreen);
g.drawImage(offScreenImage, 0, 0, null);
}
@Override
public void paint(Graphics g) {
myTank.paint(g);
b.paint(g);
}
class MyKeyListener extends KeyAdapter{
boolean bL = false;
boolean bU = false;
boolean bR = false;
boolean bD = false;
@Override
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
switch(key){
case KeyEvent.VK_LEFT:
bL = true;
break;
case KeyEvent.VK_UP:
bU = true;
break;
case KeyEvent.VK_RIGHT:
bR = true;
break;
case KeyEvent.VK_DOWN:
bD = true;
break;
case KeyEvent.VK_SPACE:
myTank.fire();
break;
default:
break;
}
setMainTankDir();
}
@Override
public void keyReleased(KeyEvent e) {
int key = e.getKeyCode();
switch(key){
case KeyEvent.VK_LEFT:
bL = false;
break;
case KeyEvent.VK_UP:
bU = false;
break;
case KeyEvent.VK_RIGHT:
bR = false;
break;
case KeyEvent.VK_DOWN:
bD = false;
break;
default:
break;
}
setMainTankDir();
}
private void setMainTankDir() {
if(!bL && !bU && !bR && !bD) myTank.setMoving(false);
else {
myTank.setMoving(true);
if (bL) myTank.setDir(Dir.LEFT);
if (bU) myTank.setDir(Dir.UP);
if (bR) myTank.setDir(Dir.RIGHT);
if (bD) myTank.setDir(Dir.DOWN);
}
}
}
}
2、Tank
package com.tencent.tank;
import java.awt.*;
public class Tank {
private int x,y;
private Dir dir;
private static final int SPEED = 5;
private boolean moving = false;
public Tank(int x,int y,Dir dir){
TankFrame tf = null;
public Tank(int x,int y,Dir dir,TankFrame tf){
this.x = x;
this.y = y;
this.dir = dir;
this.tf = tf;
}
public boolean isMoving() {
return moving;
}
public void setMoving(boolean moving) {
this.moving = moving;
}
public Dir getDir() {
return dir;
}
public void setDir(Dir dir) {
this.dir = dir;
}
public void paint(Graphics g){
Color c = g.getColor();
g.setColor(Color.BLUE);
g.fillRect(x,y,50,50);
g.setColor(c);
move();
}
public void move(){
if(!moving) return;
switch(dir){
case LEFT:
x -= SPEED;
break;
case UP:
y -= SPEED;
break;
case RIGHT:
x += SPEED;
break;
case DOWN:
y += SPEED;
break;
default:
break;
}
}
public void fire() {
tf.b = new Bullet(this.x,this.y,this.dir);
}
}
运行效果



