java之线程飞机大战制作

import java.awt.Graphics;
import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class PlaneMain extends JPanel {

    public static void main(String[] args) {
        new PlaneMain();
    }

    private ArrayList<View> list;

    public PlaneMain() {
        list = new ArrayList<View>();
        View background = new View("background.jpg", 0, -60, 700, 460, 2, this);
        list.add(background);
        initUI();
    }

    private void initUI() {
        JFrame frame = new JFrame("飞机大战");
        frame.setSize(700, 400);
        frame.setDefaultCloseOperation(3);
        frame.setLocationRelativeTo(null);
        frame.setResizable(false);

        frame.add(this);

        frame.setVisible(true);

        AddListener al = new AddListener(this, list);

        this.addMouseListener(al);

        Thread t = new Thread(al);
        t.start();// 启动线程
    }

    /**
     * 重写JPanel的重绘方法
     */
    public void paint(Graphics g) {
        super.paint(g);

        for (int i = 0; i < list.size(); i++) {
            View v = list.get(i);
            g.drawImage(v.getBackground(), v.getX(), v.getY(), v.getWidth(),
                    v.getHeight(), this);
        }
    }

}
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;

import javax.swing.JPanel;

public class AddListener extends MouseAdapter implements Runnable {

    private int count = 0;

    private JPanel panel;
    private ArrayList<View> list;

    public AddListener(JPanel panel, ArrayList<View> list) {
        this.panel = panel;
        this.list = list;
    }

    public void mouseReleased(MouseEvent e) {
        if (count % 2 == 0) {
            View plane = new View("plane.jpg", e.getX(), e.getY(), 50, 50, 3,
                    panel);
            list.add(plane);
            count++;
        } else {
            View bullet = new View("bullet.png", e.getX(), e.getY(), 10, 20, 5,
                    panel);
            list.add(bullet);
            count++;
        }
    }

    public void run() {
        while (true) {
            for (int i = 0; i < list.size(); i++) {
                View v = list.get(i);
                v.move();
                if(i!=0)
                    v.collisions(list);
            }

            panel.repaint();

            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }

}
import java.awt.Image;
import java.util.ArrayList;

import javax.swing.ImageIcon;
import javax.swing.JPanel;

public class View {

    private Image background;
    private int x = 0, y = -60, moveY, width, height;
    private JPanel panel;
    private String imageName;

    /**
     * 构造方法
     *
     * @param background背景图片的对象
     * @param x起始X坐标
     * @param y起始Y坐标
     */
    public View(String imageName, int x, int y, int width, int height,
            int moveY, JPanel panel) {
        this.imageName = imageName;
        this.background = new ImageIcon(this.getClass().getResource(imageName))
                .getImage();
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
        this.moveY = moveY;
        this.panel = panel;
    }

    public int getWidth() {
        return width;
    }

