【发布时间】:2011-11-26 11:45:34
【问题描述】:
我正在制作游戏记忆,当你选择两张牌时,如果它们匹配,你就可以保留它们,否则你将它们退回。如果你然后记住你已经选择的牌,你可以更好地猜测接下来的两张牌。
我遇到的问题涉及repaint() 方法没有立即重绘。
当我翻转第二张牌时,无论结果如何,我都希望将两张牌都正面朝上翻转,然后再丢弃它们或将它们翻转回来。我通过调用 sleep() 来做到这一点。
当然,如果我 repaint() 将卡片正面朝上翻转,稍等片刻,然后根据它们的值再次 repaint(),有用的小 Java 只会重绘一次(我想念 C!)。
基本上我想在sleep() 之前强制调用更新。我读过一些其他线程,基本上说最好的方法是创建两个线程来保持你的逻辑和图形分开,然后你可以sleep()你的逻辑并保持你的 GUI 更新,但我在第一学期的第一学期高中一年级的 CS 课程,我希望将其保持在课程水平(尽管我在夏季 Web 开发和 C 编码中花费了相当多的时间)。
因为我知道 StackOverflow 上乐于助人的人喜欢阅读代码,所以下面是我所指的程序部分。 HitArea 类是 Card 对象,cards[] 数组包含 HitArea 的数量。(我还没有重命名 HitArea 类)。 activeCard1 和 activeCard2 是 HitArea 实例,我用来跟踪用户的两个选择,空白构造函数是保留的“不可见”HitArea,尽管稍后我会将其更改为 null。最后,cards.flip() 反转 toggle 布尔值,用于确定卡片是否正面朝上。
public void respond(HitArea choice)
{
if(choice.inGame)
{
if(activeCard1.value == 0 && activeCard1.value == 0)
activeCard1 = choice;
else if((!(activeCard1.value == 0) && activeCard2.value == 0) && (activeCard1.id != choice.id))
{
activeCard2 = choice;
check();
}
}
}
public void check()
{
update();
pause(250);
if(activeCard2.value == activeCard1.value)
{
score += 2;
activeCard1.inGame = false;
activeCard2.inGame = false;
}
activeCard1.flip();
activeCard2.flip();
activeCard1 = new HitArea();
activeCard2 = new HitArea();
}
public void pause(int milliseconds)
{
try{
Thread.currentThread().sleep(milliseconds);
}
catch(InterruptedException e){
System.out.println("Exception: " + e);
}
}
public void mousePressed(MouseEvent e)
{
int x = e.getX();
int y = e.getY();
for (int i = 0; i < cardNum; i++)
if(cards[i].boundsCheck( x, y ) )
{
repaint();
cards[i].flip();
respond(cards[i]);
}
}
我毫不怀疑我的代码中存在一些问题,因此请随时指出它们。我认为我的基本结构还可以,我宁愿不为这个项目创建多个线程(记住,它是基本的!)。
【问题讨论】:
标签: java user-interface repaint swingx