动画背景java游戏

2024-02-12

我正在编写一个类似于小行星的游戏,但我不明白如何在后台生成小行星。

现在我在主类中生成了一个小行星,但我想为小行星创建一个类,我该怎么做?

主班

public void paintComponent(Graphics g)
{
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;
    if(flag_img)
    {
        background(g2d);  
        logo(g2d);          
        menu(g2d);          
        spaceship(g2d);   
        crediti(g2d);    
    }
}

后台功能(现在)

private void background(Graphics2D g2d) 
{

    asteroidi_g_x+=r.nextInt(4);
    asteroidi_g_y+=r.nextInt(1);
    g2d.drawImage(asteroidi_g[0], asteroidi_g_x,asteroidi_g_y,this);
}

后台功能(我想要的)

private void background(Graphics2D g2d) 
{
    asteroid asteroid = new asteroid[10];
}

和类小行星

public class asteroid extends JPanel implements ActionListener
{
   private BufferedImage images_asteroid;
   private boolean flag_img;

   private JPanel jp;

   private int x,y;

   public asteroide_grande(JPanel jp)
   {
    flag_img = true;
    x = (jp.getWidth()/2);
    y = (jp.getHeight()/2);
    this.jp = jp;

        try {
            images_asterod = ImageIO.read(this.getClass().getResource("images/asteroid/a1.png"));
        } catch(IOException e){flag = false;}
}

@Override
public void paintComponent(Graphics g)
{
    super.paintComponent(g);
   if(flag_img)
  {
        g.drawImage(images_asteroid, 100, 100,this);
  }
}


@Override
public void actionPerformed(ActionEvent e) 
{
    x=x-1;
    y=y+1;
    repaint();
}

类中的 PaintComponent 方法不起作用


  1. 没有你的Asteroid类扩展JPanel。相反,将其作为小行星数据建模并具有数据操作方法的类。您还想拥有一个draw方法采用Graphic语境。就像是

    public class Asteroid {
        Image asteroidImage;
        JPanel panel;
        int x, y;
    
        public Asteroid(JPanel panel, Image image, int x, int y) {
            this.panel = panel;
            this.asteroidImage = image;
            this.x = x;
            this.y = y;
        }
    
        public void drawAsteroid(Graphics g) {
            g.drawImage(asteroidImage, x, y, panel);
        }
    
        public void move() {
            x += 5;
        }
    }
    
  2. 现在您有了小行星的模型,您可以创建一个List of Asteriod对象并迭代它们并使用它drawAsteroid方法来绘制它们。就像是

    public class GamePanel extends JPanel {
        List<Asteroid> asteroids;
        Image asteroidImage;
    
        public GamePanel(){
            asteroidImage = ...
            asteroids = new ArrayList<>();
            asteroids.add(new Asteroid(GamePanel.this, asteroidImage, 100, 100));
            // add more asteriods
        }
    
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            for (Asteriod asteroid: asteriods) {
                asteriod.drawAsteroid(g);
            }
        }
    }
    
  3. 要为它们设置动画,您需要使用javax.swing.Timer。更多信息请访问如何使用 Swing 计时器 http://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html。你会想要操纵Asteriod数据在Timer。使用上面提供的代码,您可以直接调用它move方法,然后调用repaint()。就像是

    public GamePanel(){
        ...
        Timer timer = new Timer(30, new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                Iterator it = asteroids.iterator();
                while (it.hasNaext()) {
                    Asteroid asteriod = (Asteroid)it.next();
                    asteroid.move();
                }
            }
        });
    }
    

您可以看到一堆更完整的动画多个对象的示例here https://stackoverflow.com/a/21871022/2587435 and here https://stackoverflow.com/a/21593458/2587435 and here https://stackoverflow.com/a/21534549/2587435 and here https://stackoverflow.com/a/21801845/2587435 and here https://stackoverflow.com/a/22123304/2587435


