[英]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 这使整个过程变得更加复杂
. 。
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.