一、 马里奥碰到墙不能走,代码有BUG,大神们帮看看!

whereismymindM 2018-01-21 08:05:35
思路是马里奥每走一步,就判断与墙相不相交,若左走一步,相交,就像右走一步,(避免相交时黏住)若上走一步,相交,就向下走一步,其他同理,但是验证结果有BUG,无论上下左右碰到墙会停,但是贴着墙边框走,感觉会卡顿,还会振动,有时还会走太空步,就是你让他往右他却往左滑动,离开了墙就很顺畅,代码如下:

import java.awt.Dimension;
import java.awt.Point;
import java.awt.event.KeyEvent;

import com.rupeng.game.GameCore;

public class PengQiang implements Runnable {

@Override
public void run() {
GameCore.setGameSize(1000, 1000);//GameCore是如鹏网的游戏引擎
Dimension gameSize =GameCore.getGameSize();
Sprites mario=new Sprites("mario"); //创建马里奥
mario.setPosition(0, 0);
mario.PlayAnimate("walk");
Images[] jieLaDe=new Images[10];
for(int i=0;i<10;i++)//创建十张图片当墙
{
jieLaDe[i]=new Images("墙.jpg");
int a=jieLaDe[i].getSize().width;
int b=jieLaDe[i].getSize().height;
jieLaDe[i].setPosition(GameCore.rand(0, 1000-a),GameCore.rand(0, 1000-b) );
}


for(;;)
{
int keycode=GameCore.getPressedKeyCode();
Point marioPos=mario.getPosition();//获得马里奥当前位置
Dimension marioSize=mario.getSize();//获得马里奥大小
if (keycode==KeyEvent.VK_LEFT||keycode==KeyEvent.VK_A)
{
if(marioPos.x>0)
{
mario.moveLeft();
for(int i=0;i<10;i++)//开始判断十张照片是否与马里奥相交,余下同理
{
if(mario.isXiangJiao(jieLaDe[i]))//相交的判断已封装成方法直接调用
{
mario.moveRight();

}
}
}
}
if(keycode==KeyEvent.VK_RIGHT||keycode==KeyEvent.VK_D)
{
if(marioPos.x<gameSize.width-marioSize.width)
{
mario.moveRight();
for(int i=0;i<10;i++)
{
if(mario.isXiangJiao(jieLaDe[i]))
{
mario.moveLeft();

}
}
}
}
if(keycode==KeyEvent.VK_UP||keycode==KeyEvent.VK_W)
{
if(marioPos.y>0)
{
mario.moveUp();
for(int i=0;i<10;i++)
{
if(mario.isXiangJiao(jieLaDe[i]))
{
mario.moveDown();

}
}
}
}
if(keycode==KeyEvent.VK_DOWN||keycode==KeyEvent.VK_S)
{
if(marioPos.y<gameSize.height-marioSize.height-50)
{
mario.moveDown();
for(int i=0;i<10;i++)
{
if(mario.isXiangJiao(jieLaDe[i]))
{
mario.moveUp();

}
}
}
}

}
}

public static void main(String[] args) {
GameCore.start(new PengQiang());
}

}
实在是找不到BUG在哪,还是我这种思路不行?如果思路正确,哪个方向走一碰墙就后退一步,这样就与墙不相交了,只要不再往碰撞的方向走,都会很顺畅啊?
...全文
1684 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
whereismymindM 2018-03-08
  • 打赏
  • 举报
