利用Thread解决paint()和用户输入响应同时将进行的问题。
public class Mycanvas extends Canvas implements Runnable
{ int r=0;
public Mycanvas()
{
Thread t=new Thread(this);
t.start();
}
public void run()
{
while(true)
{
r++;
if(r>10)
r=0;
repaint();
}
}
public void paint(Graphics g)
{
clear(g);
paintAnimation(g,100,10,r);
}
protected void keyPressed(int keycode)
{
switch(getGameAction(keycode))
{
case Canvas.UP:
y=y-2;
break;
……
}
}
}
j2me已将stop()方法拿掉(j2se也不再提倡使用),我们利用标识(flag)来解决线程结束的问题
boolean conti=false;
……
if(cmd.equals("停止"))
{
conti=false;
removeCommand(stop);
addCommand(start);
}else if(cmd.equals("开始"))
{
removeCommand(start);
addCommand(stop);
conti=true;
Thread t=new Thread(this);
t.start();
}
……
public void run()
{
while(conti)
{
r++;
if(r>10)
r=0;
repaint();
}
}
时间控制
不同机器处理速度不同,为了保持游戏,画面的一致性,通过时间控制流程来解决
……
int rate=50(50毫秒=1/20秒 画面重绘一次)
public void run()
{
long s1=0;
long s2=0;
long diff=0;
while(conti)
{
s1=Systen.currentTimeMillis();
repaint();
serviceRepaints();
s2=Systen.currentTimeMillis();
diff=s2-s1;
System.out.rpintln(diff);
if(diff<rate)
{
try
{
Thread.sleep(rate-diff);
}catch(Exception exc){}
}
repaint();
}
}