这是一个完整的例子。你会看到我包括了Rectangle2D对象在Astreroid班级。这只是当您想检查碰撞检测时。你应该移动Rectangle2D x and/or y与每一个Asreroid的运动x and y。然后你可以检查是否asteroid.rectangle.intersects(someOtherObject)

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class AsteroidBackground extends JPanel {

    private static final int D_W = 400;
    private static final int D_H = 600;
    BufferedImage asteroidImage;
    BufferedImage background;
    List<Asteroid> asteroids;
    Random random = new Random();
    int countToAddAsteroid = 0;
    int y;

    public AsteroidBackground() {
        try {
            asteroidImage = ImageIO.read(getClass().getResource("/resources/small-asteroid.png"));
            background = ImageIO.read(getClass().getResource("/resources/space.png"));
        } catch (IOException ex) {
            Logger.getLogger(AsteroidBackground.class.getName()).log(Level.SEVERE, null, ex);
        }
        asteroids = new ArrayList<>();
        y = 0 - asteroidImage.getHeight();

        Timer timer = new Timer(40, new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                if (countToAddAsteroid >= 25) {
                    int randX = random.nextInt(D_W);
                    asteroids.add(new Asteroid(AsteroidBackground.this, asteroidImage, randX, y));
                    countToAddAsteroid = 0;
                }
                countToAddAsteroid++;
                Iterator it = asteroids.iterator();
                while (it.hasNext()) {
                    Asteroid asteroid = (Asteroid)it.next();
                    if (asteroid.y >= D_H) {
                        it.remove();
                    } else {
                         asteroid.move();
                    } 
                }
                repaint();
            }
        });
        timer.start();
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(background, 0, 0, this);
        for (Asteroid asteroid : asteroids) {
            asteroid.drawAsteroid(g);
        }
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(D_W, D_H);
    }

    public class Asteroid {
        Rectangle2D rectangle;
        Image asteroidImage;
        JPanel panel;
        int x, y;

        public Asteroid(JPanel panel, Image image, int x, int y) {
            this.panel = panel;
            this.asteroidImage = image;
            this.x = x;
            this.y = y;
            rectangle = new Rectangle2D.Double(
                    x, y, image.getWidth(panel), image.getHeight(panel));
        }

        public void drawAsteroid(Graphics g) {
            g.drawImage(asteroidImage, x, y, panel);
        }

        public void move() {
            y += 5;
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new AsteroidBackground());
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动画背景java游戏 的相关文章

  • 最终字段可能尚未/已经初始化[重复]

    这个问题在这里已经有答案了 可能的重复 如何处理抛出检查异常的静态最终字段初始值设定项 https stackoverflow com questions 1866770 how to handle a static final field
  • 探索java图像处理的好资源[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我是图像处理领域的新手 请推荐一些好的资源 书籍和网络链接 来学习 Java 中的图像处理 最适合隐写术分析 适合初学者和高级水平 我看过
  • Java:无安全管理器:RMI 类加载器已禁用

    您好 我有 RMI 应用程序 现在我尝试从客户端调用服务器上的一些方法 我有以下代码 public static void main final String args try Setting the security manager Sy
  • 为什么Java中的文件名与公共类名相同? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在Java中 文件名应该与文件名相同public class包含在该文件中 为什么这是一个限制 它有什么目的 Java 有一个有趣的方法 如果给
  • AWS SDK 2 承担角色

    Bean public DynamoDbClient amazonDynamoDB final AssumeRoleRequest assumeRoleRequest AssumeRoleRequest builder roleSessio
  • 为什么我的 @OneToMany 属性出现主键违规?

    我有一个实体 Entity public class Student GeneratedValue strategy GenerationType AUTO Id private long id OneToMany private Set
  • 外部实体更改后索引不更新

    我目前正在开发一个项目 使用 JPA 2 1 保存数据并使用 hibernate search 4 5 0 final 搜索实体 映射类和索引后 搜索工作正常 但是 当我更改值时描述B 类从 someStr 到 anotherStr 数据库
  • 如何在 Python 中加密并在 Java 中解密?

    我正在尝试在 Python 程序中加密一些数据并将其保存 然后在 Java 程序中解密该数据 在Python中 我像这样加密它 from Crypto Cipher import AES KEY 1234567890123456789012
  • 生产者程序中的 kafka 网络处理器错误(ArrayIndexOutOfBoundsException:18)

    我有下面的 kafka Producer Api 程序 我对 kafka 本身是新手 下面的代码从 API 之一获取数据并将消息发送到 kafka 主题 package kafka Demo import java util Propert
  • java 中的 Try-with-resources 和 return 语句

    我想知道是否放一个return里面的声明尝试资源block 防止资源自动关闭 try Connection conn return conn createStatement execute 如果我写这样的东西将会联系被关闭 Oracle 文
  • 使用 equals 方法比较两个对象,Java

    我有一个对象数组 我想将它们与目标对象进行比较 我想返回与目标对象完全匹配的对象的数量 这是我的计数方法 public int countMatchingGhosts Ghost target int count 0 for int i 0
  • 开发人员实际上是否使用 vim 在 Windows 操作系统上编写代码(Java)? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 按名称获取 ArrayList

    这是正确的获取方式吗ArrayList
  • Java:java.util.Preferences 失败

    我的程序将加密的产品密钥数据保存到计算机上java util Preferences类 系统首选项 而不是用户 问题是 在 Windows 和 Linux 上 尚未在 OSX 上测试过 但可能是相同的 如果我不运行该程序sudo或者具有管理
  • java中的第三个布尔状态是什么?

    虽然我知道根据定义 布尔值仅包含两种状态 真或假 我想知道布尔值在用这些状态之一初始化之前有什么值 它默认为 false http java sun com docs books tutorial java nutsandbolts dat
  • 将 PropertyPlaceholderConfigurer 中的所有属性注入到 bean 中

    我有一个PropertyPlaceholderConfigurer加载多个属性文件 我想通过配置 XML 将合并的属性映射注入到 Spring Bean 中 我可以这样做以及如何做 您只需创建一个属性 bean 并将其用于您的Propert
  • 如何在 Java 中创建一个带有连字符的值的静态枚举?

    如何创建如下所示的静态枚举 static enum Test employee id employeeCode 截至目前 我遇到了错误 这对于 Java 来说是不可能的 因为每个项目都必须是有效的标识符 并且有效的 Java 标识符可能不包
  • Java给定长度的随机数

    我需要在 Java 中生成一个恰好 6 位数字的随机数 我知道我可以在随机发生器上循环 6 次 但是在标准 Java SE 中还有其他方法可以做到这一点吗 要生成 6 位数字 Use Random http download oracle
  • 测量 tomcat 的排队请求数

    因此 使用tomcat 您可以设置acceptCount值 默认为100 这意味着当所有工作线程都忙时 新连接被放置在队列中 直到队列满 之后它们被拒绝 我想要的是监视此队列中项目的大小 但无法确定是否有办法通过 JMX 获取此值 即不是队
  • while循环只执行一次

    我很难弄清楚为什么 while 循环实际上不会循环 它运行一次并停止 import java util public class mileskm public static void main String args Scanner inp

随机推荐

  • WSDL 中的 有什么区别?

    Both
  • 为什么 64 位比 32 位更快?

    我一直在进行一些性能测试 主要是为了了解迭代器和简单 for 循环之间的区别 作为其中的一部分 我创建了一组简单的测试 然后对结果感到非常惊讶 对于某些方法 64 位比 32 位快近 10 倍 我正在寻找的是对为什么会发生这种情况的一些解释
  • 通过 Oracle SQL 查询拆分行中列的逗号分隔值

    我有一个如下表 ID NAME 1001 A B C 1002 D E F 1003 C E G 我希望这些值显示为 ID NAME 1001 A 1001 B 1001 C 1002 D 1002 E 1002 F 1003 C 1003
  • 为什么最大堆栈深度不断变化?

    对于以下代码 最后的输出 最大堆栈深度不断变化 include
  • Facebook 新的用于图形 API 的 PHP SDK - 多查询

    我对查询参数值应该是什么样子一筹莫展 因此 据我所知 要在图形 API 库中提交多重查询 以下是执行它的代码方法 param array method gt fql multiquery queries gt multiQuery call
  • Amazon Elastic Block Storage (EBS) 和 Microsoft Azure 驱动器之间的差异

    我一直在考虑使用 Amazon EC2 或 Microsoft Azure 来托管新项目 并计划使用其中之一亚马逊EBS http aws amazon com ebs or 微软Azure驱动器 http www microsoft co
  • 组合框更改其他组合框的值

    我的表单上有两个组合框 每个都有值 Yes 和 No 我想要的是当一个改变时另一个得到相反的结果 如果第一个是 Yes 另一个是 No 我需要用 Javascript 来做 我看到这个问题如何使用 JavaScript 更改组合框中的 选定
  • C++ 从 const int* 到 int* 的转换会产生意想不到的结果[重复]

    这个问题在这里已经有答案了 在c 中 我们知道我们不能将const int 转换为int 但我有一个代码片段 可以将 const int 转换为 int 我是 C 的初学者 我在 google 上搜索了这个 但我刚刚得到了提到 const
  • Angular 应用程序中的空注释

    是否有任何配置设置可以删除这些空注释和空格 我的构建命令是ng build environment prod progress false target productiontsconfig 是 compileOnSave false co
  • Mysql 在键上连接两个表

    我正在尝试连接两个表 但似乎遇到问题 我正在寻找的输出是有主题的行数 SELECT FROM education AS a JOIN keys2 AS b USING List Idsubjek WHERE List Idsubjek IN
  • 在 C++ 中使用类似 C 的初始化或构造函数初始化是否被认为更好? [复制]

    这个问题在这里已经有答案了 可能的重复 什么时候应该使用直接初始化 什么时候应该使用复制初始化 https stackoverflow com questions 4293596 when should you use direct ini
  • Django Memcached 缓存消失

    我的 Django 应用程序配置了 memcached 一切都运行顺利 我试图随着时间的推移填充缓存 并在新数据从外部 API 传入时添加到缓存中 这是我正在进行的事情的要点 主视图 api query more results apiQu
  • WPF C# 设计问题中绘制图表

    一个月前 我有一个项目 我使用 Windows 窗体在应用程序中绘制了股票图表 我通过创建一个可以拉伸到窗口尺寸的位图来做到这一点 这将允许我的图表随窗口调整大小 我现在正在使用 WPF 扩展该项目 我一直在尝试为该项目进行设计 但我似乎不
  • C/C++ 中的指针帮助 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想了解 C 和 C 中的指针 它如
  • 如何在 VueJS 中测试全局事件总线

    In this article https medium com vuejobs create a global event bus in vue js 838a5d9ab03a解释了如何在 VueJS 中使用全局事件总线 它描述了使用在单
  • 从命令提示符创建 apk 文件

    我想从命令提示符创建 apk 文件 为此我遵循这个链接 http developer android com guide developing building building cmdline html 并尝试用 ant 完成它 但它给了
  • Python while循环输出到List

    我编写了一个简单的代码 它将 wav 文件作为输入 然后查找频率并返回相应的音符 但是 为了添加更多功能 我需要输出为列表 我所拥有的简化伪代码如下所示 while some condition true compute various t
  • 是否可以使用 sha1 和 sha256 证书对安装程序和卸载程序进行双重签名?

    Inno Setup 中是否可以同时使用 sha1 和 sha256 对卸载程序和安装程序进行签名 我知道它是可以签署 https stackoverflow com a 30671378 1329977通过命令工具具有两个证书的可执行文件
  • 如何解决 Gradle 构建中的存储库证书错误

    我安装了最新版本的android studio 我已经安装了jdk 8 当我打开 android studio 时 出现以下错误 Unable to resolve dependency for app debugUnitTest comp
  • 动画背景java游戏

    我正在编写一个类似于小行星的游戏 但我不明白如何在后台生成小行星 现在我在主类中生成了一个小行星 但我想为小行星创建一个类 我该怎么做 主班 public void paintComponent Graphics g super paint