java入门笔记12
文章目录飞机大战面向对象思想重构飞机类键盘控制游戏物体运动面向对象思想重构飞机类的键盘移动炮弹类的设计容器或数组产生多发炮弹飞机和炮弹碰撞实现爆炸类图片的实现程序计时功能飞机大战面向对象思想重构飞机类package feiji;import java.awt.*;public class planeextends GameObject { //要有无参构造器@Overridepublicvoid
·
飞机大战
面向对象思想重构飞机类
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);
}
/**
public plane(Image img,double x,double y,int speed) {
super(img,x,y,speed);
}
*/
}
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.*;
/**
* 游戏主窗口
* @author 86159
*
*/
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相当于是一个画笔
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); //1s画20次(20*50=1000)
}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());
//可以使用switch方法
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);
//飞机飞行的算法,可以自行设定
//x+=speed;
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);
}
/**
public plane(Image img,double x,double y,int speed) {
super(img,x,y,speed);
}
*/
}
炮弹类的设计
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){
// super.drawMyself(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);
//初始化50个炮弹对象
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){
// System.out.println("飞机击中了!!");
p1.live=false;
}
}
/**
在飞机类中定义live这个属性
*/
boolean live=true;//看飞机是否活着
@Override
public void drawMyself(Graphics g){
if(live){ //如果飞机没有活着,碰撞之后就会消失
super.drawMyself(g);
//飞机飞行的算法,可以自行设定
//x+=speed;
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");
//imgs[i].getWidth(null); //解决懒加载问题,目前加和不加没有问题
}
}
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;
/**
* 游戏主窗口
* @author 86159
*
*/
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相当于是一个画笔
//画背景
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) {
// System.out.println("飞机击中了!!");
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()); //启动键盘监听
//初始化50个炮弹对象
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); //1s画20次(20*50=1000)
}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);
}
}
更多推荐
已为社区贡献1条内容
所有评论(0)