简体   繁体   English

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

[英]How to make an image move from left to right in 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. 我通常会使用Sliding平台,但是当我尝试实现它时它不起作用。 I am still a beginner in java so i am grateful for your help. 我仍然是java的初学者,所以我很感谢你的帮助。

This is the code of my Java Class: 这是我的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();
     }
  }
}

Just to be clear i would like everyone i include this class onto a platform it moves from left to right. 为了清楚起见,我希望每个人都将这个课程包含在一个从左到右移动的平台上。

Many Thanks, 非常感谢,

Moe

This will depend a lot on what you individual requirements, but the basic concepts will remain the same. 这将取决于您个人的要求,但基本概念将保持不变。

Any type of animation in Swing must be executed in such away that it does not block the Event Dispatching Thread. Swing中的任何类型的动画都必须以不会阻止事件调度线程的方式执行。 Any blocking action on the EDT will prevent any repaint request (amongst other things) from been processed. 对EDT的任何阻止操作都将阻止处理任何重绘请求(以及其他内容)。

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" 这个简单的例子使用了一个javax.swing.Timer ,它每40毫秒左右(约25 fps)滴答并更新一个小“球”的位置

More complex iterations would require a dedicated Thread . 更复杂的迭代需要专用的Thread This makes the whole process far more complex as 这使整个过程变得更加复杂

  1. You should never update/create/modify/change any UI component (or property that the UI may require to perform painting) from any thread other then the EDT 您永远不应该从EDT以外的任何线程更新/创建/修改/更改任何UI组件(或UI可能需要执行绘制的属性)
  2. You don't control the paint process. 您无法控制绘制过程。 This means a repaint may occur at anytime and if you are modifying any property/object that the paint process requires to render the state of the game, it could cause inconsistencies. 这意味着可以随时进行重新绘制,如果要修改绘制过程呈现游戏状态所需的任何属性/对象,则可能导致不一致。

.

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

    }

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM