请教一个游戏效果实现的算法

vclongking 2009-12-09 09:27:45
就是控制人物移动的功能,最先经理要求利用方向功能键单步控制人物的移动,然后相应的控制到达4个目标点的其中的一个,但现在需求改了 ,要求利用1,3,7,9这几个数字键,当按下相应数字按键时,直接实现让人物自动移动到各个相应的目标点,按原来做的那个方案,现在改感觉不好改了。大家帮忙想一下解决方案,谢谢。

最先实现代码:
................
................此代码部分实现在run方法里面
//人物移动绘制
switch(pstate)
{
case 0://没改变坐标时状态

g.setClip(ppositionx,ppositiony,24,36);
g.drawImage(imsource,ppositionx-58,ppositiony-244,0);
break;
case 1:

if(!pstepdown)
{
offg.setClip(ppositionx,ppositiony,24,36);
offg.drawImage(imsource,ppositionx-82,ppositiony-244,0);
pindex++;
}
else
{
offg.setClip(ppositionx,ppositiony,24,36);
offg.drawImage(imsource,ppositionx-106,ppositiony-244,0);
pindex++;
}


break;
case -1:


if(!pstepup)
{
offg.setClip(ppositionx,ppositiony,24,36);
offg.drawImage(imsource,ppositionx-10,ppositiony-244,0);
pindex++;
}
else
{
offg.setClip(ppositionx,ppositiony,24,36);
offg.drawImage(imsource,ppositionx-34,ppositiony-244,0);
pindex++;
}


break;
case 2:

if(!pstepleft)
{
offg.setClip(ppositionx,ppositiony,15,38);
offg.drawImage(imsource,ppositionx-4,ppositiony-303,0);
pindex++;
}
else
{
offg.setClip(ppositionx,ppositiony,15,38);
offg.drawImage(imsource,ppositionx-25,ppositiony-303,0);
pindex++;
}

break;
case -2:


if(!pstepright)
{
offg.setClip(ppositionx,ppositiony,16,38);
offg.drawImage(imsource,ppositionx-68,ppositiony-304,0);
pindex++;
}
else
{
offg.setClip(ppositionx,ppositiony,16,38);
offg.drawImage(imsource,ppositionx-89,ppositiony-304,0);
pindex++;
}
}
................
................
public void keyPressed(int n)
{
...........
...........
//当游戏处于进行状态
if(gamestate==GAMEING || gamestate==GAMEGOON)
{
int k=this.getGameAction(n); //若用户按下下键
if(k==Canvas.DOWN)
{
if(ppositiony<=140)
{
ppositiony+=20;
//pstepdown=false;
pstepdown=!pstepdown;
pstate=1;
}
}
if(k==Canvas.UP) //若用户按下上键
{
if(ppositiony>=120)
{
ppositiony-=20;
//pstepup=false;
pstepup=!pstepup;
pstate=-1;
}
}
if(k==Canvas.LEFT) //若用户按下左键
{
if(ppositionx>=100)
{
ppositionx-=20;
//pstepleft=false;
pstepleft=!pstepleft;
pstate=2;
}
}
if(k==Canvas.RIGHT) //若用户按下右键
{
if(ppositionx<=120)
{
ppositionx+=20;
//pstepright=false;
pstepright=!pstepright;
pstate=-2;
}
}
if(k==Canvas.FIRE) //若用户按下确定键
{
turn=true;
}
}
..........
..........
}
注:上部分代码主要实现在相应坐标绘制人物功能,按键响应函数是当用户按下按键时实现改变人物的坐标的功能
现在要修改实现成上述后面的那种效果,有什么比较好的算法了,大家帮忙想一下,谢谢
...全文
121 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
建鼎呓语 2009-12-11
  • 打赏
  • 举报
回复

boolean[] keystate = new boolean[21];

keyPressed(int key)
if key=='1' 设置keystate[1] = true;
if key=='2' 设置keystate[2] = true;
if key=='3' 设置keystate[3] = true;

keyReleased(int key)
if key=='1' 设置keystate[1] = false;
if key=='2' 设置keystate[2] = false;
if key=='3' 设置keystate[3] = false;

run()
{

if(keystate[1]) // 如果'1'键处于按下状态
// do something
if(keystate[2]) // 如果按'2'键处于按下状态
// do something
if(keystate[3]) // 如果按'3'键处于按下状态
// do something

// draw screen

delay(??)

}
kf156 2009-12-09
  • 打赏
  • 举报
回复
因为在此状态下是不允许按键的

指定点坐标 ix,iy
人物坐标 x,y

if(ix>x)
x++;
else if(ix<x)
x--;

if(iy>y)
y++;
else if(iy<y)
y--;

每次移动的距离可以自行更改,不过要做个判断,免得单步距离过大,超出了,导致死循环。
如果按时间(次数)的话,就计算出每次要移动的距离。不过这样处理若距离太远,动画会不连续
vclongking 2009-12-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 kf156 的回复:]
用个状态标识是否自动移动,若按下了1379键,则切换到此状态。
在此状态下不再响应按键事件,并且人物自动移动。到了指定点后,改变状态
[/Quote]谢谢你的关注,也谢谢你提的建议。
你说的方案,整体上是这样的,我也是这样想的,但我觉得具体上实现起来不好做,因为是,当你切换了移动状态,就要实现人物的自动移动,中间有一个移动过程,不可能直接就让他马上移动到指定点坐标吧,还要考虑纵坐标横坐标的差距和时间,按一定规律来递增或递减人物坐标,然后到达指定点,这样就比较麻烦了。没什么比较好的算法
kf156 2009-12-09
  • 打赏
  • 举报
回复
用个状态标识是否自动移动,若按下了1379键,则切换到此状态。
在此状态下不再响应按键事件,并且人物自动移动。到了指定点后,改变状态
vclongking 2009-12-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 kf156 的回复:]
意思是要让人物斜着走吗?

判断是1379键,然后XY坐标同时改变就行了。
[/Quote]不是斜着走 ,美工提供的图源人物没斜着的 只能上下左右移动。
我现在的问题是,因为我用的双缓冲嘛,之前是我在run方法里面实现的人物绘制,在keyPressed里面响应按钮消息,然后添加人物坐标。人物的每一步移动就用按钮激发了,而现在是直接利用1379的某个按钮,直接实现人物自动移动到指定点,但用我之前做的那种模式,按钮事件那只能激发一次啊,但人物坐标要有规律的递增或递减,感觉就不好做了
kf156 2009-12-09
  • 打赏
  • 举报
回复
意思是要让人物斜着走吗?

判断是1379键,然后XY坐标同时改变就行了。

13,100

社区成员

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

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