swing-如何在PlanePanel里面实现小型敌机的下落,好混乱啊

问题描述

如何在PlanePanel里面实现小型敌机的下落,好混乱啊

package start;

import javax.swing.ImageIcon;
import javax.swing.JFrame;

public class StartFrame extends JFrame{
/**
*
*/
public int x;
public int y;
public static StartFrame startFrame;
private static final long serialVersionUID = 1L;

public StartFrame(){

//设置窗体大小
this.setSize(400, 654);
//设置窗口居中显示
//this.setLocationRelativeTo(null);
this.setLocation(150, 50);
//设置任务栏图标
this.setIconImage(new ImageIcon("image/icon.jpg").getImage());
//去掉窗体的自带边框
this.setUndecorated(true);  

StartPanel sp = new StartPanel();
this.add(sp);
this.setVisible(true);              //默认窗体可见  放在  this.add(sp);后面

//启动线程
Thread th = new Thread(sp);
th.start();

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

startFrame = new StartFrame();

}

}

package start;

import java.awt.Graphics;

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

import enemy.Enemy;
import enemy.EnemyMoveThread;

public class StartPanel extends JPanel implements Runnable {
/**
* 通过鼠标来控制MouseMontionListener
* 重写mouseMovie() ——————测试语句
* 给面板添加监听器
* panel.addMouseMontionListener(面板);
* 点关闭图标关闭
* 点击缩小图标
* 实现MouseListener接口
* 重写
*/
private static final long serialVersionUID = 1L;
int x;
StartPanel sp;
Enemy e;

public void paint(Graphics g) {
    // TODO Auto-generated method stub
    super.paint(g);
    g.drawImage(new ImageIcon("image/startback.png").getImage(), 0, 0, this);
    g.drawImage(new ImageIcon("image/start_aircraft.png").getImage(), x,450, this);
}

public void run() {
    // TODO Auto-generated method stub
    while (true) {
        x++;
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        if (x > 400) {
            // 隐藏StartFrame的窗体
            StartFrame.startFrame.dispose();

            /*
             * 获得左上角的坐标 int x = StartFrame.startFrame.getLocation().x;int y
             * = StartFrame.startFrame.getLocation().y;
             */

            // 创建新的PlaneFrame窗口
            new PlaneFrame();
            break;
        }
        repaint();
    }
}

}

package start;

import javax.swing.ImageIcon;
import javax.swing.JFrame;

