大家好,我在绘制用户与之交叉的硬币时遇到了麻烦。我想要这个代码做的是当用户精灵与它在硬币上绘制的十个硬币图像中的任何一个相交时,它不再出现在屏幕上(还需要添加某种计数器以便当用户收集时所有十个硬币它将停止线程,并说“你赢了!”)。我的问题是我将如何进行此操作,因为我尝试在if语句中使用repaint(),并且它不再正确编译。任何帮助如何绘制硬币,甚至可能添加某种计数器(想一个for循环会派上用场)将不胜感激!这是代码:
public void paint(Graphics g)
{
g.clearRect(0, 0, this.getWidth(), this.getHeight());
one.paintComponent(g);
two.paintComponent(g);
three.paintComponent(g);
four.paintComponent(g);
five.paintComponent(g);
six.paintComponent(g);
seven.paintComponent(g);
eight.paintComponent(g);
nine.paintComponent(g);
ten.paintComponent(g);
monster.setLocation(r.nextInt(10) - 5 + monster.x, r.nextInt(10 - 5 + monster.y));
monster.paintComponent(g);
user.paintComponent(g);
if(user.intersects(one))
{
}
if(user.intersects(two))
{
}
if(user.intersects(three))
{
}
if(user.intersects(four))
{
}
if(user.intersects(five))
{
}
if(user.intersects(six))
{
}
if(user.intersects(seven))
{
}
if(user.intersects(eight))
{
}
if(user.intersects(nine))
{
}
if(user.intersects(ten))
{
}
if(user.intersects(monster))
{
g.setFont(new Font("Serif", Font.BOLD, 35));
g.drawString("YOU HAVE DIED, YOU LOSE!", 100, 100); //Prints this when you lose
thread.interrupt(); //Stopping the thread if you die
}
}
答案 0 :(得分:0)
首先,您应该将硬币放入列表中。然后,如果有交互,您只需删除列表中的项目(硬币)即可。像这样:
private List<Coin> coins;
public ClassConstructor() {
coins = new ArrayList();
coins.add(new Coin(type value,...)); //this ten times if every Coin is different from other
//or this if every Coin are same:
for (int i = 0; i < 10; i++) {
coins.add(new Coin(type value,...));
}
}
public void update() {
//whatever
for (int i = coins.size(); i >= 0; i--) {
if (user.intersects(coins.get(i))) {
coins.remove(i);
//...
}
}
}
public void paint(Graphics g) {
for (int i = coins.size(); i >= 0; i--) {
coins.get(i).paintComponent(g);
}
}
现在,你不应该用thread.interrupt()结束一个Thread。如果该线程是你的游戏循环,你应该发送一个结束循环的标志。游戏循环线程:
@Override
public void run() {
while (running) { //boolean running
update();
paint(g);
}}
最后,您的更新将如下:
public void update() {
//whatever
for (int i = coins.size(); i >= 0; i--) {
if (user.intersects(coins.get(i))) {
coins.remove(i);
//...
}
}
if (user.intersects(monster)) {
youThread.setRunning(false);
try {
gameLoopThread.join(); //"wait" until thread ends
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
答案 1 :(得分:0)
离开我的头顶,将while(true)
放在你的Run()
方法中(你说你正在使用一个线程)并在循环结束时调用循环内的repaint()一个像//thread//.sleep(allotted time)
这样的东西。这将使线程停止设定的毫秒数。在repaint()
的Javadoc中,您会看到它调用最近的paint(Graphics g)
方法。通过这样做,您可以从程序中的任何位置访问paint()
方法。
我对硬币的建议就是让它成为自己的班级。该课程看起来与此相似:
public class Coin{
int x;
int y;
public void Coin(int x, int y, Graphics g){
Graphics2D g2 = (Graphics2D) g;
Image img1 = (//File Location);
g2.drawImage(img1, x, y, //this);
//If you have trouble with the ImageObserver (this part) try //class name of the applet.this
this.x = x;
this.y = y;
g2.finalize();
}
public int getX(){
return x;
}
public int getY(){
return y;
}
}
之后,在paint方法中,您可以生成10个Coin
个对象,并使用您在参数中实例化的g
。然后,您可以制作一组Coin
个对象,并在您的Coin
方法中手动添加10个paint
(是的,它很痛苦)(你必须制作它们)在paint中传递Graphics变量)
Coin[] coins = new Coin[10];
顺便说一句,你是如何制作阵列的。制作硬币数组后,在for
方法中制作paint
循环。看起来应该是这样的:
for(int i = 0; i < coins.length; i++){
if(coins[i].getX == //user X && coins[i].getY == //user Y){
g.clearRect(coins[i].getX, coins[i].getY, //Coin radius, //Coin radius);
}
}
如果用户的X和Y等于硬币的X和Y,这将在硬币所在的任何地方绘制一个清晰的矩形。
答案 2 :(得分:0)
此代码来自我当前的项目(正在运行),我尝试将其调整为您的项目。
private void render () {
BufferStrategy bufferstrategy = getBufferStrategy ();
if (bufferstrategy == null) {
createBufferStrategy(3);
return;
}
Graphics g = bufferstrategy.getDrawGraphics();
g.setColor(Color.white);
g.fillRect(0, 0, getWidth(), getHeight());
paint (g);
g.dispose();
bufferstrategy.show();
}
从run()调用 render()
,其中Thread
为。
让我们分解它,看看它是否可以帮到你。
BufferStrategy
设置为Graphics
。paint (Graphics g)
,而在我的情况下它遍历所有可绘制的对象。希望你能从中得到一些建议。