java - Java中如何使图像从左向右移动

标签 java netbeans

到目前为止,我已经创建了下面的类,但是,现在我想插入一个代码以使图像从左到右和从右到左滑动。我通常会使用滑动平台,但是当我尝试实现它时它不起作用。我还是一个java初学者,所以我很感谢你的帮助。

这是我的 Java 类的代码:

package game;

import city.soi.platform.*;

public class Enemy extends Body implements CollisionListener{

private Game game ;

    public Enemy(Game g){
        super(g.getWorld(), new PolygonShape(-27.0f,25.0f, -27.0f,-24.0f, 25.0f,-24.0f, 26.0f,25.0f, -27.0f,25.0f));
        setImage(new BodyImage("images/enemy.png"));
        g.getWorld().addCollisionListener(this);    
        game = g;
    }

    public void collide(CollisionEvent e) {
        if (e.getOtherBody() == game.getPlayer()){
         game.getPlayer().subtractFromScore(75);
         System.out.println("You have just lossed 75 Points! Current Score =  " + game.getPlayer().getScore());
         this.destroy();
     }
  }
}

需要明确的是,我希望每个人都将此类包含到从左到右移动的平台上。

非常感谢,

最佳答案

这在很大程度上取决于您的个人要求,但基本概念保持不变。

Swing 中任何类型的动画都必须以不阻塞事件调度线程的方式执行。 EDT 上的任何阻止操作都将阻止处理任何重绘请求(除其他外)。

这个简单的示例使用 javax.swing.Timer,每 40 毫秒左右(约 25 fps)滴答一次,并更新小“球”的位置

更复杂的迭代需要专用的线程。这使得整个过程变得更加复杂

  1. 您不应该从除 EDT 之外的任何线程更新/创建/修改/更改任何 UI 组件(或 UI 可能需要执行绘制的属性)
  2. 您无法控制绘制过程。这意味着重新绘制可能随时发生,如果您正在修改绘制过程渲染游戏状态所需的任何属性/对象,则可能会导致不一致。

.

public class SimpleBouncyBall {

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

    public SimpleBouncyBall() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception ex) {
                }

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new CourtPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class CourtPane extends JPanel {

        private Ball ball;
        private int speed = 5;

        public CourtPane() {
            Timer timer = new Timer(40, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    Rectangle bounds = new Rectangle(new Point(0, 0), getSize());
                    if (ball == null) {
                        ball = new Ball(bounds);
                    }
                    speed = ball.move(speed, bounds);
                    repaint();
                }
            });
            timer.setRepeats(true);
            timer.setCoalesce(true);
            timer.start();
        }

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

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g); 
            if (ball != null) {
                Graphics2D g2d = (Graphics2D) g.create();
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
                Point p = ball.getPoint();
                g2d.translate(p.x, p.y);
                ball.paint(g2d);
                g2d.dispose();
            }
        }

    }

    public class Ball {

        private Point p;
        private int radius = 12;

        public Ball(Rectangle bounds) {

            p = new Point();
            p.x = 0;
            p.y = bounds.y + (bounds.height - radius) / 2;

        }

        public Point getPoint() {
            return p;
        }

        public int move(int speed, Rectangle bounds) {

            p.x += speed;
            if (p.x + radius >= (bounds.x + bounds.width)) {

                speed *= -1;
                p.x = ((bounds.x + bounds.width) - radius) + speed;

            } else if (p.x <= bounds.x) {

                speed *= -1;
                p.x = bounds.x + speed;

            }

            p.y = bounds.y + (bounds.height - radius) / 2;

            return speed;

        }

        public void paint(Graphics2D g) {
            g.setColor(Color.RED);
            g.fillOval(0, 0, radius, radius);
        }

    }

}

关于java - Java中如何使图像从左向右移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15443533/

相关文章:

java - 在android中应用ScaleAnimation后如何缩放 View 的点击/触摸区域?

java - NetBeans + Microsoft SQL Server 2012 jbdc 驱动程序

javascript - 使用 Netbeans Ide 进行 HTML 项目,无需 Java

java - CodeNameOne 设计器堆设置在哪里?

mysql - 在 NetBeans 中从数据库创建实体时出错

java - Netbeans - 访问 txt 文件,以便应用程序在 netbeans 之外工作 - 在哪里找到该文件?

java - 使用 Println 显示父类(super class)方法的结果

java - Java equals 方法的良好设计

java - REST最佳实践,用于检索元素的特定子集

java - 从文本文件中返回随机行