游戏中,nextFrame、setCell与Thread无法同步~~~怎么回事~~

luomopiao 2006-10-21 04:40:47
最近做了个游戏,但发现,nextFrame与Thread一直无法同步~~
具体情况如下:(GameCanvas类中~~)

使用在自建方法:keypress()中,用int key=getKeyStates();之后,
然后在
try{
Thread.sleep(100);
keypress();
}catch(interruptedExcetpion e){
}
canvas.repaint(g);
canvas.nextFrame();
flushGraphics();

大概如上调用吧 ,(在网吧,不记的全代码 ,只记的主要算法)
之后,当按下key之后,Frame一直停留在每一贞~~~困~~~

请问~~如何让按下key之后,还可以一直播放Frame~~~
...全文
383 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
bearlovehll 2006-11-16
  • 打赏
  • 举报
回复
如果是用setFrameSequence的话。也可以用这种方法。其实如果你不怕麻烦的话就int temp;一个
,记录上次的按键消息。然后和这次的比较。再判断是否要setFrameSequence。因为你每update一次。就会setFrameSequence一次。。所以侦一直都停留在第一侦
bearlovehll 2006-11-16
  • 打赏
  • 举报
回复
倒。。。看错了。。对不起啊。。楼主。没看到你用的是setFrameSequence。。那我再改下吧。如果是setFrame就好解决了。。我先帮你把setFrame的写出来吧


import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.game.Sprite;
import javax.microedition.lcdui.game.TiledLayer;
import javax.microedition.midlet.MIDletStateChangeException;

