飞机大战java

【面向对象项目】基于【JAVA】实战的飞机大战(二) 前面已经完成了主页面的编写和敌机的移动,在框架中能够显示出敌机的移动和英雄机、子弹的位置,以及分数和血量的显示。今天在前面的基础上继续完成英雄机、敌机、子弹的操作。 阅读详情

整个游戏窗口

package cn.tedu.shoot;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Timer;
import java.util.TimerTask;
import java.util.Random;
import java.util.Arrays;

/** 整个游戏窗口 */
public class World extends JPanel {
    public static final int WIDTH = 400;  //窗口的宽
    public static final int HEIGHT = 700; //窗口的高
    public static final int START = 0;
    public static final int RUNNING = 1;
    public static final int PAUSE = 2;
    public static final int GAME_OVER = 3;
    public int state = START;

    private Sky sky = new Sky();         //天空对象
    private Hero hero = new Hero();      //英雄机对象
    private FlyingObject[] enemies = {}; //敌人(小敌机、大敌机、小蜜蜂)数组
    private Bullet[] bullets = {};
    /** 生成敌人(小敌机、大敌机、小蜜蜂)对象 */
    public FlyingObject nextOne(){
        Random rand = new Random(); //随机数对象
        int type = rand.nextInt(20); //0到19之间的随机数
        if(type<5){ //0到4时,返回小蜜蜂对象
            return new Bee();
        }else if(type<13){ //5到12时,返回小敌机对象
            return new Airplane();
        }else{ //13到19时,返回大敌机对象
            return new BigAirplane();
        }
    }

