第90集:飞机游戏——键盘控制八个方向的运行算法
本集知识点
设置一个boolean变量用于判断方向。
package com.test088_097;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import com.test084_087_util.GameUtil;
import com.test084_087_util.MyFrame;
public class PlaneGameFrame extends MyFrame {
Image bg = GameUtil.getImage("images/bg.jpg");
Plane p = new Plane("images/plane.png",50,50);
public void paint(Graphics g){
g.drawImage(bg,0,0,null);
p.draw(g);
}
public static void main(String[] args){
new PlaneGameFrame().launchFrame();
}
public void launchFrame(){
super.launchFrame();
addKeyListener(new KeyMonitor());
}
//定义为内部类,方便的使用外部类的普通属性
class KeyMonitor extends KeyAdapter{//这个类需要在launchFrame里注册一下才能用
public void keyPressed(KeyEvent e){
System.out.println("按下:"+e.getKeyCode());
p.addDirection(e);
}
public void keyReleased(KeyEvent e){
System.out.println("释放:"+e.getKeyCode());
p.minusDirection(e);
}
}
}
package com.test088_097;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import com.test084_087_util.GameUtil;
public class Plane {
Image img;
double x,y;
int speed = 10;
boolean left,up,right,down;
public void draw(Graphics g){
g.drawImage(img,(int)x,(int)y,null);
}
public Plane(String imgpath, double x, double y) {
super();
this.img = GameUtil.getImage(imgpath);
this.x = x;
this.y = y;
}
public void move(){
if(left){
x -= speed;
}
if(right){
x += speed;
}
if(up){
y -= speed;
}
if(down){
y += speed;
}
}
public void addDirection(KeyEvent e){
switch(e.getKeyCode()){
case KeyEvent.VK_LEFT:
left = true;
break;
case KeyEvent.VK_UP:
up = true;
break;
case KeyEvent.VK_RIGHT:
right = true;
break;
case KeyEvent.VK_DOWN:
down = true;
break;
default:
break;
}
move();
}
public void minusDirection(KeyEvent e){
switch(e.getKeyCode()){
case KeyEvent.VK_LEFT:
left = false;
break;
case KeyEvent.VK_UP:
up = false;
break;
case KeyEvent.VK_RIGHT:
right = false;
break;
case KeyEvent.VK_DOWN:
down = false;
break;
default:
break;
}
move();
}
}
第91集:飞机游戏——子弹类定义、将子弹加入容器中、子弹类飞行规则
本集知识点
子弹应先在窗口加载时生成(用launchFrame()),然后再画出来(paint(Graphics g))
package com.test088_097;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import com.test084_087_util.GameUtil;
import com.test084_087_util.MyFrame;
public class PlaneGameFrame extends MyFrame {
Image bg = GameUtil.getImage("images/bg.jpg");
Plane p = new Plane("images/plane.png",50,50);
ArrayList bulletList = new ArrayList();
public void paint(Graphics g){
g.drawImage(bg,0,0,null);
p.draw(g);
for(int i=0;i<bulletList.size();i++){
Bullet b = (Bullet)bulletList.get(i);
b.draw(g);
}
}
public static void main(String[] args){
new PlaneGameFrame().launchFrame();
}
public void launchFrame(){
super.launchFrame();
addKeyListener(new KeyMonitor());
//生成一堆子弹
for(int i=0;i<50;i++){
Bullet b = new Bullet();
bulletList.add(b);
}
}
//定义为内部类,方便的使用外部类的普通属性
class KeyMonitor extends KeyAdapter{//这个类需要在launchFrame里注册一下才能用
public void keyPressed(KeyEvent e){
System.out.println("按下:"+e.getKeyCode());
p.addDirection(e);
}
public void keyReleased(KeyEvent e){
System.out.println("释放:"+e.getKeyCode());
p.minusDirection(e);
}
}
}
package com.test088_097;
import java.awt.Color;
import java.awt.Graphics;
import com.test084_087_util.Constant;
public class Bullet {
double x,y;
int speed=3;
double degree;
int width = 10;
int height = 10;
public Bullet(){
degree = Math.random()*Math.PI*2;
x = Constant.GAME_WIDTH/2;
y = Constant.GAME_HEIGHT/2;
}
public void draw(Graphics g){
Color c = g.getColor();
g.setColor(Color.yellow);
g.fillOval((int)x,(int)y,width,height);
x += speed*Math.cos(degree);
y += speed*Math.sin(degree);
if(y>Constant.GAME_HEIGHT-width||y<30){
degree = -degree;
}
if(x<0||x>Constant.GAME_WIDTH-width){
degree = Math.PI-degree;
}
g.setColor(c);
}
}
第92集:飞机游戏——碰撞检测、双缓冲技术解决屏幕闪烁
本集知识点
-
游戏开发中,碰撞检测基于矩形进行检测。其原理是检测矩形四个顶点坐标是否在另一个矩形里面。
package com.test088_097; import java.awt.Graphics; import java.awt.Image; import java.awt.Rectangle; import java.awt.event.KeyEvent; import com.test084_087_util.GameUtil; public class Plane { Image img; double x,y; int speed = 10; boolean left,up,right,down; int width,height; public Rectangle getRect(){ //获得飞机所在矩形 return new Rectangle((int)x,(int)y,width,height); } public void draw(Graphics g){ g.drawImage(img,(int)x,(int)y,null); } public Plane(String imgpath, double x, double y) { super(); this.img = GameUtil.getImage(imgpath); this.width = img.getWidth(null); this.height = img.getHeight(null); this.x = x; this.y = y; } public void move(){ if(left){ x -= speed; } if(right){ x += speed; } if(up){ y -= speed; } if(down){ y += speed; } } public void addDirection(KeyEvent e){ switch(e.getKeyCode()){ case KeyEvent.VK_LEFT: left = true; break; case KeyEvent.VK_UP: up = true; break; case KeyEvent.VK_RIGHT: right = true; break; case KeyEvent.VK_DOWN: down = true; break; default: break; } move(); } public void minusDirection(KeyEvent e){ switch(e.getKeyCode()){ case KeyEvent.VK_LEFT: left = false; break; case KeyEvent.VK_UP: up = false; break; case KeyEvent.VK_RIGHT: right = false; break; case KeyEvent.VK_DOWN: down = false; break; default: break; } move(); } }
package com.test088_097; import java.awt.Color; import java.awt.Graphics; import java.awt.Rectangle; import com.test084_087_util.Constant; public class Bullet { double x,y; int speed=3; double degree; int width = 10; int height = 10; public Bullet(){ degree = Math.random()*Math.PI*2; x = Constant.GAME_WIDTH/2; y = Constant.GAME_HEIGHT/2; } public void draw(Graphics g){ Color c = g.getColor(); g.setColor(Color.yellow); g.fillOval((int)x,(int)y,width,height); x += speed*Math.cos(degree); y += speed*Math.sin(degree); if(y>Constant.GAME_HEIGHT-width||y<30){ degree = -degree; } if(x<0||x>Constant.GAME_WIDTH-width){ degree = Math.PI-degree; } g.setColor(c); } public Rectangle getRect(){ //获得子弹所在矩形 return new Rectangle((int)x,(int)y,width,height); } }
package com.test088_097; import java.awt.Graphics; import java.awt.Image; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.util.ArrayList; import com.test084_087_util.GameUtil; import com.test084_087_util.MyFrame; public class PlaneGameFrame extends MyFrame { Image bg = GameUtil.getImage("images/bg.jpg"); Plane p = new Plane("images/plane.png",50,50); ArrayList bulletList = new ArrayList(); public void paint(Graphics g){ g.drawImage(bg,0,0,null); p.draw(g); for(int i=0;i<bulletList.size();i++){ Bullet b = (Bullet)bulletList.get(i); b.draw(g); //检测跟飞机的碰撞 boolean peng = b.getRect().intersects(p.getRect()); if(peng){ System.out.println("##############peng"); } } } public static void main(String[] args){ new PlaneGameFrame().launchFrame(); } public void launchFrame(){ super.launchFrame(); addKeyListener(new KeyMonitor()); //生成一堆子弹 for(int i=0;i<50;i++){ Bullet b = new Bullet(); bulletList.add(b); } } //定义为内部类,方便的使用外部类的普通属性 class KeyMonitor extends KeyAdapter{//这个类需要在launchFrame里注册一下才能用 public void keyPressed(KeyEvent e){ System.out.println("按下:"+e.getKeyCode()); p.addDirection(e); } public void keyReleased(KeyEvent e){ System.out.println("释放:"+e.getKeyCode()); p.minusDirection(e); } } }
-
swing自动加双缓冲,AWT没有。
//利用双缓冲技术消除闪烁 private Image offScreenImage = null; public void update(Graphics g){ if(offScreenImage == null){ offScreenImage = this.createImage(Constant.GAME_WIDTH,Constant.GAME_HEIGHT); } Graphics gOff = offScreenImage.getGraphics(); paint(gOff); g.drawImage(offScreenImage, 0, 0, null); }