飞机大战
面向对象思想重构飞机类
package feiji;
import java. awt. *;
public class plane extends GameObject {
@Override
public void drawMyself ( Graphics g) {
super . drawMyself ( g) ;
x+= speed;
}
public plane ( Image img, double x, double y, int speed, int width, int height) {
super ( img, x, y, speed, width, height) ;
}
}
package feiji;
import java. awt. *;
public class GameObject {
Image img;
double x, y;
int speed;
int width, height;
public GameObject ( Image img, double x, double y, int speed, int width, int height) {
this . img = img;
this . x= x;
this . y= y;
this . speed= speed;
this . width= width;
this . height= height;
}
public GameObject ( Image img, double x, double y, int speed) {
this . img = img;
this . x= x;
this . y= y;
this . speed= speed;
this . width= img. getWidth ( null) ;
this . height= img. getHeight ( null) ;
}
public GameObject ( ) {
}
public void drawMyself ( Graphics g) {
g. drawImage ( img, ( int ) x, ( int ) y, width, height, null) ;
}
public Rectangle getRec ( ) {
return new Rectangle ( ( int ) x, ( int ) y, width, height) ;
}
}
键盘控制游戏物体运动
package feiji;
import java. awt. *;
import java. lang. *;
import java. awt. event. *;
public class MyGame extends Frame {
Image planeImg= Gameu. getImage ( "images/feiji.png" ) ;
Image bg= Gameu. getImage ( "images/bj.png" ) ;
plane p1= new plane ( planeImg, 100 , 100 , 3 , 50 , 50 ) ;
boolean left, right, up, down;
@Override
public void paint ( Graphics g) {
g. drawImage ( bg, 0 , 0 , 500 , 500 , null) ;
p1. drawMyself ( g) ;
if ( left) {
p1. x-= p1. speed;
}
if ( right) {
p1. x+= p1. speed;
}
if ( up) {
p1. y-= p1. speed;
}
if ( down) {
p1. y+= p1. speed;
}
}
public void launchFrame ( ) {
this . setTitle ( "飞机大战" ) ;
setVisible ( true ) ;
setSize ( Constant. GAME_WIDTH, Constant. GAME_HEIGH) ;
setLocation ( 100 , 100 ) ;
this . addWindowListener ( new WindowAdapter ( ) {
@Override
public void windowClosing ( WindowEvent e) {
System. exit ( 0 ) ;
}
} ) ;
new PaintThread ( ) . start ( ) ;
this . addKeyListener ( new KeyMonitor ( ) ) ;
}
class PaintThread extends Thread {
@Override
public void run ( ) {
while ( true ) {
repaint ( ) ;
try {
Thread. sleep ( 50 ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
}
}
}
class KeyMonitor extends KeyAdapter {
@Override
public void keyPressed ( KeyEvent e) {
System. out. println ( "按下:" + e. getKeyCode ( ) ) ;
if ( e. getKeyCode ( ) == KeyEvent. VK_LEFT) {
left= true ;
}
if ( e. getKeyCode ( ) == KeyEvent. VK_RIGHT) {
right= true ;
}
if ( e. getKeyCode ( ) == KeyEvent. VK_UP) {
up= true ;
}
if ( e. getKeyCode ( ) == KeyEvent. VK_DOWN) {
down= true ;
}
}
@Override
public void keyReleased ( KeyEvent e) {
System. out. println ( "抬起:" + e. getKeyCode ( ) ) ;
if ( e. getKeyCode ( ) == KeyEvent. VK_LEFT) {
left= false ;
}
if ( e. getKeyCode ( ) == KeyEvent. VK_RIGHT) {
right= false ;
}
if ( e. getKeyCode ( ) == KeyEvent. VK_UP) {
up= false ;
}
if ( e. getKeyCode ( ) == KeyEvent. VK_DOWN) {
down= false ;
}
}
}
public static void main ( String[ ] args) {
MyGame game= new MyGame ( ) ;
game. launchFrame ( ) ;
}
private Image offScreanImage= null;
public void update ( Graphics g) {
if ( offScreanImage== null)
offScreanImage= this . createImage ( Constant. GAME_WIDTH, Constant. GAME_HEIGH) ;
Graphics goff= offScreanImage. getGraphics ( ) ;
paint ( goff) ;
g. drawImage ( offScreanImage, 0 , 0 , null) ;
}
}
面向对象思想重构飞机类的键盘移动
package feiji;
import java. awt. *;
import java. awt. event. KeyEvent;
public class plane extends GameObject {
boolean left, right, up, down;
@Override
public void drawMyself ( Graphics g) {
super . drawMyself ( g) ;
if ( left) {
x-= speed;
}
if ( right) {
x+= speed;
}
if ( up) {
y-= speed;
}
if ( down) {
y+= speed;
}
}
public void addDiretion ( KeyEvent e) {
if ( e. getKeyCode ( ) == KeyEvent. VK_LEFT) {
left= true ;
}
if ( e. getKeyCode ( ) == KeyEvent. VK_RIGHT) {
right= true ;
}
if ( e. getKeyCode ( ) == KeyEvent. VK_UP) {
up= true ;
}
if ( e. getKeyCode ( ) == KeyEvent. VK_DOWN) {
down= true ;
}
}
public void minusDirection ( KeyEvent e) {
if ( e. getKeyCode ( ) == KeyEvent. VK_LEFT) {
left= false ;
}
if ( e. getKeyCode ( ) == KeyEvent. VK_RIGHT) {
right= false ;
}
if ( e. getKeyCode ( ) == KeyEvent. VK_UP) {
up= false ;
}
if ( e. getKeyCode ( ) == KeyEvent. VK_DOWN) {
down= false ;
}
}
public plane ( Image img, double x, double y, int speed, int width, int height) {
super ( img, x, y, speed, width, height) ;
}
}
炮弹类的设计
package feiji;
import java. awt. *;
public class shell extends GameObject {
double dagree;
public shell ( ) {
x= 200 ;
y= 200 ;
dagree= Math. random ( ) * Math. PI* 2 ;
width= 10 ;
height= 10 ;
speed= 7 ;
}
@Override
public void drawMyself ( Graphics g) {
Color c= g. getColor ( ) ;
g. setColor ( Color. red) ;
g. fillOval ( ( int ) x, ( int ) y, width, height) ;
g. setColor ( c) ;
x+= speed* Math. cos ( dagree) ;
y+= speed* Math. sin ( dagree) ;
if ( y> Constant. GAME_HEIGH- this . height|| y< 40 ) {
dagree= - dagree;
}
if ( x< 0 || x> Constant. GAME_WIDTH- this . width) {
dagree= Math. PI- dagree;
}
}
}
容器或数组产生多发炮弹
shell[ ] s1= new shell [ 50 ] ;
for ( int i= 0 ; i< 50 ; i++ ) {
s1[ i] . drawMyself ( g) ;
for ( int i= 0 ; i< 50 ; i++ ) {
s1[ i] = new shell ( ) ;
}
飞机和炮弹碰撞实现
for ( int i= 0 ; i< s1. length; i++ ) {
s1[ i] . drawMyself ( g) ;
boolean peng = s1[ i] . getRec ( ) . intersects ( p1. getRec ( ) ) ;
if ( peng) {
p1. live= false ;
}
}
boolean live= true ;
@Override
public void drawMyself ( Graphics g) {
if ( live) {
super . drawMyself ( g) ;
if ( left) {
x-= speed;
}
if ( right) {
x+= speed;
}
if ( up) {
y-= speed;
}
if ( down) {
y+= speed;
}
}
}
爆炸类图片的实现
package feiji;
import java. awt. *;
public class Explode {
double x, y;
static Image[ ] imgs= new Image [ 3 ] ;
int count;
static {
for ( int i= 0 ; i< 3 ; i++ ) {
imgs[ i] = Gameu. getImage ( "images/explode/" + ( i+ 1 ) + ".png" ) ;
}
}
public void drawMyself ( Graphics g) {
if ( count< 3 ) {
g. drawImage ( imgs[ count] , ( int ) x, ( int ) y, null) ;
count++ ;
}
}
public Explode ( ) {
}
public Explode ( double x, double y) {
this . x= x;
this . y= y;
}
}
程序计时功能
package feiji;
import java. awt. *;
import java. lang. *;
import java. awt. event. *;
import java. util. Date;
public class MyGame extends Frame {
Image planeImg= Gameu. getImage ( "images/feiji.png" ) ;
Image bg= Gameu. getImage ( "images/bj.png" ) ;
plane p1= new plane ( planeImg, 100 , 100 , 7 , 70 , 70 ) ;
shell[ ] s1= new shell [ 3 ] ;
Explode explode;
Date start= new Date ( ) ;
Date end;
long period= 0 ;
@Override
public void paint ( Graphics g) {
g. drawImage ( bg, 0 , 0 , 500 , 500 , null) ;
g. setColor ( Color. black) ;
if ( p1. live) {
period= ( System. currentTimeMillis ( ) - start. getTime ( ) ) / 1000 ;
g. drawString ( "坚持:" + period, 10 , 70 ) ;
} else {
if ( end== null) {
end= new Date ( ) ;
period= ( end. getTime ( ) - start. getTime ( ) ) / 1000 ;
}
g. setFont ( new Font ( "微软雅黑" , Font. BOLD, 30 ) ) ;
g. drawString ( "最终时间:" + period, 150 , 250 ) ;
}
p1. drawMyself ( g) ;
for ( int i = 0 ; i < s1. length; i++ ) {
s1[ i] . drawMyself ( g) ;
boolean peng = s1[ i] . getRec ( ) . intersects ( p1. getRec ( ) ) ;
if ( peng) {
p1. live = false ;
if ( explode == null) {
explode = new Explode ( p1. x, p1. y) ;
}
explode. drawMyself ( g) ;
}
}
}
public void launchFrame ( ) {
this . setTitle ( "飞机大战" ) ;
setVisible ( true ) ;
setSize ( Constant. GAME_WIDTH, Constant. GAME_HEIGH) ;
setLocation ( 100 , 100 ) ;
this . addWindowListener ( new WindowAdapter ( ) {
@Override
public void windowClosing ( WindowEvent e) {
System. exit ( 0 ) ;
}
} ) ;
new PaintThread ( ) . start ( ) ;
this . addKeyListener ( new KeyMonitor ( ) ) ;
for ( int i= 0 ; i< s1. length; i++ ) {
s1[ i] = new shell ( ) ;
}
}
class PaintThread extends Thread {
@Override
public void run ( ) {
while ( true ) {
repaint ( ) ;
try {
Thread. sleep ( 50 ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
}
}
}
class KeyMonitor extends KeyAdapter {
@Override
public void keyPressed ( KeyEvent e) {
System. out. println ( "按下:" + e. getKeyCode ( ) ) ;
p1. addDiretion ( e) ;
}
@Override
public void keyReleased ( KeyEvent e) {
System. out. println ( "抬起:" + e. getKeyCode ( ) ) ;
p1. minusDirection ( e) ;
}
}
public static void main ( String[ ] args) {
MyGame game= new MyGame ( ) ;
game. launchFrame ( ) ;
}
private Image offScreanImage= null;
public void update ( Graphics g) {
if ( offScreanImage== null)
offScreanImage= this . createImage ( Constant. GAME_WIDTH, Constant. GAME_HEIGH) ;
Graphics goff= offScreanImage. getGraphics ( ) ;
paint ( goff) ;
g. drawImage ( offScreanImage, 0 , 0 , null) ;
}
}