import java.awt.Graphics;
import java.awt.Image;
/*
* 爆炸类
*/
public class Explode {
//位置
double x,y;
//将一些只需要进行一次的初始化操作都放在static代码块中进行
static Image[] imgs=new Image[14];
int count=0;
static {
for(int i=1; i<15;i++) {
imgs[i]=GameUtil.getImage("images/explode/"+ i +".gif");
imgs[i].getWidth(null); //解决懒加载问题,目前没有问题,加和不加都行
}
}
//画爆炸图
public void drawMyself(Graphics g) {
if(count<14) {
g.drawImage(imgs[count], (int)x, (int)y, null);
count++;
}
}
//构造方法
public Explode() {
}
//构造方法
public Explode(double x, double y) {
this.x=x;
this.y=y;
}
}
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Date;
import javax.swing.JFrame;
public class MyGameFrame extends JFrame{
//两张图片
Image planeImg=GameUtil.getImage("images/plane.jpg");
Image background=GameUtil.getImage("images/background.jpg");
//飞机类对象p1,飞机图片,坐标,速度
Plane p1=new Plane(planeImg,100,100,7);
//炮弹数组
Shell[] shells=new Shell[50];
//爆炸
Explode explode;
//游戏开始时间
Date start=new Date();
//游戏结束时间(飞机死的那一刻)
Date end;
//玩了多少秒
long period=0;
//画背景,画飞机
public void paint(Graphics g) {
//画背景
g.drawImage(background,0,0,500,500,null);
//画时间
drawTime(g);
//画飞机
p1.drawMyself(g);
//画炮弹
for(int i=0;i<shells.length;i++) {
shells[i].drawMyself(g);
//碰撞检查,将所有的炮弹和飞机进行检测,判断有没有碰撞
boolean peng=shells[i].getRec().intersects(p1.getRec());
if(peng) {
System.out.println("飞机被击中了!");
p1.live=false;
//处理爆炸效果
if(explode==null) {
explode=new Explode(p1.x, p1.y);
}
explode.drawMyself(g);
}
}
}
//画时间
public void drawTime(Graphics g) {
Color c=g.getColor();
Font f=g.getFont();
g.setColor(Color.green);
if(p1.live) {
period=(System.currentTimeMillis()-start.getTime())/1000;
g.drawString("坚持:"+period, 30, 50);
}else {
if(end==null) {
end=new Date();
period=(end.getTime()-start.getTime())/1000;
}
g.setColor(Color.red);
g.setFont(new Font("微软雅黑",Font.BOLD,30));
g.drawString("最终时间:"+period, 200, 200);
}
g.setColor(c);
g.setFont(f);
}
//初始化窗口
public void launchFrame() {
//在游戏窗口打印标题
setTitle("飞机大战");
//窗口默认不可见,设为可见
setVisible(true);
//窗口大小:宽500,高500
setSize(Constant.GAME_WIDTH,Constant.GAME_HEIGHT);
//窗口左上角顶点的坐标位置
setLocation(400,400);
//增加关闭窗口监听,这样用户点击右上角关闭图标可以关闭游戏程序
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
//启动重画窗口的线程
new PaintThread().start();
//启动键盘监听
this.addKeyListener(new KeyMonitor());
//初始化创建50个炮弹对象
for(int i=0;i<shells.length;i++) {
shells[i]=new Shell();
}
}
/*
* 定义了一个重画窗口的线程类
* 定义内部成员类是为了方便直接使用窗口类的相关方法
*/
class PaintThread extends Thread{
public void run() {
while(true) {
repaint();
//内部类可以直接使用外部类成员
try {
Thread.sleep(50); //1s=1000ms,1s画20次(20*50=1000)
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//内部类,实现键盘的监听处理
class KeyMonitor extends KeyAdapter{
//按下键盘
public void keyPressed(KeyEvent e) {
System.out.println("按下:"+e.getKeyCode());
/*
* if(e.getKeyCode()==KeyEvent.VK_LEFT) {
left=true;
}
if(e.getKeyCode()==KeyEvent.VK_RIGHT) {
left=true;
}
*/
p1.addDirection(e);
}
//释放键盘
public void keyReleased(KeyEvent e) {
System.out.println("抬起:"+e.getKeyCode());
p1.minusDirection(e);
}
}
//双缓冲技术
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);
}
public static void main(String[] args) {
MyGameFrame gameFrame=new MyGameFrame();
gameFrame.launchFrame();
}
}
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
/*
* 游戏物体的父类
*/
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() {
}
//drawMyself方法,画一个图片,横纵坐标,长宽
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);
}
}
import java.awt.Image;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
//游戏的工具类
public class GameUtil {
//构造私有方法,防止别人创建本类的对象
private GameUtil() {
}
public static Image getImage(String path) {//images/plane.jpg
Image img=null;
URL u=GameUtil.class.getClassLoader().getResource(path);
try {
img=ImageIO.read(u);
} catch (IOException e) {
e.printStackTrace();
}
return img;
}
public static void main(String[] args) {
Image img=GameUtil.getImage("images/plane.jpg");
System.out.println(img);
}
}
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
public class Plane extends GameObject{
//布尔类,四个方向
boolean left,right,up,down; //飞机的方向控制
boolean live=true; //活着
//画一个飞机
public void drawMyself(Graphics g) {
if(live) {
//继承父类的方法
super.drawMyself(g);
//飞机飞行的算法,可以自定义
//往左则x坐标减小
if(left) {
x -=speed;
}
//往右则x坐标增加
if(right) {
x +=speed;
}
//往上则y坐标减小
if(up) {
y -=speed;
}
//往下则y坐标增加
if(down) {
y +=speed;
}
}
}
public void addDirection(KeyEvent e) {
switch(e.getKeyCode()) {
case KeyEvent.VK_LEFT:
left=true;
break;
case KeyEvent.VK_RIGHT:
right=true;
break;
case KeyEvent.VK_UP:
up=true;
break;
case KeyEvent.VK_DOWN:
down=true;
break;
}
}
public void minusDirection(KeyEvent e) {
switch(e.getKeyCode()) {
case KeyEvent.VK_LEFT:
left=false;
break;
case KeyEvent.VK_RIGHT:
right=false;
break;
case KeyEvent.VK_UP:
up=false;
break;
case KeyEvent.VK_DOWN:
down=false;
break;
}
}
//构造方法(图片,坐标,速度)
public Plane(Image img, double x, double y, int speed) {
super(img,x,y,speed);
}
}
import java.awt.Color;
import java.awt.Graphics;
/*
* 炮弹类
*/
public class Shell extends GameObject{
double degree; //角度,炮弹沿着指定的角度飞行
public Shell() {
x=200;
y=200;
degree=Math.random()*Math.PI*2;
width=5;
height=5;
speed=3;
}
public void drawMyself(Graphics g) {
Color c=g.getColor();
g.setColor(Color.yellow);
g.fillOval((int)x, (int)y, width, height);
g.setColor(c);
//根据自己算法指定移动的路径
x +=speed*Math.cos(degree);
y +=speed*Math.sin(degree);
//碰到边界改变方向
if(y>Constant.GAME_HEIGHT-this.height || y<40) {
degree = -degree;
}
if(x<0 || x>Constant.GAME_WIDTH-this.width) {
degree=Math.PI-degree;
}
}
}
/*
* 存放相关的常量
*/
public class Constant {
//游戏窗口的宽度
public static final int GAME_WIDTH=500;
//游戏窗口的高度
public static final int GAME_HEIGHT=500;
}
学编飞机大战的代码,飞机撞到子弹后爆炸的效果出不来,别的地方都能正常运行,希望各位大佬给点建议
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
3条回答 默认 最新
- CSDN专家-sinJack 2021-05-19 00:04关注
MyGameFrame报错了,学会看错误信息。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报