坦克大战中的碰撞检测问题,在线等

tmj5441302 2010-09-01 09:32:02
小弟想了两天了,还是没想到好方法,用的是GameCanvas,但是里面没有分方向的检测,假如坦克向右方运动发生碰撞,此时应该可以向上继续运动,但是小弟想了很多办法都没有实现,求各位大大帮忙。以下是小弟的有BUG的代码。
public void keyPressed(){
int keystate=this.getKeyStates();


switch (keystate){

case GameCanvas.DOWN_PRESSED:
if(down==false)
{
break;}
s1.move(0, 5);
up=true;
if(s1.collidesWith(t2, false))
down=false;
//System.out.println("向下移动");
s1.paint(ga);
this.flushGraphics();

break;
case GameCanvas.UP_PRESSED:
if(up==false)
{
break;}
s1.move(0, -5);
down=true;
//System.out.println("向上移动");
if(s1.collidesWith(t2, false))
up=false;
s1.paint(ga);

this.flushGraphics();

break;
case GameCanvas.LEFT_PRESSED:
if(left==false)
{
break;}
s1.move(-5, 0);
right=true;
//System.out.println("向上移动");
if(s1.collidesWith(t2, false))
left=false;
s1.paint(ga);
this.flushGraphics();

break;
case GameCanvas.RIGHT_PRESSED:
if(right==false)
{
break;}
s1.move(5, 0);
left=true;
//System.out.println("向上移动");
if(s1.collidesWith(t2, false))
right=false;
s1.paint(ga);
this.flushGraphics();

}
...全文
657 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
tmj5441302 2010-10-25
  • 打赏
  • 举报
回复
感谢上面的所有朋友,开始结贴。
tmj5441302 2010-10-25
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 kf156 的回复:]
引用 5 楼 tmj5441302 的回复:

先谢谢你,这种方法我也想过,不过总觉的这样做不符合游戏的规律,坦克自动后退,有点。。。。


没有自动后退,只是原地不动

你代码里,坦克先移动,再检测碰撞,有碰撞再退出来。
这只是逻辑,界面上并没有绘制出这过程...
有碰撞的时候一移一退,绘制时就是不动了
[/Quote]谢谢,明白了。
boolean_ 2010-09-14
  • 打赏
  • 举报
回复
预先检查 坦克 前方 几个像素的 状况
whanly 2010-09-12
  • 打赏
  • 举报
回复
先用代码写出碰撞区域,当坦克进入碰撞区域后让它保持不动就行了。
其实如果你想思路清晰,可以先构建一个函数undo,专门管理,把所有的情况写进去,发生碰撞后直接调用这个函数就行了。如果你懒点,就发生碰撞时候让它的x、y的值再+/-你刚刚移动的数值,使x、y保持不变。
coutjj 2010-09-10
  • 打赏
  • 举报
回复
算出坦克所在的地图张那个地图快,然后在和地图数组里比较,哪些能过,哪些不能过
thegodofwar 2010-09-02
  • 打赏
  • 举报
回复
看看我写这个,用的是
if(this.getRectangle().intersects(ww.getRectangle()))
这种最简单的碰撞检测方法,给你参考下:
http://download.csdn.net/source/2655458
kf156 2010-09-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 tmj5441302 的回复:]

先谢谢你,这种方法我也想过,不过总觉的这样做不符合游戏的规律,坦克自动后退,有点。。。。
[/Quote]

没有自动后退,只是原地不动

你代码里,坦克先移动,再检测碰撞,有碰撞再退出来。
这只是逻辑,界面上并没有绘制出这过程...
有碰撞的时候一移一退,绘制时就是不动了
kf156 2010-09-02
  • 打赏
  • 举报
回复
代码就不写了,简单说下思路吧
其实思路很简单
按方向键上,坦克向上移动,判断是否遇到障碍,有,则退回来。
其他方向也是如此。

麦田捕手 2010-09-02
  • 打赏
  • 举报
回复
代码片段提供的信息量少了
我只拿你的一个case说说
        case GameCanvas.RIGHT_PRESSED:
if(right==false)
{
break;}
s1.move(5, 0);
left=true;
//System.out.println("向上移动");
if(s1.collidesWith(t2, false))
right=false;
s1.paint(ga);
this.flushGraphics();

if语句中一般不使用break,用return

        case GameCanvas.RIGHT_PRESSED:
if(s1.collidesWith(t2, false))
right=false;
if(right==false)
{
return;}
s1.move(5, 0);
left=true;

s1.paint(ga);
this.flushGraphics();
break;

只能想到这么多了,其它的还要看你其它部分的代码
tmj5441302 2010-09-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 tiewantn 的回复:]
代码片段提供的信息量少了
我只拿你的一个case说说

Java code
case GameCanvas.RIGHT_PRESSED:
if(right==false)
{
break;}
s1.move(5, 0);
left=true;
……
[/Quote]

哥们,其他代码都是辅助的了,我只想问坦克碰撞检测的算法。
tmj5441302 2010-09-02
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 kf156 的回复:]
代码就不写了,简单说下思路吧
其实思路很简单
按方向键上,坦克向上移动,判断是否遇到障碍,有,则退回来。
其他方向也是如此。
[/Quote]

先谢谢你,这种方法我也想过,不过总觉的这样做不符合游戏的规律,坦克自动后退,有点。。。。
tmj5441302 2010-09-01
  • 打赏
  • 举报
回复
自己给自己顶

13,100

社区成员

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

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