    private int enterIndex = 0; //敌人入场计数
    /** 敌人入场 */
    public void enterAction(){ //每10毫秒走一次
        enterIndex++; //每10毫秒增1
        if(enterIndex%40==0){ //每400(40*10)毫秒走一次
            FlyingObject obj = nextOne(); //获取敌人对象
            enemies = Arrays.copyOf(enemies,enemies.length+1); //扩容
            enemies[enemies.length-1] = obj; //将obj添加到enemies的最后一个元素上
        }
    }
    /** 子弹入场 */
    private int shootIndex = 0;
    public void shootAction(){ //每10毫秒走一次
        shootIndex++; //每10毫秒增1
        if(shootIndex%30==0){ //每300(30*10)毫秒走一次
            Bullet[] bs = hero.shoot(); //获取子弹数组对象
            bullets = Arrays.copyOf(bullets,bullets.length+bs.length); //扩容(bs有几个就扩大几个容量)
            System.arraycopy(bs,0,bullets,bullets.length-bs.length,bs.length); //数组的追加
        }
    }
    /**飞行物移动*/
    public void stepAction(){ //每10毫秒走一次
        sky.step(); //天空动
        for(int i=0;i<enemies.length;i++){ //遍历所有敌人
            enemies[i].step(); //敌人动
        }
        for(int i=0;i<bullets.length;i++){ //遍历所有子弹
            bullets[i].step(); //子弹动
        }
    }
    /** 删除越界的敌人和子弹 */
    public void outOfBoundsAction(){ //每10毫秒走一次
        for(int i=0;i<enemies.length;i++){ //遍历所有敌人
            if(enemies[i].isOutOfBounds()){ //越界了
                enemies[i] = enemies[enemies.length-1]; //将越界敌人替换为enemies的最后一个元素
                enemies = Arrays.copyOf(enemies,enemies.length-1); //缩容
            }
        }

        for(int i=0;i<bullets.length;i++){ //遍历所有子弹
            if(bullets[i].isOutOfBounds()){ //越界了
                bullets[i] = bullets[bullets.length-1]; //将越界子弹替换为bullets的最后一个元素
                bullets = Arrays.copyOf(bullets,bullets.length-1); //缩容
            }
        }
    }
    private int score = 0; //玩家的得分
    /** 子弹与敌人的碰撞 */
    public void bulletBangAction(){ //每10毫秒走一次
        for(int i=0;i<bullets.length;i++){ //遍历所有子弹
            Bullet b = bullets[i]; //获取每一个子弹
            for(int j=0;j<enemies.length;j++){ //遍历所有敌人
                FlyingObject f = enemies[j]; //获取每一个敌人
                if(b.isLive() && f.isLive() && f.isHit(b)){ //若都活着的,并且还撞上了
                    b.goDead(); //子弹去死
                    f.goDead(); //敌人去死
                    if(f instanceof EnemyScore){ //若被撞对象能得分
                        EnemyScore es = (EnemyScore)f; //将被撞对象强转为得分接口
                        score += es.getScore(); //玩家得分
                    }
                    if(f instanceof EnemyAward){ //若被撞对象为奖励
                        EnemyAward ea = (EnemyAward)f; //将被撞对象强转为奖励接口
                        int type = ea.getAwardType(); //获取奖励类型
                        switch (type){ //根据奖励类型来获取不同的奖励
                            case EnemyAward.FIRE: //若为火力值
                                hero.addFire();   //则英雄机增火力
                                break;
                            case EnemyAward.LIFE: //若为命
                                hero.addLife();   //则英雄机增命
                                break;
                        }
                    }
                }
            }
        }
    }
    /** 英雄机与敌人碰撞 */
    public void heroBangAction(){
        for (int i=0;i<enemies.length;i++){
            FlyingObject f = enemies[i];
            if (f.isLive() && hero.isLive() && f.isHit(hero)){
                f.goDead();
                hero.subtractLife();
                hero.clearFire();
            }
        }
    }
    /** 检测游戏结束 */
    public void checkGameOverAction(){
        if (hero.getLife()<=0){
            state = GAME_OVER;

        }
    }
    /** 启动程序的执行 */
    public void action(){
        //鼠标侦听器
        MouseAdapter m = new MouseAdapter(){
            /** 重写mouseMoved()鼠标移动事件 */
            public void mouseMoved(MouseEvent e){
                if(state==RUNNING) { //仅在运行状态下执行
                    int x = e.getX(); //获取鼠标的x坐标
                    int y = e.getY(); //获取鼠标的y坐标
                    hero.moveTo(x, y); //英雄机随着鼠标移动
                }
            }
            /** 重写mouseClicked()鼠标点击事件 */
            public void mouseClicked(MouseEvent e){
                switch(state){ //根据当前状态来做不同的处理
                    case START:          //启动状态时
                        state = RUNNING; //修改为运行状态
                        break;
                    case GAME_OVER:    //游戏结束状态时
                        score = 0;        //清理现场
                        sky = new Sky();
                        hero = new Hero();
                        enemies = new FlyingObject[0];
                        bullets = new Bullet[0];
                        state = START; //修改为启动状态
                        break;
                }
            }
            /** 重写mouseExited()鼠标移出事件 */
            public void mouseExited(MouseEvent e){
                if(state==RUNNING){ //运行状态时
                    state = PAUSE;  //修改为暂停状态
                }
            }
            /** 重写mouseEntered()鼠标移入事件 */
            public void mouseEntered(MouseEvent e){
                if(state==PAUSE){    //暂停状态时
                    state = RUNNING; //修改为运行状态
                }
            }
        };
        this.addMouseListener(m);
        this.addMouseMotionListener(m);

        Timer timer = new Timer(); //定时器对象
        int interval = 10; //定时间隔(以毫秒为单位)
        timer.schedule(new TimerTask(){
            public void run(){ //定时干的事(每10毫秒走一次)
                if(state==RUNNING){ //仅在运行状态下执行
                    enterAction(); //敌人入场
                    shootAction(); //子弹入场
                    stepAction();  //飞行物移动
                    outOfBoundsAction();   //删除越界的敌人和子弹
                    bulletBangAction();    //子弹与敌人的碰撞
                    heroBangAction();      //英雄机与敌人的碰撞
                    checkGameOverAction(); //检测游戏结束
                }
                repaint(); //重画(重新调用paint()方法)
            }
        },interval,interval); //定时计划表
    }
    /** 重写paint()画  g:画笔 */
    public void paint(Graphics g){
        g.drawImage(sky.getImage(),sky.x,sky.y,null); //画天空
        g.drawImage(sky.getImage(),sky.x,sky.getY1(),null); //画天空2
        g.drawImage(hero.getImage(),hero.x,hero.y,null); //画英雄机
        for(int i=0;i<enemies.length;i++){ //遍历所有敌人
            FlyingObject f = enemies[i]; //获取每一个敌人
            g.drawImage(f.getImage(),f.x,f.y,null); //画敌人
        }
        for(int i=0;i<bullets.length;i++){ //遍历所有子弹
            Bullet b = bullets[i]; //获取每一个子弹
            g.drawImage(b.getImage(),b.x,b.y,null); //画子弹
        }
        g.drawString("分数: "+score,10,25); //画分
        g.drawString("命: "+hero.getLife(),10,45); //画命
        switch (state){
            case START:
                g.drawImage(Images.start,0,0,null);
                break;
            case PAUSE:
                g.drawImage(Images.pause,0,0,null);
                break;
            case GAME_OVER:
                g.drawImage(Images.gameover,0,0,null);
                break;
        }
    }
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        World world = new World();
        world.setFocusable(true);
        frame.add(world);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(WIDTH+16,HEIGHT+39);
        frame.setLocationRelativeTo(null);
        frame.setResizable(false);
        frame.setVisible(true); //调用paint()方法
        world.action();
    }
}