import enemy.Enemy;
import enemy.EnemyMoveThread;
/**

  • 当StartFrame的小飞机飞到最右边时,Start窗口隐藏(this.disapose()),显示新的窗口PlaneFrame
  • 创建新的面板
    封装低级Enemy xy score image speed isLive panel;
    */
    public class PlaneFrame extends JFrame implements Runnable{
    /
    *

    • */
      PlanePanel pp;
      Enemy e;
      public static PlaneFrame planeFrame; //定义全局变量:可以在所有位置使用
      private static final long serialVersionUID = 1L;

    public PlaneFrame(){
    this.setSize(400, 654);
    //x y?

    this.setLocation(150,50);
    this.setIconImage(new ImageIcon("image/icon.jpd").getImage());
    this.setUndecorated(true);
    pp = new PlanePanel(this);
    this.add(pp);
    pp.addMouseMotionListener(pp); //第一个pp代表面,,第二个pp代表监听器对象
    //给面板添加监听器对象
    pp.addMouseListener(pp);
    EnemyMoveThread emt = new EnemyMoveThread(e);
    emt.start();
    this.setVisible(true);

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

    planeFrame = new PlaneFrame();
    }
    public void run() {

    //如果英雄机存活,创建敌机
    while(pp.hero_isLive){
    //x, y, speed, icon, panel
    /*
    * Random r = new Random();
    /
    ImageIcon icon = new ImageIcon("image/shoot0_0.png");
    //大类型的数据不能直接赋值给小类型的数据,需要强制性转换
    int x = (int) (Math.random()
    (pp.getWidth()-icon.getIconWidth()));
    int y = -icon.getIconHeight();
    int speed = 10;

    //创建敌机  添加集合之中
    Enemy e = new Enemy(x,y,speed,icon,pp);
    //将敌机添加到集合中
    pp.vs.add(e);
    //给敌机绑定运动的线程
    EnemyMoveThread th = new EnemyMoveThread(e);
    th.start();
    try {
        Thread.sleep(10);
    } catch (InterruptedException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    

    }
    }

    }

package start;

import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.Random;
import java.util.Vector;

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

import enemy.Enemy;

public class PlanePanel extends JPanel implements MouseListener,
MouseMotionListener {

// 定义布尔类型isLive(存活)
private boolean isLive = true;
int x;
int hero_x = 200;
int hero_y = 500;
boolean hero_isLive = true;
PlaneFrame f;

ImageIcon icon = new ImageIcon("Image/hero.png");
ImageIcon min = new ImageIcon("image/min.png");

// 定义一个集合存放敌机
// Vector集合避免线程异步的问题 线程安全的一个线程
public Vector<Enemy> vs = new Vector<Enemy>();

// 通 过 构造方法 传值
public PlanePanel(PlaneFrame planeFrame) {
    this.f = planeFrame;
}

public void paint(Graphics g) {
    // TODO Auto-generated method stub
    super.paint(g);

    g.drawImage(new ImageIcon("image/backmain.png").getImage(), 0, 0, this);
    g.drawImage(new ImageIcon("image/min.png").getImage(), 325, 3, this);
    g.drawImage(new ImageIcon("image/close.png").getImage(), 360, 3, this);
    g.drawImage(new ImageIcon("image/hero.png").getImage(), hero_x, hero_y,
            this);
    for(int i = 0;i<vs.size();i++){
        Enemy e = vs.get(i);
        e.drawEnemy(g);
    }
}

public void mouseDragged(MouseEvent arg0) {
    // TODO Auto-generated method stub

}

public void mouseMoved(MouseEvent e) {
    // TODO Auto-generated method stub
    if (hero_isLive) {
        int x = e.getX(); // 得到鼠标的x坐标
        int y = e.getY(); // 得到鼠标的y坐标
        // 根据鼠标的坐标与英雄机的宽和高计算英雄机的坐标
        hero_x = x - icon.getIconWidth() / 2;
        hero_y = y - icon.getIconHeight() / 2;

        if (hero_x <= 400 - 55 && hero_y >= 31 && hero_y <= 650 - 90
                && hero_x >= -40) {
            this.repaint();
        }
    }
    //
}

public void mouseClicked(MouseEvent e) {
    // TODO Auto-generated method stub
    int x = e.getX();
    int y = e.getY();
    if (x > 325 && x < 325 + min.getIconWidth() && y > 3
            && y < min.getIconHeight()) {
        // 缩小窗体
        f.setState(JFrame.ICONIFIED);
    } else if (x > 360 && x < 360 + 31 && y > 3 && y < 3 + 31) {
        System.exit(0); //
    }
}

public void mouseEntered(MouseEvent arg0) {
    // TODO Auto-generated method stub

}

public void mouseExited(MouseEvent arg0) {
    // TODO Auto-generated method stub

}

public void mousePressed(MouseEvent arg0) {
    // TODO Auto-generated method stub

}

public void mousePressed1(MouseEvent arg0) {
    // TODO Auto-generated method stub

}

public void mouseReleased(MouseEvent arg0) {
    // TODO Auto-generated method stub

}

}

package enemy;

import java.awt.Graphics;

import javax.swing.ImageIcon;

import start.PlanePanel;

public class Enemy {
int x;
int y;
int speed;
int score = 100;
ImageIcon icon;
boolean isLive = true;
PlanePanel panel;

 public Enemy(){

 }

public Enemy(int x, int y, int speed, ImageIcon icon, PlanePanel panel) {
    super();
    this.x = x;
    this.y = y;
    this.speed = speed;
    this.icon = icon;
    this.panel = panel;
}
//画敌机的方法
public void drawEnemy(Graphics g){
    if(isLive){
        g.drawImage(icon.getImage(),x,y,panel);
    }

}
public void move(){
    y += speed;
    //如果敌机飞出面板,删除该敌机,并且isLive设置成false
    if(y>panel.getHeight()){
        isLive = false;
        panel.vs.remove(this);
    }
    panel.repaint();
}

}

package enemy;

//封装敌机运动的线程类
public class EnemyMoveThread extends Thread {

// 创建成员变量e
Enemy e;

public EnemyMoveThread(Enemy e) {
    this.e = e;
}

@Override
public void run() {

    super.run();
    while (e.isLive) {
        //
        e.move();
        try {
            Thread.sleep(100);
        } catch (InterruptedException e1) {

            e1.printStackTrace();

        }
    }
}

}

解决方案

小型DBMS(c实现)

解决方案二:

http://blog.sina.com.cn/s/blog_c26367dd0101u4nw.html

解决方案三:

上一个问题帮你回答了,你能先采纳了不。

时间: 2024-11-01 13:55:10

swing-如何在PlanePanel里面实现小型敌机的下落,好混乱啊的相关文章

对Java初学者的一些建议

Java编程的准备:对Java进行编程之前,你需要一个编译器,用于将Java源代码转换为字节码.在过去,唯一可供选择的只有Sun公司的JDK.现在你有更多种的选择了,比如能够编译生成class文件.本地exe文件的GNU公司的 GCJ .jikes以及IBM的开源工具.另外, 你还需要一个Java虚拟机,它被俗称为"机器中的机器",用于获取Java字节码并在目标处理器上将它们转换成机器语言.它们可以帮助你干很多事,前提是你得保证javac 编译器和Java JRE 虚拟机的运行正常.

请问这种布局如何在swing中实现

问题描述 作业只学了简单的布局管理器,这种不知道如何实现,请教大家! 解决方案 解决方案二:这个是box布局吧解决方案三:晕错了刚刚看了一眼是网格布局java.awt.GridLayout()解决方案四:中间是网格,可是上面还有按钮那一行和最下面的状态栏那一行并要求中间的网格是可以动态调整大小的解决方案五:我..楼上楼主小号啊这么多要求啊这就不是一个布局了是一个组合的啊整体上用box中间的用网格的动态调整大小是什么意思啊解决方案六:实在有复杂要求就得自己画了呵呵解决方案七:实在有复杂要求就得自己

如何在swing中显示word excel 等

问题描述 RT按格式显示像什么表格啊图片啊都能显示的方法在线等到解决QQ:99296428说明来意谢谢各位先了.我是要在swing中显示.再说清楚一点是要再panel中显示的不是去打开一个word文档 解决方案 本帖最后由 rouge_reset 于 2009-11-13 15:19:52 编辑解决方案二:再说清楚一点是要再panel中显示的不是去打开一个word文档解决方案三:能做出来的话,微软也别在这世界上混了!解决方案四:只知道在网页里JSP能生excel...解决方案五:引用2楼bao1

如何在Frontpage2003中运用css设置网页字体

css|frontpage|网页 在网页界面的设计过程中,许多人考虑最多的是用什么图形与色彩来装饰网页,或是在网页上加上什么动画特效:而对于网页的字体却不太重视.结果往往是有些网站的字体不是太小就是太大,严重影响阅览;而有的网站整页用的都是标准字体,毫无个性而言.其实,字体作为网站内容的载体,有其独特的重要性,是不应该忽视的. 运用Html,我们可以对字体的大小及字形进行简单的修改,但要进行统一地控制.创建特殊效果,就必须要用到css.它能让您更有效地控制网页外观,并可以扩充精确指定网页元素位置

如何在.NET中访问MySQL数据库

mysql|访问|数据|数据库 摘要 MySQL作为一种小型关系数据库,它以低廉的价格.强大的功能.不俗的速度和开放源码的特性赢得了大量中小型企业及个人用户的青睐.但是在.NET中访问MySQL数据库却并没有想象中那么方便,因为.NET OleDb Data Provider和MySQL的兼容性并不理想.本文介绍了两种在.NET中访问MySQL数据库的方法,并对这两种方法做了一个简单的性能对比. 引言 如果你不是只在大集团公司工作过的话,你一定会有机会接触到MySQL,虽然它并不支持事务处理,存

SWT、Swing或AWT:哪个更适合您?

本文通过对 Eclipse 的 SWT 和 Java Swing.Abstract Windows Toolkit(AWT)GUI 工具包进行比较,可以帮助新应用程序的开发人员从中选择适当的工具.您可以通过本文了解对每个工具包的基本特性的介绍,以及使用每个工具包的优缺点. 简介 developerWorks 上另外一些作者已经展示了如何在 Swing 和 SWT 之间很好地进行迁移(参见 参考资料).本文的目标是帮助您在开始开发项目之前确定选择使用哪个 GUI 工具包. 但是首先我们要弄清一个问

将Java Swing应用程序连接到Geronimo服务器

创建可以与 Geronimo EJB 应用程序对话的独立客户端 简介 本文将展示如何开发可以与运行在 Geronimo 应用服务器内部的 EJB 应用程 序通信的独立(胖)客户端.基于我的前两篇文章 --"将数据库连接到 Geronimo 应用服务器的三种方法"(developerWorks,2005 年 6 月)和"利 用 Geronimo 深入 EJB Web 应用程序"(developerWorks,2005 年 7 月)- - 本文向您展示一个连接到使用 G

Swing中的并发-使用SwingWorker线程模式

本文介绍Java SE 6中的SwingWorker线程工作模式,翻译Concurrency in Swing(http://java.sun.com/docs/books/tutorial/uiswing/concurrency/index.html). author: ZJ 2007-7-16 Blog: http://zhangjunhd.blog.51cto.com/ 本文将讨论并发机制在Swing编程中的应用. 谨慎地使用并发机制对Swing开发人员来说非常重要.一个好的Swing程序

Java GUI:SWT/Swing/AWT的介绍及比较

本文通过对 Eclipse 的SWT 和 Java Swing.Abstract Windows Toolkit (AWT)GUI 工具包进行比较,可以帮助新应用程序的开发人员从中选择适当的 工具. 您可以通过本文了解对每个工具包的基本特性的介绍,以及使用 每个工具包的优缺点. 简介 developerWorks 上另外一些作者已 经展示了如何在 Swing 和 SWT 之间很好地进行迁移(参见 参考资料).本文 的目标是帮助您在开始开发项目之前确定选择使用哪个 GUI 工具包. 但 是首先我们