在这里的第一篇文章,如果我完全不了解所有的规则,请原谅我。
我有一些问题,我对Java还比较陌生,我以前读过这个社区并得到过一些帮助。
我现在有问题,在JFrame上画多个球,我有一些其他学生的解决方案,但没有成功。一个学生现在已经开始工作了,但是通过在框架类中画出我觉得不正确的所有东西,并且把repaint()放到has ()中,这也是错误的。如果有人能指出正确的方向,我会非常感激的。
丹尼尔
代码:Gamejava
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package myanimie;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
/**
*
* @author Dan
*/
public class Game extends JFrame implements Runnable {
private Ball myBall = new Ball();
private Paddle myPad = new Paddle();
final JPanel jp = new JPanel();
final JPanel jp1 = new JPanel();
final JPanel jp2 = new JPanel();
public Game()
{
setVisible(true);
setResizable(false);
setTitle("First Test Animation");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setAlwaysOnTop(true);
setSize(640,480);
}
public void run()
{
move();
}
public void paint(Graphics g)
{
super.paint(g);
myBall.paint(g);
}
public void move()
{
myBall.start();
repaint();
try
{
Thread.sleep(50);
}
catch (InterruptedException e)
{
System.exit(0);
}
}
}Ball.java
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package myanimie;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.geom.Ellipse2D;
/**
*
* @author Dan
*/
public class Ball extends Thread {
Point pos;
Color ballColor = Color.red;
Color[] ts = {Color.CYAN,Color.green,Color.black};
private int yChange = 2;
private int xChange = 1;
public Ball()
{
pos = new Point();
pos.x = (int)(Math.random() * (500 - 100)) + 10 ;
pos.y = (int)(Math.random() * (500/2 - 100)) + 10;
}
@Override
public void run()
{
while(true)
{
move();
}
}
public void paint(Graphics g)
{
g.setColor(ballColor);
g.fillOval(pos.x - 10, pos.y - 10, 60,60);
}
public void move()
{
// System.out.println("y " + pos.y);
// System.out.println("x " + pos.x);
if(pos.y < 20)
{
yChange = -yChange;
System.out.println("T");
ballColor = Color.BLUE;
}
if(pos.x < 20)
{
xChange = -xChange;
System.out.println("L");
ballColor = Color.MAGENTA;
}
if(pos.x > 620 - 20)
{
xChange = -xChange;
System.out.println("R");
ballColor = Color.GREEN;
}
if(pos.y > 430 - 20)
{
yChange = -yChange;
System.out.println("B");
ballColor = Color.PINK;
}
if(pos.y < 640 - 20)
{
pos.translate(xChange, yChange);
}
if(pos.x < 480 - 20 || pos.x > 460)
{
pos.translate(xChange, yChange);
}
}
public Point getPosition()
{
return pos;
}
public Ellipse2D area()
{
return new Ellipse2D.Double(pos.x, pos.y,60,60);
}
}这是我的可怕代码,我已经绕过错误,但没有动画自动取款机。
谢谢伙计们!你的洞察力是无价的
发布于 2011-07-11 20:46:59
好吧,一些基于你贴出的代码的一般性意见。
move()方法,这样它就不会每秒更新数百万次。我看到在您的Thread.sleep()方法中有一个Game.move。我认为您试图做的是这样的事情:public void (){而(True){//更改游戏状态移动();//将更改绘制到我刚才重新绘制的状态;//等待,然后移动到下一个“框架”尝试{ Thread.sleep(50);} catch ( InterruptedException ie ){}}私有void (){ myBall.move();}Ball.move()不再循环,所以根本没有Ball扩展Thread。去掉run()方法。您的主游戏循环将由Game集中管理。main方法或任何开始运行游戏的人中,在该线程中或在这样的新线程中调用Game.run():
公共空主(String[] args) {游戏/* =新游戏(.)*/;线程gameThread =新线程(游戏);gameThread.start();}getPosition()是否有存在的好理由?作为封装状态,这可能更好。发布于 2011-07-11 20:01:52
“并把重新油漆()中的油漆()”听起来很危险!
repaint()方法会导致对该组件的paint方法的调用。您可以详细说明如何在框架上绘制“多个”球。如果没有什么特别之处,你的答案可能是这里
https://stackoverflow.com/questions/6655743
复制相似问题