游戏开发论坛

 找回密码
 立即注册
搜索
查看: 5210|回复: 10

飞机游戏的问题!???

[复制链接]

5

主题

9

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2003-12-1 14:46:00 | 显示全部楼层 |阅读模式
飞机的子弹和敌机碰撞的问题不知如何解决?
我是这样写的:
For i=1 to (子弹数的上限)
   For j=1 to (敌机数的上限)
      If  子弹(i).左边<敌机(j).右边 And 子弹(i).右边>敌机(j).左边 _
          子弹(i).上边<敌机(j).下边 And 子弹(i).下边>敌机(j).上边 Then
          ----(发生碰撞后的事件)
      End
   Next j
Next i
这样写没问题!不过效率不高!如果射出了30粒子弹和有10只敌机,这样就要每次检测300次,这样好像比较消耗资源,而且我是1毫秒检测一次的,还有这只是子弹和敌机的碰撞,其它的还有飞机和敌机的碰撞,飞机和敌机子弹的碰撞。如此这样效率不是很低!有什么方法可以降低检测次数和检测频率?我想请教各位是用什么方法来写的,怎样才能写出高效的碰撞事件?我是用VB+DX7写的!

15

主题

73

帖子

81

积分

注册会员

Rank: 2

积分
81
发表于 2003-12-1 15:51:00 | 显示全部楼层

Re:飞机游戏的问题!???

你将你的游戏空间用空间盒子分开了没?
比如一块地图(也包括地图上的空间和物体)你将他分为对等的四块(左上角一块,右上角一块,左下角一块右下角一块),然后在判断你的飞机在那块空间上就只和那个空间的物体进行碰撞检测(子弹也是一样),这样你的碰撞检测数量只有四分之一.但不是分得越多越好,还要分得巧妙比如向目录的排列就可以节约很多计算(你可以又在四个盒子内在分四个或两个).这样的做法比较复杂但很高效...

2

主题

52

帖子

52

积分

注册会员

Rank: 2

积分
52
发表于 2003-12-1 16:02:00 | 显示全部楼层

Re:飞机游戏的问题!???

我觉得还有一种方法:
因为子弹的方向是固定的,可以只检测移动方向上的物体碰撞,而其他的
不在子弹发射方向上的就可以跳过了。

15

主题

73

帖子

81

积分

注册会员

Rank: 2

积分
81
发表于 2003-12-2 10:52:00 | 显示全部楼层

Re:飞机游戏的问题!???

csj_alan

我认为你的方法跟 AN 的方法是一样的.因为你怎么知道其他物品不跟子弹碰撞呢?还是要跟所有的物体进行碰撞检查才能知道他的位置是否重叠

8

主题

68

帖子

68

积分

注册会员

Rank: 2

积分
68
发表于 2004-8-21 10:52:00 | 显示全部楼层

Re:飞机游戏的问题!???

用winapi可以解决.看~~
IntersectRect
What is IntersectRect?
This function takes to RECT types and determines whether they overlap each other. Let’s take a look at this function.



Public Declare Function IntersectRect Lib "user32" (lpDestRect As RECT, lpSrc1Rect As RECT, lpSrc2Rect As RECT) As Long



lpDestRect ? This RECT will receive the area that the 2 RECTs crossed over. You would be able to use this RECT for pixel perfect detection. More on that in a later lesson (maybe…)

lpSrc1Rect ? The first source RECT

lpSrc2Rect ? The second source RECT



[Code Start]

Dim tmpRECT as RECT
Dim PlayerX as Integer, PlayerY As Integer

Dim CompX As Integer, CompY as Integer

Dim PlayerRect as RECT, CompRect As RECT



‘//We are assuming the dimenions of the player are 50x50 and the comp 50x50

‘//createrect is a helper function I wrote for creating rects.

PlayerRect = CreateRect(PlayerX, PlayerY, PlayerX +50, PlayerY + 50)

CompRect = CreateRect(CompX,CompY,CompX + 50, CompY + 50)



If IntersectRect(tmpRECT,PlayerRect,CompRect) = True Then ‘//there was an overlap between the 2 rects

            ‘//code here

End If

[Code Stop]

140

主题

1228

帖子

1233

积分

金牌会员

Rank: 6Rank: 6

积分
1233
QQ
发表于 2004-8-21 21:24:00 | 显示全部楼层

Re:飞机游戏的问题!???

降低精确度!横向200格,竖向150格够了吗!?那就够成一个200,150的数组!随时写入、查询数组就很快了!

12

主题

54

帖子

56

积分

注册会员

Rank: 2

积分
56
发表于 2004-8-23 22:13:00 | 显示全部楼层

Re:飞机游戏的问题!???

2楼想的真是好办法,不过好象忘记了一步---就是你同样不得不花时间检查每一颗子弹是否跨了区域。而且你说的也没有回答到楼主的问题。
楼主只不过是不想在例如只有30粒子弹和有10只敌机的时候,还得每次检测300次。
要想有多少颗子弹,就只循环多少次,那就不要用数组,用Collection吧,但不保证效率一定会提高,这要瞧实际情况。
dim ZDcoll as collection'子弹集合
set ZDcoll=new collection
dim ZDNum as long
ZDNum=ZDcoll.count'这个是子弹的数量
for i=1 to ZDNum'这个是子弹的循环
'每个子弹的处理
next
清楚了吗,飞机同理

32

主题

1583

帖子

1589

积分

金牌会员

Rank: 6Rank: 6

积分
1589
发表于 2004-9-2 20:25:00 | 显示全部楼层

Re:飞机游戏的问题!???

7楼的Collection集合确实可以方便代码编制者和读者,但效率并没有本质提高。(我看也提高不了多少了)

还有,不一定要用Collection,自己创建一个新的对象,往往比单纯使用VB提供通用的东西好。
比如这个例子,你自己创建一个对象,除了包含集合之外,还可以储存一些子对象(比如子弹)的公共属性。或者直接把Collection定义在一个类内。

73

主题

612

帖子

618

积分

高级会员

Rank: 4

积分
618
发表于 2004-9-3 09:39:00 | 显示全部楼层

Re:飞机游戏的问题!???

Collection的执行效率肯定比数组效率差,所以主张使用数组,不用集合

32

主题

1583

帖子

1589

积分

金牌会员

Rank: 6Rank: 6

积分
1589
发表于 2004-9-10 10:23:00 | 显示全部楼层

Re:飞机游戏的问题!???

集合的效率可能比数组低,但我是绝对坚持使用集合的。

集合符合面向对象设计思想,不至于在程序大的时候让你觉得整个程序
犹如一团乱麻。我以前在编游戏时使用通用模块加数组加用户自定义变量
时,到了后期我都不知道如何记住这么多变量数组到底是干什么的了。
在这种情况下加注释没有多大帮助的。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-22 15:58

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表