Airplane类

package cn.tedu.shoot;
import java.awt.image.BufferedImage;
import java.util.Random;
public class Airplane extends FlyingObject implements EnemyScore {
    private int speed;
    public Airplane(){
       super(48,50);
       speed = 2;
    }
    public void step(){
        y += speed;

    }
    int index = 1; //下标
    /** 重写getImage()获取图片 */
    public BufferedImage getImage(){ //每10毫秒走一次
        if(isLive()){              //若活着的
            return Images.airs[0]; //则直接返回airs[0]图片即可
        }else if(isDead()){ //若死了的
            BufferedImage img = Images.airs[index++]; //获取爆破图
            if(index==Images.airs.length){ //若index为5,则表示到最后一张爆破图了
                state = REMOVE;            //将当前状态修改为REMOVE删除的
            }
            return img; //返回爆破图
               /*
                 执行过程:
                                     index=1
                   10M  img=airs[1]  index=2          返回airs[1]
                   20M  img=airs[2]  index=3          返回airs[2]
                   30M  img=airs[3]  index=4          返回airs[3]
                   40M  img=airs[4]  index=5(REMOVE)  返回airs[4]
                   50M  不返回图片
                */
        }
        return null; //REMOVE状态时,不返回图片
    }
    /** 重写getScore()得分 */
    public int getScore(){
        return 1; //打掉小敌机,玩家得1分
    }
}

Bee类

package cn.tedu.shoot;
import java.awt.image.BufferedImage;
import java.util.Random;
/** 小蜜蜂:是飞行物 */
public class Bee extends FlyingObject implements EnemyAward{
    private int xSpeed; //x坐标移动速度
    private int ySpeed; //y坐标移动速度
    private int awardType; //奖励类型
    /** 构造方法 */
    public Bee(){
        super(60,51);
        xSpeed = 1;
        ySpeed = 2;
        Random rand = new Random(); //随机数对象
        awardType = rand.nextInt(2); //0到1之间随机生成
    }

    /** 重写step()移动 */
    public void step(){
        x+=xSpeed; //x+(向右或向左)
        y+=ySpeed; //y+(向下)
        if(x<=0 || x>=400-width){ //若x<=0或x>=(窗口宽-蜜蜂宽),表示到两头了
            xSpeed*=-1; //则切换方法(正变负,负变正)
        }
    }

    int index = 1; //下标
    /** 重写getImage()获取图片 */
    public BufferedImage getImage(){ //每10毫秒走一次
        if(isLive()){
            return Images.bees[0];
        }else if(isDead()){
            BufferedImage img = Images.bees[index++];
            if(index==Images.bees.length){
                state = REMOVE;
            }
            return img;
        }
        return null;
    }
    /** 重写getAwardType()获取奖励类型 */
    public int getAwardType(){
        return awardType; //返回奖励类型
    }
}

BigAirplane类

package cn.tedu.shoot;

import java.awt.image.BufferedImage;
import java.util.Random;

public class BigAirplane extends FlyingObject implements EnemyScore{
    private int speed;
    public BigAirplane(){
       super(66,89);
       speed = 2;
    }
    public void step() {
        y += speed;

    }
    int index = 1; //下标
    /** 重写getImage()获取图片 */
    public BufferedImage getImage(){ //每10毫秒走一次
        if(isLive()){
            return Images.bairs[0];
        }else if(isDead()){
            BufferedImage img = Images.bairs[index++];
            if(index==Images.bairs.length){
                state = REMOVE;
            }
            return img;
        }
        return null;
    }
    /** 重写getScore()得分 */
    public int getScore(){
        return 3; //打掉大敌机,玩家得3分
    }
}

Bullet类

package cn.tedu.shoot;

import java.awt.image.BufferedImage;

public class Bullet extends FlyingObject {
    private int speed;
    public Bullet(int x,int y){
        super(8,20,x,y);
        speed = 3;

    }

    public void step() {
        y -= speed;

    }
    /** 重写getImage()获取图片 */
    public BufferedImage getImage(){ //每10毫秒走一次
        if(isLive()){             //若活着的
            return Images.bullet; //则直接返回子弹图片
        }else if(isDead()) { //若死了的
            state = REMOVE;  //则将当前状态修改为REMOVE删除的
        }
        return null; //死了的和删除的,都不返回图片
           /*
             执行过程:
               1)若活着的,返回bullet图片
               2)若死了的,将当前状态修改为REMOVE删除的,同时不返回图片
               3)若删除的,不返回图片
            */
    }
    /** 重写isOutOfBounds()检测子弹是否越界 */
    public boolean isOutOfBounds(){
        return y<=-height; //子弹的y<=负的子弹的高,即为越界了
    }
}

