JAVA学习总结-飞机小游戏项目

    现在已经是我的大二第二学期了,我貌似找到了以后的方向,那就是JAVA。通过一周的学习,对JAVA也有了深入的了解,也做了一个飞机小游戏的项目,作为对学习JAVA的总结吧,现把代码分享如下:

MyGameFrame类代码:

import javax.swing.JFrame; //添加窗口类包






import java.awt.Color; //导入有关颜色类的包
import java.awt.Font; //导入有关字体累的包
import java.awt.Graphics; //导入可画图的包
import java.awt.Image;
import java.awt.event.*; //导入实现窗口关闭的包
import java.util.Date;


public class MyGameFrame extends JFrame{ //定义一个窗体类
Image planeImg=GameUtil.getImage("images/plane.jpg"); //实例化飞机图片
Image background=GameUtil.getImage("images/background.jpg"); //实例化背景图片

Plane plane=new Plane(planeImg,250,250); //实例化飞机对象

Shell[] shells=new Shell[20]; //实例化炮弹对象20个

Explode bao; //创建爆炸对象

Date startTime=new Date(); //实例化起始时间对象
Date endTime; //创建结束时间对象
int period; //计算游戏时间

public void paint(Graphics g){ //Frame的Paint方法需要导入java.swt.Graphics包
Color c=g.getColor(); //保存画笔的初始颜色

g.drawImage(background, 0, 0, null); //绘制背景图片
plane.drawSelf(g); //绘制飞机
for(int i=0;i<shells.length;i++) {
shells[i].draw(g); //绘制炮弹

//飞机的碰撞检测(每次重画一个炮弹时进行检测,检测连个矩形是否相交)
boolean peng=shells[i].getRect().intersects(plane.getRect());  //intersects可以判断两个矩形是否相交

if(peng) {
plane.live=false; //如果碰撞,改变飞机的live属性
if(bao==null) { //如果是第一次发生碰撞则播放爆炸图片动画
bao=new Explode(plane.x,plane.y); //实例化爆炸对象
endTime=new Date(); //实例化结束时间对象
period =(int)((endTime.getTime()-startTime.getTime())/1000); //计算游戏时间
}
bao.draw(g); //爆发爆炸对象
}
}
if(!plane.live) {

g.setColor(Color.white); //设置画笔颜色

Font f=new Font("宋体",Font.BOLD,50); //实例化字体对象并加载相应属性
g.setFont(f); //
g.drawString("时间"+period+"秒", (int)plane.x, (int)plane.y); //显示游戏时间
}
g.setColor(c); //复原画笔颜色
}

class PaintThread extends Thread{ //定义一个线程类
public void run() {
while(true) {
repaint(); //重画窗口
try {
Thread.sleep(40); //延时40毫秒,每40毫秒重画
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
}

class KeyMonitor extends KeyAdapter{ //定义一个键盘监听类


@Override
public void keyPressed(KeyEvent arg0) { //定义键盘按下方法
plane.addDirection(arg0);
}


@Override
public void keyReleased(KeyEvent arg0) { //定义键盘抬起方法
plane.minusDirection(arg0);
}

}

public void launchFrame() { //定义初始化窗口方法
this.setTitle("周玉杰作品"); //窗体的标题
this.setVisible(true); //窗体可视化
this.setSize(Constant.GAME_WIDTH,Constant.GAME_HEIHGT); //窗体的大小
this.setLocation(250, 250); //窗体的位置
this.addWindowListener(new WindowAdapter() { //添加窗体的关闭方法
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
new PaintThread().start();   //启动重画窗口的线程
addKeyListener(new KeyMonitor()); //给窗口增加键盘监听

for(int i=0;i<shells.length;i++) { //初始化25炮弹
shells[i]=new Shell();
}
}

public static void main(String[] args) {
MyGameFrame f=new MyGameFrame(); //创建一个窗体f
f.launchFrame(); //调用f的laynchFrame方法

}


}


Explode类代码:

import java.awt.Graphics;
import java.awt.Image;


public class Explode {
double x,y; //爆炸位置
static Image[] imgs=new Image[13]; //加载爆炸图片,静态数组
static { //定义静态块
for(int i=0;i<13;i++) {
imgs[i]=GameUtil.getImage("images/explode/"+(i+1)+".jpg");
imgs[i].getWidth(null);
}
}

int count=0; //计数

public void draw(Graphics g) { //绘制图片
if(count<=12) {
g.drawImage(imgs[count], (int)x, (int)y, null);
count++;
}
}

public Explode(double x,double y) { //构造函数
this.x=x;
this.y=y;
}


}



Shell类代码:

import java.awt.Color;
import java.awt.Graphics;


//炮弹类


public class Shell extends GameObject{

double degree; //炮弹方向


public Shell() {
x=100;
y=100;
width=10;
height=10;
speed=4; //炮弹速度
degree=Math.random()*Math.PI*2; //生成随机方向
}

public void draw(Graphics g) {
Color c=g.getColor();
g.setColor(Color.red);
g.fillOval((int)x,(int) y, width, height); //填充一个炮弹(实心球)
//炮弹沿任意路径飞行
x+=speed*Math.cos(degree);
y+=speed*Math.sin(degree);

if(x<5||x>Constant.GAME_WIDTH-width-5) { //跑弹的飞行方向,与窗体边缘碰撞会发生反弹
degree=Math.PI-degree;
}
if(y<30||y>Constant.GAME_HEIHGT-height-5) {
degree=-degree;
}

g.setColor(c);
}


}



Plane类代码:

import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
//定义飞机类
public class Plane extends GameObject{ //定义飞机类

boolean left,up,right,down;

boolean live=true; //判断飞机是否活着

public void drawSelf(Graphics g) {
if(live) { //飞机活着绘制飞机
g.drawImage(img, (int)x,(int) y, null); //绘制飞机图片
if(left) {
x-=speed; //飞机的x坐标减小
}
if(right) {
x+=speed; //飞机的x坐标增加
}
if(up) {
y-=speed; //飞机的Y坐标减小
}
if(down) {
y+=speed; //飞机的Y坐标增加
}
}
else { //飞机死了不绘制飞机

}

}
public Plane(Image img,double x,double y) {
this.img=img;
this.x=x;
this.y=y;
this.speed=3;
this.width=img.getWidth(null);
this.height=img.getHeight(null);
}

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;
}
}

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;
}
}

}


GameObject类代码:

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 void drawSelf(Graphics g) { //绘制图片
g.drawImage(img, (int)x,(int) y, null);
}


public GameObject(Image img, double x, double y, int speed, int width, int height) {
super();
this.img = img;
this.x = x;
this.y = y;
this.speed = speed;
this.width = width;
this.height = height;
}

public GameObject() {
// TODO 自动生成的构造函数存根
}

public Rectangle getRect() { //返回物体所在的矩形,方便以后进行碰撞检测
return new Rectangle((int)x,(int)y,width,height);
}

}



Constant类代码:




GameUtil类代码:



游戏效果图:





    随说是个很简单的游戏,但也算是我的第一个JAVA程序,由于学习JAVA比较跳,之前的学习都是看视频快速学习,基本没完整的敲过代码,这个程序说是第一个JAVA程序一点也不为过。以前一直觉得自己可能不适合敲代码,不过现在看来敲代码也是蛮有意思的。不过不管怎么样我也要一条路走下去了。这个代码随说简单,但也有很多不合适的地方,如果有大神看到也希望能给我指点一二,在下感激不尽。

  • 1
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值