如何使图像在Java中从左向右移动 [英] How to make an image move from left to right in Java

查看:244
本文介绍了如何使图像在Java中从左向右移动的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

so far i have created the class below, however, now i would like to insert a code to make the image slide from left to right and right to left. I would normally use the Sliding platform however it doesn't work when i try to implement it. I am still a beginner in java so i am grateful for your help.

这是我的Java类的代码:

This is the code of my Java Class:

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();
     }
  }
}

为了清楚我会像所有人一样,我将这个课程包含在一个平台上,从左到右移动。

Just to be clear i would like everyone i include this class onto a platform it moves from left to right.

非常感谢,

Moe

推荐答案

这将取决于你个人的要求,但基本概念将保持不变。

This will depend a lot on what you individual requirements, but the basic concepts will remain the same.

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

Any type of animation in Swing must be executed in such away that it does not block the Event Dispatching Thread. Any blocking action on the EDT will prevent any repaint request (amongst other things) from been processed.

这个简单的示例使用 javax.swing。定时器每40毫秒左右(约25 fps)滴答并更新小球的位置

This simple example uses a javax.swing.Timer that ticks every 40 milliseconds or so (about 25 fps) and updates the position of a small "ball"

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

More complex iterations would require a dedicated Thread. This makes the whole process far more complex as


  1. 您永远不应该更新/创建/修改/更改任何UI组件(或UI的属性)可能需要从EDT以外的任何线程执行绘画)

  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中从左向右移动的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