哪位知道坦克大战的bim碰撞检测测怎么做

匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。11被浏览1545分享邀请回答0添加评论分享收藏感谢收起0添加评论分享收藏感谢收起查看: 3696|回复: 7
注册时间最后登录阅读权限20积分23精华0帖子
士兵, 积分 23, 距离下一级还需 177 积分
添加地图之后,如何实现坦克和地图的碰撞呢,我添加了另外一个mapdata[][],如果mapdata[][]==1的话就停止移动,这样却没有作用,我想请教您一下如何进行坦克和bitmap的碰撞
& && && && &bitmapdata = new LBitmapData(imglist[&map&]);&&
& && && && &imageArray = LGlobal.divideCoordinate(bitmapdata.image.width,bitmapdata.image.height,10,10);
& && && && &for(i=0;i&20;i++){&&
& && && && && & for(j=0;j&20;j++){& &
& && && && && & index = map[i][j];& &
& && && && && & indexY = Math.floor(index /10);& &
& && && && && & indexX = index - indexY*10;
& && && && && &bitmapdata = new LBitmapData(imglist[&map&],indexX*32,indexY*32,32,32);&&
& && && && && &bitmap = new LBitmap(bitmapdata);&&
& && && && &&&bitmap.x = j*32;&&
& && && && &&&bitmap.y = i*32;& &&&
& && && && &&&backLayer.addChild(bitmap);&&
& && && && && && && && && && && && && && && &}&&
& && && && && && && && && && && && & }&&
(142.11 KB, 下载次数: 0)
20:58 上传
点击文件名下载附件
注册时间最后登录阅读权限200积分7747精华1帖子
你的代码只是添加地图部分吧,你控制坦克行走的代码不发除了我也不知道你哪里写错了啊
不回答与技术和引擎不相关的问题
注册时间最后登录阅读权限20积分23精华0帖子
士兵, 积分 23, 距离下一级还需 177 积分
lufy 发表于
你的代码只是添加地图部分吧,你控制坦克行走的代码不发除了我也不知道你哪里写错了啊 ...
行走部分的代码贴下面了,您看看
注册时间最后登录阅读权限20积分23精华0帖子
士兵, 积分 23, 距离下一级还需 177 积分
Tank.prototype.move = function() {
& & & & & & & & & & & & & & & & var self =
& & & & & & & & & & & & & & & & if(self.x == self.targetX && self.y == self.targetY)
& & & & & & & & & & & && && && &if(self.moveX != 0){
& & & & & & & & & & & & & & & & & & & & self.x += self.moveX;
& & & & & & & & & & & & & & & & & & & &&&if(mapdata[self.x/32][self.y/32]==1){self.x -=self.moveX;}
& & & & & & & & & & & & & & & & & & & & if(self.x == self.targetX){
& & & & & & & & & & & & & & & & & & & & & & & & self.moveX = 0;
& & & & & & & & & & & & & & & & & & & & & & & & self.moveY = self.y & self.targetY ? -1 : 1;
& & & & & & & & & & & & & & & & & & & & }
& & & & & & & & & & & & & & & & }else if(self.moveY != 0){
& & & & & & & & & & & & & & & & & & & & self.y += self.moveY;
& & & & & & & & & & & & & & & & & & & & if(mapdata[self.x/32][self.y/32]==1){self.y -=self.moveY;}
& & & & & & & & & & & & & & & & & & & & if(self.y == self.targetY){
& & & & & & & & & & & & & & & & & & & & & & & & self.moveY = 0;
& & & & & & & & & & & & & & & & & & & & & & & & self.moveX = self.x & self.targetX ? -1 : 1;
& & & & & & & & & & & & & & & & & & & & }
& & & & & & & & & & & & & & & & }else{
& & & & & & & & & & & & & & & & & & & & if(self.x == self.targetX){
& & & & & & & & & & & & & & & & & & & & & & & & self.moveY = self.y & self.targetY ? -1 : 1;
& & & & & & & & & & & & & & & & & & & & }else if(self.y == self.targetY){
& & & & & & & & & & & & & & & & & & & & & & & & self.moveX = self.x & self.targetX ? -1 : 1;
& & & & & & & & & & & & & & & & & & & & }else if(Math.random() & 0.5){
& & & & & & & & & & & & & & & & & & & & & & & & self.moveX = self.x & self.targetX ? -1 : 1;
& & & & & & & & & & & & & & & & & & & & }else{
& & & & & & & & & & & & & & & & & & & & & & & & self.moveY = self.y & self.targetY ? -1 : 1;
& & & & & & & & & & & & & & & & & & & & }
& & & & & & & & & & & & & & & & }
& & & & & & & & & & & & }
注册时间最后登录阅读权限200积分7747精华1帖子
陈铭 发表于
Tank.prototype.move = function() {
& & & & & & & & & & & & & & & & var self =
& & & & & & & & & & & & & & & & if(self.x == self.targetX && self.y == s ...
坦克的移动,不能单纯的通过move来控制
目前书里的做法,因为没有地图,所以将鼠标点击的位置发送给了服务器了,然后服务器告诉其他用户,这个坦克要移动到哪里
如果你要通过地图来限制坦克的移动的话,你需要自己设计一套寻路算法,或者A*,或者广度算法,或者深度算法,等等吧。
来控制坦克的移动路线。
鼠标点击地图的时候,先判断坦克是否可以移动到那里,如果可以,则报告给服务器,服务器广播给所有用户,如果你的算法最后决定的路线是一样的,那么所有人在他们的本地看到的那个坦克的行走路线也就是一样的。
流程是这么个流程,具体寻路算法,你可以自己查一查相关资料
或者我博客中有关于A星算法的原理介绍,和js的实现
你可以参考一下
不回答与技术和引擎不相关的问题
注册时间最后登录阅读权限20积分23精华0帖子
士兵, 积分 23, 距离下一级还需 177 积分
lufy 发表于
坦克的移动,不能单纯的通过move来控制
目前书里的做法,因为没有地图,所以将鼠标点击的位置发送给了服 ...
您好,寻找路径的功能实现了,现在子弹与地图上的蓝色块的碰撞怎么实现呢?使用这个函数么?LGlobal.hitTestArc(),还是用mapdata[][]=1来检测呢
Bullet.prototype.onframe = function() {
& & & & & & & & & & & & & & & & var self =
& & & & & & & & & & & & & & & & if(self.isdie)
& & & & & & & & & & & & & & & & self.x += self.
& & & & & & & & & & & & & & & & self.y += self.
& & & & & & & & & & & & & & & & if(self.x & 0 || self.x & LGlobal.width || self.y & 0 || self.y & LGlobal.height){
& & & & & & & & & & & & & & & & & & & & self.isdie =
& & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & }
& & & & & & & & & & & && &&&
& & & & & & & & & & & & & & & & for(j=0;j&tanklist.j++){
& & & & & & & & & & & & & & & & & & & & tank = tanklist[j];
& & & & & & & & & & & & & & & & & & & & if(tank.name != self.name && LGlobal.hitTestArc(self,tank)){
& & & & & & & & & & & & & & & & & & & & & & & & self.isdie =
& & & & & & & & & & & & & & & & & & & & & & & & socket.send(&type=kill&name=&+tank.name);
& & & & & & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & & & & & }
& & & & & & & & & & & & & & & & }
& & & & & & & & & & & & }
注册时间最后登录阅读权限200积分7747精华1帖子
陈铭 发表于
您好,寻找路径的功能实现了,现在子弹与地图上的蓝色块的碰撞怎么实现呢?使用这个函数么?LGlobal.hitT ...
可以在这个函数中判断。
两种方式都是可以的,但是,既然你的地图已经是设定好的,那么直接判断子弹的所在位置的地形,应该就是你说的mapdata,这样的话效率会更高
不回答与技术和引擎不相关的问题
注册时间最后登录阅读权限20积分23精华0帖子
士兵, 积分 23, 距离下一级还需 177 积分
lufy 发表于
可以在这个函数中判断。
两种方式都是可以的,但是,既然你的地图已经是设定好的,那么直接判断子弹的所 ...
非常感谢您,完成啦,么么哒
Powered by主题 : 哪位知道坦克大战的碰撞检测怎么做
级别: 新手上路
可可豆: 40 CB
威望: 40 点
在线时间: 2(时)
发自: Web Page
哪位知道坦克大战的碰撞检测怎么做&&&
哪位知道坦克大战的碰撞检测怎么做
级别: 天使
UID: 432850
发帖: 34758
可可豆: 335461 CB
威望: 335459 点
在线时间: 1063(时)
发自: Web Page
回 楼主(aarontree) 的帖子
boundingbox碰撞检测
论坛关注较少,若还有后续疑问请去提问
关注本帖(如果有新回复会站内信通知您)
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 关注CVP公众号
扫一扫 浏览移动版坦克大战项目文档;{0,0,0,0,0,0,0,0,0,0,0,0;for(inti=0;i;for(intj=0;j;Pointp=newPoint(i*50,j*5;case0:;//0无T作á??为acase1:;brickWall=newBrickWall(p;steelWall=newSteelWall(p;waterWall=newW
坦克大战项目文档
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,4,1,1,1,4,0,0,0,0,0,0},
{4,4,0,0,0,0,0,1,1,1,1,1,0,0,0,0,4,4},
{3,4,0,0,0,0,0,1,1,0,1,1,0,0,0,0,4,3},
for (int i = 0; i < 14; i++)
for (int j = 0; j < 18; j++)
Point p = new Point(i * 50, j * 50); //墙?的ì?位?置?
switch (_WallArray[i, j])
//0 无T作á??为a
brickWall = new BrickWall(p);//1 砖á?墙?
_ListWall.Add(brickWall);
steelWall = new SteelWall(p); //2 钢?墙?
_ListWall.Add(steelWall);
waterWall = new WaterWall(p);// 3 河¨?流¢??
_ListWall.Add(waterWall);
meadoWall = new MeadoeWall(p); // 草Y地ì?
_ListWall.Add(meadoWall);
7、碰撞检测
碰撞检测贯穿整个游戏中,在游戏中要进行我方坦克与墙的碰撞检测、敌方坦克与墙的碰撞检测、我方子弹与敌方坦克的碰撞检测、敌方子弹与我方坦克的碰撞检测、子弹与墙的碰撞检测、子弹与老巢的碰撞检测、我方坦克与敌方坦克的碰撞检测。子弹与墙碰撞产生火花,子弹与坦克碰撞产生爆炸。进行碰撞检测的原理就是各对象在窗体上绘制出来都占有一个矩形,我们获取到这个矩形,当不同对象的矩形相交就认为是碰撞了。然后我们根据具体的对象碰撞分别写各自的方法。我们在坦克父类、子弹父类、墙的父类和老巢的方法中写一个获得所在- 6 - 坦克大战项目文档 矩形的方法, public Rectangle GetRectangle()
return new Rectangle(_X, _Y, _Width, _Height);
} 1) 我方坦克与墙的碰撞检测 我方坦克在移动的过程中就进行碰撞检测,当碰到草地时,方向不变,当碰到其他墙时,就停止前进,由键盘操作改变方向继续前进。我方坦克的移动是在KeyDown事件下写的,因此碰撞检测也写在KeyDown事件下,而且在Move方法后面。我方坦克一移动就检测是否发生碰撞,以向上为例,代码如下: if (e.KeyCode == Keys.Up) //按???向¨°上|?键¨1
_MyTank.Direction = DirectionValue.Up; //我¨°方¤?坦?1克?向¨°上|?移°?动?¥
_MyTank.Move();
for (int i = 0; i < _ListWall.C i++)
Wall wall = _ListWall[i];
bool isMyTankHitWall = _MyTank.GetRectangle().IntersectsWith(_ListWall[i].GetRectangle()); //上|?衣°?过y程¨?中D与??墙?进?行D碰?撞á2检¨?测a
if (isMyTankHitWall)
if (wall is SteelWall || wall is WaterWall || wall is BrickWall)
_MyTank.Y = _ListWall[i].Y + _ListWall[i].H
_MyTank.Y = _MyTank.Y - _MyTank.S
} 2) .敌方坦克与墙的碰撞检测 敌方坦克与墙的碰撞检测原理一样,都是在移动的过程中进行检测,只不过在碰撞之后方向是自动改变的,要实现自动改变,我们采用随机数的方法来使方向随机改变。随机产生1-4这4个数,1表示向上,2表示向下,3表示向左,4表示向右。敌方坦克与墙的碰撞可以仿照我方坦克与墙的碰撞,在这里就不多说了。 3)我方子弹与墙的碰撞检测 我方子弹与墙的碰撞检测原理跟坦克与墙的碰撞检测一样,方法写在子弹移动的方法MoveBullet中。子弹与墙碰撞产生火花,并且子弹消失,如果- 7 - 坦克大战项目文档 是砖墙,撞墙也消失,跟草地没有任何反应。代码片段: for (int j = 0; j < _ListWall.C j++)
Wall wall = _ListWall[j];
bool isBulletHitWall = bullet.GetRectangle().IntersectsWith(wall.GetRectangle()); //子á¨?弹ì?¥与??墙?进?行D碰?撞á2检¨?测a
if (isBulletHitWall)
if (wall is SteelWall)
//子á¨?弹ì?¥与??钢?墙?碰?撞á2产¨2生|¨2火e花?§,ê?并?é把??子á¨?弹ì?¥移°?除y
Spark spark = new Spark(bullet.X, bullet.Y);
_ListSpark.Add(spark);
_ListBullet.Remove(bullet);
if (wall is BrickWall)
//子á¨?弹ì?¥与??砖á?墙?碰?撞á2产¨2生|¨2火e花?§,ê?并?é把??砖á?墙?,ê?子á¨?弹ì?¥移°?除y
Spark spark = new Spark(bullet.X, bullet.Y);
_ListSpark.Add(spark);
_ListWall.Remove(wall);
_ListBullet.Remove(bullet);
} 4)敌方坦克与墙的碰撞检测、我方子弹与敌方坦克相撞、敌方子弹与我放坦克相撞、我方坦克与敌方坦克相撞、子弹击中老巢的方法都可以仿照我方子弹与墙的碰撞检测进行编写,这样就可以举一反三。
8、边界判断
在游戏中,子弹出边界后就从集合中移除子弹,我方坦克移动到边界后就停止移动,敌方坦克移动到边界就自动改变方向,这些都要进行判断,代码写在各自的Move方法里。
9、窗体刷新
所有的对象都在主窗体中绘制,要显示出效果就要不断地刷新主窗体,因此设置一个线程来刷新主窗体。
10、游戏效果图 图1:游戏刚开始 - 8 - 坦克大战项目文档
图2:我方胜利后在窗体上显示消息框
图3:敌方胜利胜利后在窗体显示消息框 - 9 - 坦克大战项目文档
图4:老巢被攻破
四、心得体会
坦克大战中我遇到的第一个问题是子弹的发射,当时我完全没有思路,老师也讲了子弹发射的思路,可我就是不会写,来回纠结了一天,直到同桌作出了我方子弹的发射,我看了代码才慢慢开始写,最后也算写出来了。我觉得这就是我的问题,遇到问题还是比较毛躁,不敢下手去写。老师教导我们遇到问题时把- 10 - 坦克大战项目文档 问题下下来然后分析,这种方法很好,但由于我的毛躁,这种方法这次没能得到很好的实施,下回一定注意,心态一定要平和。第一次写坦克大战还有一个致命错误就是笔误。我记得这次遇到好几次,其中就像敌方坦克发不出子弹,草地和水墙画不出来都是笔误的问题,这是一个细节问题,也是一个细心问题,要引起高度的重视。项目中团队合作很重要,就像项目类图的绘制就是充分的证明,两人一组进行讨论,最后定出最终类图。在遇到问题自己想不出解决办法时一定要向他人请教,不能不问,敢问才能解决问题,才能进步。坦克大战是在赛车项目后做的第一个项目,总得还感觉不错,以后要更加努力,做的更好!
- 11 - 三亿文库包含各类专业文献、专业论文、幼儿教育、小学教育、高等教育、文学作品欣赏、行业资料、50坦克大战项目总等内容。 
 拓展项目――坦克大战_计算机软件及应用_IT/计算机_专业资料。拓展训练,拓展项目,拓展课程 坦克大战明阳天下拓展 项目简介团队的所有成员在规定的时间和规则的约束下...  本文档供项目经理、设计人员、开发人员参考。 1.2 项目背景 a. 项目名称:坦克大战游戏开发 b. 产品用户:对该游戏感兴趣的玩家 c. 项目和系统的关系: 本项目...  坦克大战项目_计算机软件及应用_IT/计算机_专业资料。坦克大战项目分组说明一、 讲说者姓名 项目结构说明 项目分 12 个类,分别为: 1. 服务器 2. 服务器线程 ...  项目-坦克大战-设计报告_计算机软件及应用_IT/计算机_专业资料 暂无评价|0人阅读|0次下载|举报文档项目-坦克大战-设计报告_计算机软件及应用_IT/计算机_专业资料。...  项目名称: BattleCity[FC 版坦克大战] 项目编号: 文档编号: BattleCity[FC 版坦克大战]版本:Ver0.1 东软人才实训中心 总页数 10 正文 8 附录 审批: 0 生效...  坦克大战游戏规则_企业管理_经管营销_专业资料。团队拓展游戏坦克大战游戏规则 1. 所有同学分为两个人数相等的队伍,每队每次设一名总司令和 2 名战场司令,战场司令...  《坦克大战》游戏策划方案_机械/仪表_工程科技_专业资料。《坦克大战》游戏策划...车间可以改装的项目包括:火炮,炮塔,车身,履带或者轮胎 7.2 道具商店 a 道具是...  坦克开发思想_文学研究_人文社科_专业资料。坦克开发思想 坦克开发思想 坦克大战项目开发流程、问题和介绍 . 分类: 项目开发流程详解
14:47473 人阅读...

我要回帖

更多关于 碰撞检测的作用 的文章

 

随机推荐