FlyingObject(超类)

package cn.tedu.shoot;
import java.awt.image.BufferedImage;
import java.util.Random;
public abstract class FlyingObject {
    public static final int LIVE = 0;   //活着的
    public static final int DEAD = 1;   //死了的
    public static final int REMOVE = 2; //删除的
    protected int state = LIVE; //当前状态(默认为活着的)
    protected int width;
    protected int height;
    protected int x;
    protected int y;
    public FlyingObject(int width,int height){
        this.width = width;
        this.height = height;
        Random rand = new Random();
        x = rand.nextInt(World.WIDTH-width); //x:0到(窗口宽-敌人宽)之内的随机数
        y = -height;
    }
    public FlyingObject(int width,int height,int x,int y){
        this.width = width;
        this.height = height;
        this.x = x;
        this.y = y;
    }
   public abstract void step();
    /** 获取对象的图片 */
    public abstract BufferedImage getImage();

    /** 判断对象是否是活着的 */
    public boolean isLive(){
        return state==LIVE; //若当前状态为LIVE,表示对象是活着的,返回true,否则返回false
    }
    /** 判断对象是否是死了的 */
    public boolean isDead(){
        return state==DEAD; //若当前状态为DEAD,表示对象是死了的,返回true,否则返回false
    }

    /** 判断对象是否是删除的 */
    public boolean isRemove(){
        return state==REMOVE; //若当前状态为REMOVE,表示对象是删除的,返回true,否则返回false
    }
    public boolean isOutOfBounds(){
        return y>=World.HEIGHT; //敌人的y>=窗口的高,即为越界了
    }
    /** 检测碰撞  this:敌人 other:子弹/英雄机 */
    public boolean isHit(FlyingObject other){
        int x1 = this.x-other.width;  //x1:敌人的x-子弹/英雄机的宽
        int x2 = this.x+this.width;   //x2:敌人的x+敌人的宽
        int y1 = this.y-other.height; //y1:敌人的y-子弹/英雄机的高
        int y2 = this.y+this.height;  //y2:敌人的y+敌人的高
        int x = other.x;              //x:子弹/英雄机的x
        int y = other.y;              //y:子弹/英雄机的y

        return x>=x1 && x<=x2 && y>=y1 && y<=y2; //x在x1与x2之间,并且,y在y1与y2之间,即为撞上了
    }
    /** 飞行物去死 */
    public void goDead(){
        state = DEAD; //将当前状态修改为DEAD死了的
    }
}

Hero类

package cn.tedu.shoot;

import java.awt.image.BufferedImage;

public class Hero extends FlyingObject {
    private int life;
    private int fire;
    public Hero(){
        super(97,139,140,400);
        life = 5;
        fire = 3;

    }

    public void step() {

    }
    int index = 0; //下标
    /** 重写getImage()获取图片 */
    public BufferedImage getImage(){ //每10毫秒走一次
        return Images.heros[index++%Images.heros.length];
    }
    /** 英雄机发射子弹(生成子弹对象) */
    public Bullet[] shoot(){
        int xStep = this.width/4; //1/4英雄机的宽
        int yStep = 20; //固定的20
        if(fire>0){ //双倍
            Bullet[] bs = new Bullet[2]; //2发子弹
            bs[0] = new Bullet(this.x+1*xStep,this.y-yStep); //x:英雄机的x+1/4英雄机的宽  y:英雄机的y-固定的20
            bs[1] = new Bullet(this.x+3*xStep,this.y-yStep); //x:英雄机的x+3/4英雄机的宽  y:英雄机的y-固定的20
            fire-=2; //发射一次双倍火力,则火力值减2
            return bs;
        }else{ //单倍
            Bullet[] bs = new Bullet[1]; //1发子弹
            bs[0] = new Bullet(this.x+2*xStep,this.y-yStep); //x:英雄机的x+2/4英雄机的宽  y:英雄机的y-固定的20
            return bs;
        }
    }
    /** 英雄机移动  x/y:鼠标的x坐标和y坐标 */
    public void moveTo(int x,int y){
        this.x = x-this.width/2;  //英雄机的x=鼠标的x-1/2英雄机的宽
        this.y = y-this.height/2; //英雄机的y=鼠标的y-1/2英雄机的高
    }
    /** 英雄机增命 */
    public void addLife(){
        life++; //命数增1
    }
    /** 获取英雄机的命 */
    public int getLife(){
        return life; //返回命数
    }
    /** 英雄机减命 */
    public void subtractLife(){
        life --;
    }
    /** 英雄机增火力 */
    public void addFire(){
        fire+=40; //火力值增40
    }
    /** 火力值清零 */
    public void clearFire(){
        fire = 0;
    }
}

