gpt4 book ai didi

java - 使用 java.swingTimer 重复动画

转载 作者:行者123 更新时间:2023-12-02 05:47:18 25 4
gpt4 key购买 nike

我正在使用动画图形编写游戏 bean 机(高尔顿盒)的代码。我正在使用 swing.Timer 通过让 Timer 对象采用 ActionListener 来使红球移动。

这是输出:这里的红球正在随机移动: http://imgur.com/J9Xq0t5&HIv1udp在这里它到达底部: http://imgur.com/J9Xq0t5&HIv1udp#1

问题是我想让几个球不仅移动 1 个,但实际上做不到,我尝试将 Timer 对象放入循环中,但它只会加速球的运动。

这是我编写的代码:

import java.awt.*;
import java.awt.event.*;
import java.util.Random;
import java.util.Scanner;
import javax.swing.*;


public class GameBean extends JFrame{
private int nSlots;
private int balls;

public GameBean (int nSlots, int balls){
this.balls=balls;
this.nSlots=nSlots;
Timer timer=new Timer(500,new RandomListener());

timer.start();

JPanel panel = new JPanel();

this.add(canvas);
}

Ball canvas = new Ball();


public static void main(String[] args) {

Scanner input=new Scanner(System.in);

System.out.println("Please enter number of slots: ");
int nSlots=input.nextInt();

JFrame frame = new GameBean (nSlots, 5);

frame.setTitle("Bean Game Machine");
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.setSize(300, 500);
frame.setVisible(true);

}
class RandomListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
canvas.moveRandom();
}
}


class Ball extends JPanel{
Random rand=new Random();
private int n;
private int raduis = 10;
private int moveRaduis=12;
private int L = 0;
private int R = 0;
private int D = 0;


protected void paintComponent(Graphics g) {
super.paintComponent(g);

g.setColor(Color.RED);

g.fillOval(getWidth()/2 -raduis/2 + R + L, 0 + D , moveRaduis, moveRaduis);

repaint();
int i=0;
int width=(getWidth()/8);
int space=(getWidth()-nSlots*30)/2;
g.setColor(Color.BLACK);
for(i=0;i<=nSlots;i++){
g.drawLine(space+(30*i),getHeight()-balls*(raduis) ,space+(30*i) ,getHeight() );
if(i!=0 && i!=nSlots)
g.fillOval(space+(30*i)-5, getHeight()-balls*(raduis)-5, 10, 10);
if(i==0){
g.drawLine(space,getHeight()-balls*(raduis) , space+((nSlots)*15)-(raduis/2)-15 , getHeight()-15-(balls*raduis)-(30*(nSlots-2))-raduis/2);
g.drawLine(space+((nSlots)*15)-(raduis/2)-15 , getHeight()-15-(balls*raduis)-(30*(nSlots-2))-raduis/2 , space+((nSlots)*15)-(raduis/2)-15 , getHeight()/2-nSlots*nSlots);//vertical line

}
if(i==nSlots){
g.drawLine(space+(30*i), getHeight()-balls*(raduis), space+((nSlots)*15)+(raduis/2)+15, getHeight()-15-(balls*raduis)-(30*(nSlots-2))-raduis/2);
g.drawLine(space+((nSlots)*15)+(raduis/2)+15 , getHeight()-15-(balls*raduis)-(30*(nSlots-2))-raduis/2 , space+((nSlots)*15)+(raduis/2)+15 , getHeight()/2-nSlots*nSlots);//vertical line

}

}


int o=1;
for(i=1;i<=nSlots-2;i++){
int k=2;
for(int j=i;j<=nSlots-2;j++){
g.fillOval(space+((i+k)*15)-raduis/2, getHeight()-(balls*raduis)-(30*o)-raduis/2, raduis, raduis);
k=k+2;
}o++;
}

}

public void moveRandom(){

n=1+rand.nextInt(100);
if(n<=51){
D+=15;

if(D<=(getHeight()-15-(balls*raduis)-(30*(nSlots-2))-raduis/2))//if(D<=14*15)
L=0;
else if(D>getHeight()-15-(balls*raduis)-(30*(nSlots-2))-raduis/2 && D<getHeight()-balls*(raduis))
{
D+=15;
L-=15;

}
else if(D>=getHeight()-balls*(raduis))
{
if(D==31*15)D-=15;
D=D;

}

}
else if (n>=51 && n<=100){
D+=15;
if(D<=getHeight()-15-(balls*raduis)-(30*(nSlots-2))-raduis/2)
R=0;
else if(D>getHeight()-15-(balls*raduis)-(30*(nSlots-2))-raduis/2 && D<getHeight()-balls*(raduis))
{
D+=15;
R+=15;
}
else if(D>=getHeight()-balls*(raduis)){

if(D==31*15)D-=15;
D=D;

}

}

}
}

}

请帮忙!谢谢大家..

最佳答案

这是一个建议。

不要让每个ball延伸JPanel 。只需将其设置为用于保存/操作/绘制状态的类即可。

Ball.java(注意Java命名约定)

public class Ball {
int x, y; // and whatever other state you need

public Ball(int x, int y {} // or however you want to construct the ball

public void draw(Graphics g) {
// draw ball here
}
public void move() {
// do calculations to move here
}
}

那就来一个 BallPanel扩展类JPanel并在那里画画。只需按住List<Ball>在类里面,您可以调用每个Balldraw() paintComponent中的方法每个 Ballmove() Timer中的方法。您甚至可以通过添加新的 Ball 来动态添加要动画的球。到列表中。类似的东西

public class BallPanel extends JPanel {
private List<Ball> balls; // create the list

public BallPanel() {
Timer timer = new Timer(40, new ActionListener(){
public void actionPerformed(ActionEvent e) {
for (Ball ball: balls) {
ball.move();
}
repaint();
}
});
}

protected void paintComponent(Graphics g) {
super.paintComponent(g);
for (Ball ball : balls) {
ball.draw(g);
}
}
}

这样您就不必担心单独的计时器和分层面板。

查看一堆使用此技术的完整示例,herehereherehereherehere .

关于java - 使用 java.swingTimer 重复动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23934675/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com