到目前为止,我已经在下面创建了该类,但是,现在我想插入一个代码,以使图像从左到右,从右到左滑动。我通常会使用滑动平台,但是当我尝试实现它时,它将无法正常工作。我仍然是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)跳动一次,并更新一个小“球”的位置
更复杂的迭代将需要专用的Thread
。这使得整个过程变得更加复杂,因为
除EDT之外,您永远不要从其他任何线程更新/创建/修改/更改任何UI组件(或UI可能需要执行绘画的属性)
您无法控制喷涂过程。这意味着重新绘制可能随时发生,并且如果您正在修改绘制过程呈现游戏状态所需的任何属性/对象,则可能导致不一致。
。
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/