Images类

package cn.tedu.shoot;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
/** 图片工具类 */
public class Images {
    //  公开的  静态的   图片数据类型  变量名
    public static BufferedImage start;    //启动图片
    public static BufferedImage pause;    //暂停图片
    public static BufferedImage gameover; //游戏结束图片
    public static BufferedImage sky;      //天空图片
    public static BufferedImage bullet;   //子弹图片
    public static BufferedImage[] heros;  //英雄机图片数组
    public static BufferedImage[] airs;   //小敌机图片数组
    public static BufferedImage[] bairs;  //大敌机图片数组
    public static BufferedImage[] bees;   //小蜜蜂图片数组

    static { //给图片赋值
        start = readImage("start.png");
        pause = readImage("pause.png");
        gameover = readImage("gameover.png");
        sky = readImage("background.png");
        bullet = readImage("bullet.png");
        heros = new BufferedImage[2]; //2张图片
        heros[0] = readImage("hero0.png");
        heros[1] = readImage("hero1.png");

        airs = new BufferedImage[5]; //5张图片
        bairs = new BufferedImage[5]; //5张图片
        bees = new BufferedImage[5]; //5张图片
        airs[0] = readImage("airplane.png");
        bairs[0] = readImage("bigairplane.png");
        bees[0] = readImage("bee.png");
        for(int i=1;i<airs.length;i++){ //赋值爆破图
            airs[i] = readImage("bom"+i+".png");
            bairs[i] = readImage("bom"+i+".png");
            bees[i] = readImage("bom"+i+".png");
        }
    }

    /** 读取图片  fileName:图片名称 */
    public static BufferedImage readImage(String fileName){
        try{
            BufferedImage img = ImageIO.read(FlyingObject.class.getResource(fileName)); //读取与FlyingObject同包中的图片
            return img;
        }catch(Exception e){
            e.printStackTrace();
            throw new RuntimeException();
        }
    }

    public static void main(String[] args) {
        System.out.println(Images.heros.length); //测试代码只要用到Images类就OK
    }
}

Sky类

package cn.tedu.shoot;

import java.awt.image.BufferedImage;

public class Sky extends FlyingObject {
    private int speed;
    private int y1;
    public Sky(){
        super(400,700,0,0);
        speed = 1;
        y1 = -World.HEIGHT;
    }

    public void step() {
        y += speed;
        y1 += speed;
        if(y>=700){ //若y>=窗口的高,表示移到最下面了
            y=-700; //则将y修改为负的窗口的高,即移到最上面去
        }
        if(y1>=700){ //若y1>=窗口的高,表示移到最下面了
            y1=-700; //则将y1修改为负的窗口的高,即移到最上面去
        }
    }
    /** 重写getImage()获取图片 */
    public BufferedImage getImage(){ //每10毫秒走一次
        return Images.sky; //返回sky图片即可
    }

    /** 获取y1坐标 */
    public int getY1(){
        return y1; //返回y1坐标
    }
}

【Java】Java基础飞机大战小游戏完整代码 Java基础飞机大战小游戏完整代码 Java基础飞机大战小游戏完整代码 先来一波代码实现后的结果图吧。。。。。。 博主不喜欢废话,直接上干货。 主函数ShootGame 初始化游戏原始背景图片,游戏人物图片,游戏开始结束图片;构建产生敌人算法;产生英雄机算法;发射子弹算法;判断是否相撞算法(子弹与敌机相撞,英雄机与敌机相撞);击落敌人奖励算法;绘制游戏中人物算法;鼠标控制移动算法; import java.awt.Font; import java.awt.Graphics; import java.a 阅读详情

相关推荐

Java飞机大战

Java飞机大战 本次的飞机大战是我进入大学以来第一次大部分靠自己的思路写出来的项目,虽然代码质量可能不是很高,但是这次项目完成给我带来的成就感真的很大很大。 飞机大战项目总结 1、游戏开始界面 2、游戏运行界面 3、游戏结束界面 1)解决问题 敌机:大型敌机、中型敌机、小型、boss机 我方:英雄机 背景:天空 2)各个对象所具备的功能和特征 大敌机:有五条生命,从天空上方出现往下走,被击毁后英雄机加五十分 小敌机:有一条生命,从天空上方出现往下走,被击毁后英雄机加十分 中型机:有二条生命,从天空上