    public void setWidth(int width) {
        this.width = width;
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    public Image getBackground() {
        return background;
    }

    public void setBackground(Image background) {
        this.background = background;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }

    public int getMoveY() {
        return moveY;
    }

    public void setMoveY(int moveY) {
        this.moveY = moveY;
    }

    public JPanel getPanel() {
        return panel;
    }

    public void setPanel(JPanel panel) {
        this.panel = panel;
    }

    public void move() {
        if (imageName.equals("background.jpg")) {
            y += moveY;
            if (y == 0)
                y = -60;
        } else if (imageName.equals("bullet.png")) {
            y += moveY;
            if (y >= 400)
                y = 0;
        } else if (imageName.equals("plane.jpg")) {
            y -= moveY;
            if (y <= 0)
                y = 400;
        }
    }

    /**
     * 碰撞方法
     */
    public void collisions(ArrayList<View> list) {
        for (int i = 1; i < list.size(); i++) {
            View v = list.get(i);
            if (this != v) {
                double distance = Math.sqrt((this.x - v.x) * (this.x - v.x)
                        + Math.pow(this.y - v.y, 2));
                if (distance <= this.height + v.height) {
                    System.out.println(v.imageName + "和" + this.imageName
                            + "发生了碰撞");
                }
            }
        }
    }

}
时间: 2024-12-18 04:59:27

java之线程飞机大战制作的相关文章

Java学习二(飞机大战项目)day09

day09 1.子弹与敌人的碰撞 1)在超类中FlyingObject设计hit()实现敌人与子弹/英雄机得碰撞 /** 成员方法:检测敌人与子弹/英雄机的碰撞 * this:敌人 other:子弹 */ public boolean hit(FlyingObject other) { int x1 = this.x - other.width; int x2 = this.x + this.width; int y1 = this.y - other.height; int y2 = this

Python版飞机大战

前面学了java用java写了飞机大战这次学完python基础后写了个python版的飞机大战,有兴趣的可以看下. 父类是飞行物类是所有对象的父类,setting里面是需要加载的图片,你可以换称自己的喜欢的图片,敌机可以分为敌机和奖励,enemy为普通敌人的父类,award为奖励敌机的父类. 各个类的基本属性 主类的大概逻辑 具体的代码: settings配置 import pygame class Settings(object): """设置常用的属性"&quo

Java飞机大战源代码

刚学不久java,做了一个飞机大战的小小小小游戏,现在把这个思路总结以及代码分享出来.大佬别吐槽(emmmmmm .....开发环境:jdk1.7 开发工具:eclipese PlanelJPanel.java 1 package project02; 2 3 import java.awt.BasicStroke; 4 import java.awt.Color; 5 import java.awt.Cursor; 6 import java.awt.Font; 7 import java.a

飞机大战编写以及Java的面向对象总结

面向对象课程完结即可编写一个简单的飞机大战程序.我觉得我需要总结一下 飞机大战中类的设计: 父类:FlyingObject(抽象类) 接口:Award .Enemy 子类:Hero.Bullet.Airplane (实现Enemy接口). Bee (实现Award接口) 运行类:ShootGame Hero.Bullet.Airplane . Bee 均继承自FlyingObject类,FLyingObject具有他们的公共属性以及行为,因为FlyingObject并不需要被实例化,那么大可以将

[知了堂学习笔记]_纯JS制作《飞机大战》游戏_第1讲(实现思路与游戏界面的实现)

整体效果展示: 一.实现思路 如图,这是我完成该项目的一个逻辑图,也是一个功能模块完成的顺序图. 游戏界面的完成 英雄飞机对象实现,在实现发射子弹方法过程中,又引出了子弹对象并实现.在此时,英雄飞机能进行基本操作了. 敌机对象的实现,并且初步完成了boos出现(30s自动出现).然后又引出了许多方法的处理,如英雄子弹击中敌机和boos,英雄与敌机相撞等等.并一一解决. 随后又设置了一些游戏的参数,如血量,关卡数,等级,积分,必杀,道具对象等等. 最后又完成了一些辅助功能,暂停游戏,继续游戏,退出

Cocos2d-x 3.0final 终结者系列教程16-《微信飞机大战》实现

看到cocos2d-x推出了3.1版本,真是每月一次新版本,速度, 还有一个好消息就是http://cn.cocos2d-x.org/上线了,祝贺!啥时候把我的视频和教程放上去呢?!!! 本文介绍一款纵版射击游戏的实现,开发环境: win7 vs2012 cocos2d-x3.0final android adt android ndk r9 首先看下最后的效果: (图1,微信飞机大战运行效果) 源码下载地址:http://download.csdn.net/detail/sdhjob/7513

Python飞机大战实例有感——pygame如何实现“切歌”以及多曲重奏?

目录 pygame如何实现"切歌"以及多曲重奏? 一.pygame实现切歌 初始化路径 尝试一 尝试二 尝试三 成功 总结 二.如何在python多线程顺序执行的情况下实现音乐和音效同时播放? 尝试一 尝试二 尝试三 尝试四 成功 总结 pygame如何实现"切歌"以及多曲重奏? 昨天晚上研究了好久pygame的音乐混合器mixer,出了很多问题后最终成功,不过学习本来也不可能一帆风顺的吗,下面我就来讲一讲我遇到的问题. 一.pygame实现切歌 初始化路径 # 导

安卓飞机大战(二) SurfaceView实现自制背景

用SurfaceView写一个自制的背景图,并且可以移动,加上安卓飞机大战(一)中的BackgroundManager类,可以直接使用 GameView代码: public class GameView extends SurfaceView implements SurfaceHolder.Callback,Runnable{    private SurfaceHolder hd=null;    private Canvas canvas=null;    private Backgrou

js实例--飞机大战

<!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title>飞机大战</title> <style> #did{ width:500px;height:500px; background:url("./images/bg2.png") no-repeat 0px -1036px; position:relative;ove