回复
引用 20 楼 my_panpan 的回复:
[quote=引用 19 楼 sinat_41605575 的回复:] 先问下为什么引用不能用了?你说的这句话“你打印用的marioPos变量是怎么赋值的?”我不太懂,是问相交时怎么获得mario的坐标吗?在for(;;)下面头几句Point marioPos=mario.getPosition();,或者我在每次退后一步时再重新获取马里奥的坐标,然后再打印 ,发现情况还是一样都是一个数值,代码如下:大哥要不我代码发你邮箱,你帮我看看,上面那哥们收了我代码都没消息了! for(;;) { int keycode=GameCore.getPressedKeyCode(); Point marioPos=mario.getPosition(); Dimension marioSize=mario.getSize(); if (keycode==KeyEvent.VK_LEFT||keycode==KeyEvent.VK_A) { if(marioPos.x>0) { mario.moveLeft(); for(int i=0;i<10;i++)//开始判断十张照片是否与马里奥相交,余下同理 { if(mario.isXiangJiao(jieLaDe[i])) { System.out.println(marioPos.x); mario.moveRight(); Point marioPos1=mario.getPosition();//退后一步后,再重新获取马里奥的坐标 System.out.println(marioPos1.x);//结果打印出来的还是只有一个数值。 //break; } else{} } } } if(keycode==KeyEvent.VK_RIGHT||keycode==KeyEvent.VK_D) { if(marioPos.x<gameSize.width-marioSize.width) { mario.moveRight(); for(int i=0;i<10;i++) { if(mario.isXiangJiao(jieLaDe[i])) { System.out.println(marioPos.x); mario.moveLeft(); Point marioPos1=mario.getPosition(); System.out.println(marioPos1.x); //break; } else{} } } } if(keycode==KeyEvent.VK_UP||keycode==KeyEvent.VK_W) { if(marioPos.y>0) { mario.moveUp(); for(int i=0;i<10;i++) { if(mario.isXiangJiao(jieLaDe[i])) { System.out.println(marioPos.y); mario.moveDown(); Point marioPos1=mario.getPosition(); System.out.println(marioPos1.y); //break; } else{} } } } if(keycode==KeyEvent.VK_DOWN||keycode==KeyEvent.VK_S) { if(marioPos.y<gameSize.height-marioSize.height-50) { mario.moveDown(); for(int i=0;i<10;i++) { if(mario.isXiangJiao(jieLaDe[i])) { System.out.println(marioPos.y); mario.moveUp(); Point marioPos1=mario.getPosition(); System.out.println(marioPos1.y); //break; } else{} } } } } }
好的,发我邮箱吧,94647583@qq.com。[/quote] ----------------- 不好意思
引用 20 楼 my_panpan 的回复:
[quote=引用 19 楼 sinat_41605575 的回复:] 先问下为什么引用不能用了?你说的这句话“你打印用的marioPos变量是怎么赋值的?”我不太懂,是问相交时怎么获得mario的坐标吗?在for(;;)下面头几句Point marioPos=mario.getPosition();,或者我在每次退后一步时再重新获取马里奥的坐标,然后再打印 ,发现情况还是一样都是一个数值,代码如下:大哥要不我代码发你邮箱,你帮我看看,上面那哥们收了我代码都没消息了! for(;;) { int keycode=GameCore.getPressedKeyCode(); Point marioPos=mario.getPosition(); Dimension marioSize=mario.getSize(); if (keycode==KeyEvent.VK_LEFT||keycode==KeyEvent.VK_A) { if(marioPos.x>0) { mario.moveLeft(); for(int i=0;i<10;i++)//开始判断十张照片是否与马里奥相交,余下同理 { if(mario.isXiangJiao(jieLaDe[i])) { System.out.println(marioPos.x); mario.moveRight(); Point marioPos1=mario.getPosition();//退后一步后,再重新获取马里奥的坐标 System.out.println(marioPos1.x);//结果打印出来的还是只有一个数值。 //break; } else{} } } } if(keycode==KeyEvent.VK_RIGHT||keycode==KeyEvent.VK_D) { if(marioPos.x<gameSize.width-marioSize.width) { mario.moveRight(); for(int i=0;i<10;i++) { if(mario.isXiangJiao(jieLaDe[i])) { System.out.println(marioPos.x); mario.moveLeft(); Point marioPos1=mario.getPosition(); System.out.println(marioPos1.x); //break; } else{} } } } if(keycode==KeyEvent.VK_UP||keycode==KeyEvent.VK_W) { if(marioPos.y>0) { mario.moveUp(); for(int i=0;i<10;i++) { if(mario.isXiangJiao(jieLaDe[i])) { System.out.println(marioPos.y); mario.moveDown(); Point marioPos1=mario.getPosition(); System.out.println(marioPos1.y); //break; } else{} } } } if(keycode==KeyEvent.VK_DOWN||keycode==KeyEvent.VK_S) { if(marioPos.y<gameSize.height-marioSize.height-50) { mario.moveDown(); for(int i=0;i<10;i++) { if(mario.isXiangJiao(jieLaDe[i])) { System.out.println(marioPos.y); mario.moveUp(); Point marioPos1=mario.getPosition(); System.out.println(marioPos1.y); //break; } else{} } } } } }
好的,发我邮箱吧,94647583@qq.com。[/quote] —————————————————————————————————————————————— 不好意思,过年回家有事就没有再登过这个网站,没看到你的回复,现在把源代码发给你 ,不知道你还有没空帮忙看看!
my_panpan 2018-02-05
  • 打赏
  • 举报
回复
引用 19 楼 sinat_41605575 的回复:
先问下为什么引用不能用了?你说的这句话“你打印用的marioPos变量是怎么赋值的?”我不太懂,是问相交时怎么获得mario的坐标吗?在for(;;)下面头几句Point marioPos=mario.getPosition();,或者我在每次退后一步时再重新获取马里奥的坐标,然后再打印 ,发现情况还是一样都是一个数值,代码如下:大哥要不我代码发你邮箱,你帮我看看,上面那哥们收了我代码都没消息了! for(;;) { int keycode=GameCore.getPressedKeyCode(); Point marioPos=mario.getPosition(); Dimension marioSize=mario.getSize(); if (keycode==KeyEvent.VK_LEFT||keycode==KeyEvent.VK_A) { if(marioPos.x>0) { mario.moveLeft(); for(int i=0;i<10;i++)//开始判断十张照片是否与马里奥相交,余下同理 { if(mario.isXiangJiao(jieLaDe[i])) { System.out.println(marioPos.x); mario.moveRight(); Point marioPos1=mario.getPosition();//退后一步后,再重新获取马里奥的坐标 System.out.println(marioPos1.x);//结果打印出来的还是只有一个数值。 //break; } else{} } } } if(keycode==KeyEvent.VK_RIGHT||keycode==KeyEvent.VK_D) { if(marioPos.x<gameSize.width-marioSize.width) { mario.moveRight(); for(int i=0;i<10;i++) { if(mario.isXiangJiao(jieLaDe[i])) { System.out.println(marioPos.x); mario.moveLeft(); Point marioPos1=mario.getPosition(); System.out.println(marioPos1.x); //break; } else{} } } } if(keycode==KeyEvent.VK_UP||keycode==KeyEvent.VK_W) { if(marioPos.y>0) { mario.moveUp(); for(int i=0;i<10;i++) { if(mario.isXiangJiao(jieLaDe[i])) { System.out.println(marioPos.y); mario.moveDown(); Point marioPos1=mario.getPosition(); System.out.println(marioPos1.y); //break; } else{} } } } if(keycode==KeyEvent.VK_DOWN||keycode==KeyEvent.VK_S) { if(marioPos.y<gameSize.height-marioSize.height-50) { mario.moveDown(); for(int i=0;i<10;i++) { if(mario.isXiangJiao(jieLaDe[i])) { System.out.println(marioPos.y); mario.moveUp(); Point marioPos1=mario.getPosition(); System.out.println(marioPos1.y); //break; } else{} } } } } }
好的,发我邮箱吧,94647583@qq.com。
whereismymindM 2018-01-31
  • 打赏
  • 举报
回复
先问下为什么引用不能用了?你说的这句话“你打印用的marioPos变量是怎么赋值的?”我不太懂,是问相交时怎么获得mario的坐标吗?在for(;;)下面头几句Point marioPos=mario.getPosition();,或者我在每次退后一步时再重新获取马里奥的坐标,然后再打印 ,发现情况还是一样都是一个数值,代码如下:大哥要不我代码发你邮箱,你帮我看看,上面那哥们收了我代码都没消息了! for(;;) { int keycode=GameCore.getPressedKeyCode(); Point marioPos=mario.getPosition(); Dimension marioSize=mario.getSize(); if (keycode==KeyEvent.VK_LEFT||keycode==KeyEvent.VK_A) { if(marioPos.x>0) { mario.moveLeft(); for(int i=0;i<10;i++)//开始判断十张照片是否与马里奥相交,余下同理 { if(mario.isXiangJiao(jieLaDe[i])) { System.out.println(marioPos.x); mario.moveRight(); Point marioPos1=mario.getPosition();//退后一步后,再重新获取马里奥的坐标 System.out.println(marioPos1.x);//结果打印出来的还是只有一个数值。 //break; } else{} } } } if(keycode==KeyEvent.VK_RIGHT||keycode==KeyEvent.VK_D) { if(marioPos.x<gameSize.width-marioSize.width) { mario.moveRight(); for(int i=0;i<10;i++) { if(mario.isXiangJiao(jieLaDe[i])) { System.out.println(marioPos.x); mario.moveLeft(); Point marioPos1=mario.getPosition(); System.out.println(marioPos1.x); //break; } else{} } } } if(keycode==KeyEvent.VK_UP||keycode==KeyEvent.VK_W) { if(marioPos.y>0) { mario.moveUp(); for(int i=0;i<10;i++) { if(mario.isXiangJiao(jieLaDe[i])) { System.out.println(marioPos.y); mario.moveDown(); Point marioPos1=mario.getPosition(); System.out.println(marioPos1.y); //break; } else{} } } } if(keycode==KeyEvent.VK_DOWN||keycode==KeyEvent.VK_S) { if(marioPos.y<gameSize.height-marioSize.height-50) { mario.moveDown(); for(int i=0;i<10;i++) { if(mario.isXiangJiao(jieLaDe[i])) { System.out.println(marioPos.y); mario.moveUp(); Point marioPos1=mario.getPosition(); System.out.println(marioPos1.y); //break; } else{} } } } } }
my_panpan 2018-01-30
  • 打赏
  • 举报
回复
移动函数没问题。 但是你说打印出来的碰撞前后坐标相同肯定是有问题的。你打印用的marioPos变量是怎么赋值的?调用moveXXX函数后这个值是在哪里更新的? if (keycode==KeyEvent.VK_LEFT||keycode==KeyEvent.VK_A) { if(marioPos.x>0) { mario.moveLeft(); for(int i=0;i<10;i++)//开始判断十张照片是否与马里奥相交,余下同理 { if(mario.isXiangJiao(jieLaDe[i])) { System.out.println(marioPos.x); mario.moveRight(); System.out.println(marioPos.x); } else{} }
whereismymindM 2018-01-30
  • 打赏
  • 举报
回复
没用到多线程!
whereismymindM 2018-01-30
  • 打赏
  • 举报
回复
这论坛怎么这么难用啊,引用怎么用不了了?不小心给my_panpan丢了个板砖!移动代码: import java.awt.Dimension; import java.awt.Point; import com.rupeng.game.GameCore; public abstract class F { public abstract void setPosition(int x,int y); public abstract Point getPosition(); public abstract void hide(); public abstract void show(); public abstract Dimension getSize(); public abstract void remove(); public void moveRight() { Point Pos =this.getPosition(); Pos.x++; this.setPosition(Pos.x, Pos.y); } public void moveLeft() { Point Pos =this.getPosition(); Pos.x--; this.setPosition(Pos.x, Pos.y); } public void moveUp() { Point Pos =this.getPosition(); Pos.y--; this.setPosition(Pos.x, Pos.y); } public void moveDown() { Point Pos =this.getPosition(); Pos.y++; this.setPosition(Pos.x, Pos.y); }
my_panpan 2018-01-29
  • 打赏
  • 举报
回复
有没有用到多线程? 看下你的moveXXX函数。
my_panpan 2018-01-26
  • 打赏
  • 举报
回复
引用 4 楼 sinat_41605575 的回复:
然后我说的太空步是,比如马里奥紧贴着图片的上方,然后我想让他往左,它却往右。我猜是当时马里奥下边框的y坐标和图片上边框的坐标相等,也就是相交,所以这个时候我一按左它就往后退,但是我搞不明白,如果相交,马里奥不是应该后退一步,也就是马里奥看似贴着图片的上面,其实应该跟图片还高一个像素的距离吧,这时候我按左它怎么还是往右?
1、让他往左他却往右,说明肯定是和图片相交了。这个时候不管你是按哪个方向实际都是往反方向走的,这你可以测试下。 2、“我猜是当时马里奥下边框的y坐标和图片上边框的坐标相等,也就是相交,所以这个时候我一按左它就往后退” -------即使和相等,根据你的isXiangJiao函数返回也是false。不应该再往反方向走的。 3、你可以把此时的坐标位置打印出来或者单步跟踪下。可能是往左走后和另一个图片相交了。
渣渣辉 2018-01-26
  • 打赏
  • 举报
回复
楼主,马里奥发我邮箱,谢谢15290277611@163.com
whereismymindM 2018-01-26
  • 打赏
  • 举报
回复
引用 11 楼 my_panpan 的回复:
[quote=引用 10 楼 my_panpan 的回复:] [quote=引用 4 楼 sinat_41605575 的回复:] 然后我说的太空步是,比如马里奥紧贴着图片的上方,然后我想让他往左,它却往右。我猜是当时马里奥下边框的y坐标和图片上边框的坐标相等,也就是相交,所以这个时候我一按左它就往后退,但是我搞不明白,如果相交,马里奥不是应该后退一步,也就是马里奥看似贴着图片的上面,其实应该跟图片还高一个像素的距离吧,这时候我按左它怎么还是往右?
纠正一下第一点: 1、让他往左他却往右,说明肯定是和图片相交了。[/quote] --------------------------------------------------------------------------------- 奇了怪了,刚刚又试了下,这时候不给我走太空步了,应该是我之前改了下代码,那个版本的会走太空步,但是原始版本除了太空步没有,卡顿,震动都有!四个方向我都写了碰撞时打印坐标,碰撞后打印坐标,但是哪个方向碰撞,打印的都是同一个值。还有比如从上向下走,碰撞,然后向左或向右,除了会卡顿(这时候不走太空步了),还会打印坐标,这说明应该是相交了,但是为什么会相交实在搞不懂!
whereismymindM 2018-01-26
  • 打赏
  • 举报
回复
引用 9 楼 qq_40282231 的回复:
楼主,马里奥发我邮箱,谢谢15290277611@163.com
--------------------------------------------------- 已发你邮箱,请查收!
whereismymindM 2018-01-26
  • 打赏
  • 举报
回复
引用 10 楼 my_panpan 的回复:
[quote=引用 4 楼 sinat_41605575 的回复:] 然后我说的太空步是,比如马里奥紧贴着图片的上方,然后我想让他往左,它却往右。我猜是当时马里奥下边框的y坐标和图片上边框的坐标相等,也就是相交,所以这个时候我一按左它就往后退,但是我搞不明白,如果相交,马里奥不是应该后退一步,也就是马里奥看似贴着图片的上面,其实应该跟图片还高一个像素的距离吧,这时候我按左它怎么还是往右?
1、让他往左他却往右,说明肯定是和图片相交了。这个时候不管你是按哪个方向实际都是往反方向走的,这你可以测试下。 2、“我猜是当时马里奥下边框的y坐标和图片上边框的坐标相等,也就是相交,所以这个时候我一按左它就往后退” -------即使和相等,根据你的isXiangJiao函数返回也是false。不应该再往反方向走的。 3、你可以把此时的坐标位置打印出来或者单步跟踪下。可能是往左走后和另一个图片相交了。[/quote] -------------------------------------------- 你说的第一点 ,我明白,我搞不懂的是我都设置了碰到了就后退一步,它怎么还给我相交。第二点,相交判断中我把等号去掉也一样,还是上面走示还是会卡顿。第三点,我在相交时打印一下坐标,然后后退一步后再打印了一下坐标,如下: if (keycode==KeyEvent.VK_LEFT||keycode==KeyEvent.VK_A) { if(marioPos.x>0) { mario.moveLeft(); for(int i=0;i<10;i++)//开始判断十张照片是否与马里奥相交,余下同理 { if(mario.isXiangJiao(jieLaDe[i])) { System.out.println(marioPos.x); mario.moveRight(); System.out.println(marioPos.x); } else{} } } } 可是打印的一直都是同一个值,而不是相差一。比如都是从上往下走,碰墙,开始打印Y坐标500,都是500,没有499或者501。
my_panpan 2018-01-26
  • 打赏
  • 举报
回复
引用 10 楼 my_panpan 的回复:
[quote=引用 4 楼 sinat_41605575 的回复:] 然后我说的太空步是,比如马里奥紧贴着图片的上方,然后我想让他往左,它却往右。我猜是当时马里奥下边框的y坐标和图片上边框的坐标相等,也就是相交,所以这个时候我一按左它就往后退,但是我搞不明白,如果相交,马里奥不是应该后退一步,也就是马里奥看似贴着图片的上面,其实应该跟图片还高一个像素的距离吧,这时候我按左它怎么还是往右?
纠正一下第一点: 1、让他往左他却往右,说明肯定是和图片相交了。
my_panpan 2018-01-25
  • 打赏
  • 举报
回复
那就要看你判断马里奥和图片相交的那个函数具体是怎么实现的了。
whereismymindM 2018-01-25
  • 打赏
  • 举报
回复
引用 5 楼 my_panpan 的回复:
那就要看你判断马里奥和图片相交的那个函数具体是怎么实现的了。
—————————— 按如鹏网里面说的,先找出两个图片不相交的情况,再取反就是了,有四种,图片A的右边框的X坐标小于B的左边框X坐标,或者A的左边框X坐标大于B的右边框的X坐标,或者A的下边框Y坐标大于B的上边框的Y坐标,或者A的上边框Y坐标大于B的下边框的Y坐标,代码如下: public boolean isXiangJiao(Sprites b) { Point apos=this.getPosition(); Point bpos=b.getPosition(); Dimension aSize=this.getSize(); Dimension bSize=b.getSize(); boolean leftbu =apos.x+aSize.width<=bpos.x; boolean rightbu =apos.x>=bpos.x+bSize.width; boolean upbu=apos.y+aSize.height<=bpos.y; boolean downbu=apos.y>=bpos.y+bSize.height; boolean buxiangjiao=leftbu||rightbu||upbu||downbu; return !buxiangjiao; }
whereismymindM 2018-01-25
  • 打赏
  • 举报
回复
引用 6 楼 hjgzj 的回复:
[quote=引用 3 楼 sinat_41605575 的回复:] 谢谢上面的回复!刚开始玩这个网站,怎么就没找到单独回复层主的地方,只能再开个层回复了!
看见引用两个字没[/quote] 看到了!看到了!差点瞎了!
  • 打赏
  • 举报
回复
引用 3 楼 sinat_41605575 的回复:
谢谢上面的回复!刚开始玩这个网站,怎么就没找到单独回复层主的地方,只能再开个层回复了!
看见引用两个字没
whereismymindM 2018-01-24
  • 打赏
  • 举报
回复
2楼的,你回复的第一个是什么意思我没看明白,我就是要马里奥碰到墙就不再往前走,所以这个没问题。然后我说的太空步是,比如马里奥紧贴着图片的上方,然后我想让他往左,它却往右。我猜是当时马里奥下边框的y坐标和图片上边框的坐标相等,也就是相交,所以这个时候我一按左它就往后退,但是我搞不明白,如果相交,马里奥不是应该后退一步,也就是马里奥看似贴着图片的上面,其实应该跟图片还高一个像素的距离吧,这时候我按左它怎么还是往右?
whereismymindM 2018-01-24
  • 打赏
  • 举报
回复
谢谢上面的回复!刚开始玩这个网站,怎么就没找到单独回复层主的地方,只能再开个层回复了!
my_panpan 2018-01-22
  • 打赏
  • 举报
回复
1、无论上下左右碰到墙会停 原因是你没有处理顺墙走的逻辑,你的四种分支如下,如果相同呢,当然是什么都不做。 if(marioPos.x>0) if(marioPos.x<gameSize.width-marioSize.width) if(marioPos.y>0) if(marioPos.y<gameSize.height-marioSize.height-50) 2、你说的卡顿太空步感觉是不是一个操作行动了很多步的意思,你的十张图片随机摆放会有多个图片都和mario相交的可能,这时会一下走好几步。
for(int i=0;i<10;i++)
        	{
        	if(mario.isXiangJiao(jieLaDe[i]))
        	{
        	mario.moveDown();
        	
        	}
逻辑上碰到一面墙后退一步就ok、这里循环需要break
加载更多回复(1)

62,614

社区成员

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

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