weixin_53794448的博客 3966

java 中飞机大战碰撞检测_飞机大战3--碰撞检测

碰撞检测目标了解碰撞检测方法碰撞实现01. 了解碰撞检测方法pygame 提供了 两个非常方便 的方法可以实现碰撞检测:pygame.sprite.groupcollide()两个精灵组 中 所有的精灵 的碰撞检测groupcollide(group1, group2, dokill1, dokill2, collided = None) -> Sprite_dict如果将 dokill 设...

weixin_29322049的博客 827

Java实现飞机大战(有图片素材)

代码参考了尚学堂飞机大战3.0版本,同时在此基础上添加了自己的一些想法,游戏失败或者通关后游戏重新开始,添加背景音乐。其他的没做太大改变。

weixin_74947024的博客 4626

Java 实现飞机大战

Java 实现飞机大战飞机大战设计基本流程1.窗口显示 JFrame2.画板/面板 JPanel3.图片读取4.程序的设计5.补充父类中的构造方法6.在主程序中创建各种对象进行测试测试7.写入各个飞行物类的move方法8.主程序中: 添加定时器9.添加鼠标监听事件 - 监听器 - 接口10.游戏状态的设置11.奖励类型: [火力加成], 生命值加成12.碰撞Github链接: 飞机大战设计基本流程 1.窗口显示 JFrame 2.画板/面板 JPanel public static void main(St

weixin_44191224的博客 1040

用Java编写飞机大战游戏

本文介绍了如何使用Java编写一个简单的飞机大战游戏,包括游戏引擎的搭建、游戏素材的制作和游戏逻辑的实现等。通过这个例子,我们可以了解到游戏编程的基本原理和方法,为以后进行更加复杂和高级的游戏开发打下基础。【Java游戏项目】手把手带你做出属于自己的飞机大战(附源码),允许白嫖,拿走不谢!_哔哩哔哩_bilibili。

2301_76720304的博客 4789

java-飞机大战(源代码)

.

2301_81253185的博客 2239

java飞机大战英雄机游戏结束_Java学习二(飞机大战项目)day10

day101.英雄机和敌人的碰撞1) 借用FlyingObject中的hit()碰撞行为借用FlyingObject中的goDead()方法在Hero中设计subtractLife()减命、clearDoubleFire()清空火力值4/** 成员方法:减命 */public void subtractLife() {life--; //命数减1}/** 成员方法:清空火力...

weixin_39531374的博客 410

Java飞机大战项目

飞机大战游戏是一款十分有趣的射击类小游戏,流畅的画面,高难度的挑战。游戏中,玩家驾驶英雄机,在空中进行战斗。点击并移动自己的英雄机,发射炮弹,打掉敌飞机以及蜜蜂,来获得分数和奖励,打掉一架敌飞机赢得5分,打掉一只蜜蜂赢得1条命或是获得20次双倍火力,如果撞上敌飞机或小蜜蜂,将减少命、双倍火力清零。每撞到一次蜜蜂或是敌飞机命减1,当命数为0时,则游戏结束。游戏界面如下图所示 下面就是...

Java学习博客 1万+

java 中飞机大战碰撞检测,飞机大战开发04子弹与敌机的碰撞检测

先是敌机与玩家子弹的碰撞检测:代码:GameLayer.hvoid GameLayer::update(float dt){for (int i = 0 ;i < m_pEnermyVec.size();i++){Sprite * pEne = m_pEnermyVec.at(i) ;for (int j = 0 ; j < m_pPlayerBullet.size();j++ ){S...

weixin_36325879的博客 889

老Java程序员花一天时间写了个飞机大战,很舒服!

引言: 前两天我发现优快云上有两篇飞机大战的文章异常火爆,各种指标都很高(阅读、点赞、评论、收藏等),但都是python写的,竟然不是我大Java,说实话作为老java选手,我心里是有那么一些失落的,难道我大java打飞机不行?就算大java打飞机不行,那我用单身30年的打飞机手速,我肯定行(反正我的代码我做主,就是玩!),于是我决定一展伸手,用java写了一个飞机大战。我就问你们我打飞机行不行,我媳妇都说行,你们呢?欢迎我亲爱的大Java选手们 点赞+评论+收藏!给我冲、冲、冲。。。 /* * 游戏窗

编程界明世隐的博客 7万+

基于Java实现飞机大战

所以为了解决这个问题,我首先反复调整实验了飞机出现频率和炮弹发射频率的参数,并对炮弹发射的线程函数进行了改进,先发炮弹再进行循环,而不是先循环再发射炮弹,这样,随着敌军随机出现,炮弹也随机出现。2、碰撞问题:在飞机与敌机或者飞机与炮弹发生碰撞的时候,我发现有时候碰撞了一次却失去了好几条生命,思考过后,我发觉,一开始写的只是图形的碰撞,在飞机的移动过程中,由于图形边缘不规则所以可能出现多次碰撞。否则,不仅难于控制和处理过多的元素,也会因过多的大型图片而不能限制程序的大小,失去程序的原则和 Java 的优势。

神仙别闹的自留地 1155

Java项目-飞机大战

在ShootGame类中添加入场方法,如下/*** 子弹入场方法//10毫秒走一次 }由图可以看出,当子弹的x坐标在蜜蜂的x与x+width之间,并且子弹的y坐标在蜜蜂的y与y+height之间时,子弹击中敌人;/*** 飞行物(大小敌机、蜜蜂)被子弹碰撞的方法* @param bullet 子弹* @return 是否被碰撞(是 true 否 false)//代表被碰撞飞行物的x坐标 int x2 = this . x + this . width;

qq_38656657的博客 9945

别再为下载速度发愁了!手把手教你给qBittorrent/Transmission添加最新可用Tracker(附2024年实测地址清单)

本文提供2024年BT下载加速实战指南,详细解析Tracker工作原理与速度瓶颈,手把手教你为qBittorrent/Transmission添加最新可用Tracker,并附实测地址清单。通过优化配置和精选Tracker列表,显著提升下载速度和稳定性,解决连接延迟和peer数量限制问题。

weixin_28481133的博客 1262

飞机大战源码(Java)

《飞机大战》这款小游戏相信许多朋友早就已经玩过,但这个游戏是如何编写的呢,本文为大家介绍一下用Java如何编写飞机大战游戏,仅供参考。 源码链接:https://mp.weixin.qq.com/s/XTahERdKZW1ZzwOu_Yz0tQ 1.首先建立模板类,创建敌机和子弹模板,方便创建对象 敌机模板类Dj.java代码: package model; import java.awt.Gr...

flower_517的博客 3万+

纽马克-贝塔法(Newmark-Beta Method)在结构动力学中的应用与实现

本文深入解析了纽马克-贝塔法(Newmark-Beta Method)在结构动力学数值计算中的核心原理与应用。作为经典的时间积分算法,它通过调节γ和β参数,在计算精度、稳定性与效率间取得平衡,尤其适用于地震响应、风振分析等工程场景。文章详细阐述了其数学内核、在有限元分析中的实现步骤,并对比了隐式与显式方案的适用场景,为工程师提供了关键的方法选择与参数调优指导。

weixin_29232121的博客 148

瑞芯微RK3568与RK3566芯片选型指南:从接口差异到应用场景深度解析

在嵌入式系统与边缘计算领域,芯片选型是决定产品成败的关键一步。其核心在于理解芯片的架构、接口扩展能力与系统可靠性之间的平衡。以瑞芯微(Rockchip)的RK3568和RK3566为例,这两款同为四核A55架构的芯片,在基础算力上相近,但其面向的应用赛道却因接口配置而截然不同。RK3568凭借其双千兆网口、PCIe 3.0高速接口以及全链路ECC内存支持,在技术价值上更侧重于构建高可靠、高扩展性的系统,如边缘计算网关、工业控制器和网络视频录像机(NVR)。相比之下,RK3566则以其精简的接口配置,精准服务

weixin_33314040的博客 480

关于使用Java实现简单飞机大战

此次使用Java语言实现一个简易的2D小游戏飞机大战。 实现大概功能:创建一个页面,存在一个玩家飞机,可以射击子弹,当子弹打到敌机、奖赏类(Bee与Bigbee)时,获得相应的积分或是奖励。boss在达到固定积分时会出现,并且会射击子弹。 由于Bee和Bigbee属性类似,只有图片及奖赏不同,因此可继承于同一个接口;而Enemyplane和Boss在笔者写的过程中由于Boss添加了射击的属性,因此...

MYLin 1万+

STM32N6实战:FSBL引导XIP运行ThreadX与NetX Duo

在嵌入式系统开发中,程序的存储与执行方式直接影响启动速度和系统实时性。传统MCU常将代码拷贝到内存运行,而高主频处理器则可通过XIP(片外Flash原地执行)技术直接从外部存储取指,省去拷贝过程。但XIP的前提是外部存储器控制器需在上电后第一时间完成初始化,这正是FSBL(第一级引导程序)的核心职责。FSBL负责配置时钟与外部Flash,并将控制权移交给应用。而要让设备具备实时调度与网络能力,可搭配ThreadX实时内核和NetX Duo双协议栈,两者在CubeMX中原生集成,形成一套高性能MCU+外部存储

weixin_29191669的博客 319

JAVA飞机大战游戏附源码

JAVA飞机大战附源码java飞机大战效果图如下 java飞机大战 话不多说 直接上源码 窗体部分 package UI; //自定义窗体 //创建类 继承JFrame //创建构造方法,设置窗体 import javax.swing.JFrame; public class Gameframe extends JFrame { //构造方法 public Gameframe() { //设置标...

K1534334971的博客 4493

python+playwright 学习-10.pytest-playwright插件编写测试用例

pytest-playwright插件完美的继承了pytest 用例框架和playwright基础使用的封装,基本能满足工作中的常规需求了,不需要我们再做额外的插件开发。

qq_27371025的博客 2519

《QGIS快速入门与应用基础》108:CGCS2000对应的投影坐标系

本文详细解析了CGCS2000地理坐标系对应的各类投影坐标系,包括高斯-克吕格3°带/6°带、UTM、地方独立投影和Web墨卡托投影。文章系统阐述了各投影类型的分带规则、参数设置、精度特性及适用场景,并提供了EPSG编码对照表和QGIS操作指南。通过"基准+投影"的绑定机制,这些投影坐标系实现了平面坐标与经纬度的精准转换,满足从大比例尺工程测量到Web地图服务等不同应用需求。内容涵盖投影原理、坐标格式、变形控制等关键技术要点,为GIS开发者和测绘人员提供了实用的参考信息。

LuckyHanMo的博客 542

JAVA 飞机大战

        小的时候我们玩过很多小游戏,比如:坦克大战、贪吃蛇、超级玛丽、推箱子、飞机大战等等。今天就用java写一个小游戏,飞机大战。飞机大战的主要知识点就是线程,只要对线程有基本的了解就能完成飞机大战的编程。         关于飞机大战的编写,接下来分几个步骤来完成。 一、实现敌方飞机的移动        (用一张球的图片来替代敌方飞机,之后更换图片就好)        1.首先...

qq1925346284的博客 4500

【光子 AI】AI Agent 知识体系深度研究报告

从理论基础到前沿应用:全面解析人工智能代理的核心架构、关键技术与发展趋势📅 2026 年 3 月 | 📊 深度研究报告 | 🔬 人工智能领域 | 📈 前沿技术分析**AI Agent(人工智能代理)**是一种能够感知环境、基于所获得的信息做出决策,并执行行动以影响该环境的软件系统。AI Agent 的设计旨在模仿或实现智能行为,它们可以在各种环境中操作,包括物理世界和虚拟空间。随着大语言模型(LLM)技术的突破性进展,AI Agent 正从实验室研究快速走向产业应用。根据 Gartner 发布的《2

AI天才研究院 177

Java版本飞机大战

1.关于这个飞机大战 学Java有一段时间了,然后通过Java开发了一些简易安卓APP。最近很想实现以前自己很想写的飞机大战,也练练手。代码和界面参考(抄袭 )了许多,毕竟天下码农一家亲。 游戏大概长下面这样,鼠标点击即开始游戏,然后用鼠标操作飞机移动(鼠标到哪飞机移动到哪,超出游戏界面就暂停)。 2.代码实现 首先写几个bean。GameStateBean里面存放了一些游戏状态的常量,Img...

‎‎‎‎‎不想吃泡面 4775

c#视觉应用开发中如何使用Emgu CV在C#中进行图像处理?

Emgu CV 是 OpenCV 的 .NET 包装器,可以让开发者在 .NET 语言(如 C#)中使用 OpenCV 的功能进行图像处理。在进行图像处理时,Emgu CV 提供了丰富的 API 可以使用。PictureBoxImageBox下面是一个详细的示例,演示如何使用 Emgu CV 在 C# 中进行基本的图像处理,包括加载图像、转换为灰度图像、进行边缘检测,然后显示结果。byte在这个示例中,我们使用了三个PictureBox控件来显示原始图像、灰度图像和边缘检测后的图像。

zhangzhechun的专栏 670

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

java实现飞机大战

准备工作 理解java中的面向对象 理解GUI编程 理解多线程的使用 java中集合的使用 实体类 背景类 public class BackGround { //设置背景图标的坐标和宽、高 private int x; private int y; private int width; private int height; //获取背景图标 private ImageIcon icon=new ImageIcon("src\\image\\

weixin_45608165的博客 1903

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

上一篇: 羊了个羊(面向过程简单实现)
下一篇: java小练习之控制台打印菱形
拥抱所有的思念
博客等级 码龄4年 3粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值