public class Game extends GameCanvas implements Runnable {
private Image spriteImage;
private Graphics g;
private Sprite sprite;
private int drawX=0,drawY=50,speed=50;
private int left=3;
private int right=9;
public Game() {
super(true);
try{
spriteImage=Image.createImage("/man.png");
}catch(Exception e){}
g=this.getGraphics();
sprite=new Sprite(spriteImage,32,48);
Thread thread=new Thread(this);
thread.start();

}





public void press(){
int key=getKeyStates();
if((key & LEFT_PRESSED)!=0){
if (sprite.getFrame()>=left&&(sprite.getFrame<left+3(左移动的侦数)-1{
sprite.netxtFrame();
}else{
sprite.setFrame(left);
}
if(drawX>0)
drawX=drawX-speed;
else
drawX=this.getWidth();

}
if((key & RIGHT_PRESSED)!=0){
if (sprite.getFrame()>=right&&(sprite.getFrame<right+3(右移动的侦数-1){
sprite.netxtFrame();
}else{
sprite.setFrame(left);
}
if(drawX<this.getWidth())
drawX=drawX+speed;
else
drawX=0;
}

}


public void run() {
while(true){
try{
Thread.sleep(500);
}catch(InterruptedException e){}
press();
sprite.setPosition(drawX,drawY);
sprite.paint(g);
flushGraphics();

}
bearlovehll 2006-11-16
  • 打赏
  • 举报
回复
这个问题我原来也碰到过。。不过解决的方法很郁闷啊。。要不写给你看下吧

public void press(){
int key=getKeyStates();
if((key & LEFT_PRESSED)!=0){
if (sprite.getFrame()>=left&&(sprite.getFrame<left+(左移动的侦数){
sprite.netxtFrame();
}else{
sprite.setFrameSequence(left);
}
if(drawX>0)
drawX=drawX-speed;
else
drawX=this.getWidth();

}
if((key & RIGHT_PRESSED)!=0){
if (sprite.getFrame()>=right&&(sprite.getFrame<right+(右移动的侦数){
sprite.netxtFrame();
}else{
sprite.setFrameSequence(left);
}
if(drawX<this.getWidth())
drawX=drawX+speed;
else
drawX=0;
}

}


public void run() {
while(true){
try{
Thread.sleep(500);
}catch(InterruptedException e){}
press();
sprite.setPosition(drawX,drawY);
sprite.paint(g);
flushGraphics();

}

这个方法确实是可以。。但我个人觉得好象不是怎么好。。不知道还有好的方法没有

z5770720 2006-11-16
  • 打赏
  • 举报
回复
按下键让他不停的走,你有没有做过怪物的经历,可以借鉴怪物里面的哪个循环,当你按下键之后让他不停的循环不就可以了吗,
   还有你哪个调用下一侦的时候把sprite.nextFrame();写在int key=getKeyStates();
之后试试.
qq14923349 2006-11-15
  • 打赏
  • 举报
回复
2。0支持重复按健
兄弟你用1。0的吧

要自己编个涵数
KEYPRESSED
KEYRELEASED
luomopiao 2006-11-13
  • 打赏
  • 举报
回复
但是,比如你看游戏里面都是按住一个键不放,他都一直在走,当放下时,他就不走了
就像泡泡堂一样,不知道,这样的算法是通过什么实现的
luomopiao 2006-11-13
  • 打赏
  • 举报
回复
是否有清空屏幕跟这个应该没有关系,我是估意的,为了看的清每一帧的动画。。。
我个人觉的问题出在:
public void press(){
int key=getKeyStates();
if((key & LEFT_PRESSED)!=0){
sprite.setFrameSequence(left); //问题所在
if(drawX>0)
drawX=drawX-speed;
else
drawX=this.getWidth();

}
每次if一次,他就设置回去了。。。
怎么解决呀,想了很多办法。。
55。。。等了很多天了,哪位能解决一下,全分相送。。。
raysweet 2006-11-13
  • 打赏
  • 举报
回复
用当你松开这个键时,状态恢复就可以了
比如二帧如下:/ \
我希望当按下键时是:/
松开按键时:\
这样就可以了
yzss 2006-11-12
  • 打赏
  • 举报
回复
看下left,right设置正不正确,还有每个while(true){}循环没有清空屏幕.
luomopiao 2006-11-11
  • 打赏
  • 举报
回复
比如二帧如下:/ \
我希望当按下键时是:/\/\/\/\/\ 这样播放的
但当按下时,一直是:////////////
不知道怎么回事~~~
luomopiao 2006-11-10
  • 打赏
  • 举报
回复
动画一直停留在第一帧!!!!!
无法一边行直一过播放
luomopiao 2006-11-10
  • 打赏
  • 举报
回复
还是没有用呀~
你看一下源码:
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.game.Sprite;
import javax.microedition.lcdui.game.TiledLayer;
import javax.microedition.midlet.MIDletStateChangeException;

public class Game extends GameCanvas implements Runnable {
private Image spriteImage;
private Graphics g;
private Sprite sprite;
private int drawX=0,drawY=50,speed=50;
private int[] left={3,4,5};
private int[] right={9,10,11};
public Game() {
super(true);
try{
spriteImage=Image.createImage("/man.png");
}catch(Exception e){}
g=this.getGraphics();
sprite=new Sprite(spriteImage,32,48);
Thread thread=new Thread(this);
thread.start();

}
public void press(){
int key=getKeyStates();
if((key & LEFT_PRESSED)!=0){
sprite.setFrameSequence(left);
if(drawX>0)
drawX=drawX-speed;
else
drawX=this.getWidth();

}
if((key & RIGHT_PRESSED)!=0){
sprite.setFrameSequence(right);
if(drawX<this.getWidth())
drawX=drawX+speed;
else
drawX=0;
}

}
public void run() {
while(true){
try{
Thread.sleep(500);
}catch(InterruptedException e){}
press();
sprite.setPosition(drawX,drawY);
sprite.nextFrame();
sprite.paint(g);
flushGraphics();

}

}

}
您 看一下问题出在哪里??
conan0268 2006-10-27
  • 打赏
  • 举报
回复
老大,PC游戏那套不能完全搬过来
try{
Thread.sleep(100);

}catch(interruptedExcetpion e){
}
keypress();
canvas.nextFrame();
canvas.repaint(g);

flushGraphics();
先响应按键,再绘制下一真,最后刷新
luomopiao 2006-10-26
  • 打赏
  • 举报
回复
怎么个处理法呀?
iwenlong 2006-10-21
  • 打赏
  • 举报
回复
用事件处理输入,不放在动画的循环中

13,100

社区成员

发帖
与我相关
我的任务
社区描述
Java J2ME
社区管理员
  • J2ME社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