文档章节

《Genesis-3D开源游戏引擎--横版格斗游戏制作教程03:碰撞检测》

Genesis-3D
 Genesis-3D
发布于 2014/01/14 13:47
字数 1281
阅读 229
收藏 0

3.碰撞检测

碰撞检测的概述:

碰撞在物理学中表现为两粒子或物体间极端的相互作用。而在游戏世界中,游戏对象在游戏世界自身并不受物理左右,为了模拟真实世界的效果,需要开发者为其添加属性,以模拟真实事件的运动效果。在游戏世界里,当游戏主角与其它游戏对象发生碰撞时,都会触发一个相应的事件发生。这时候就需要开发者先检测到碰撞现象,即碰撞检测。在Genesis-3D引擎中,能检测碰撞发生的方式有两种:一种是利用碰撞器,一种是利用触发器。

碰撞检测原理:

为需要检测碰撞事件的物体创建子空Actor,作为检测碰撞物体的包装盒,用于程序对碰撞事件发生的判定。实时检测包围盒之间是否发生交叉、包含等关系时候,如若发生,及判定检测碰撞发生,触发碰撞事件。


图3-1-1

 

实现方法:
实现整个碰撞事件过程中,值得开发者花心思的是检测这一块内容。举例:主角攻击敌人的碰撞检测事件。在一定范围内,玩家控制主角攻击敌人,武器与敌人发生碰撞检测事件,敌人掉血。本来一系列的程序设定都十分顺畅,但这里要注意,因为碰撞检测是实时监测,但是碰撞结果掉血在这一过程中只发生一次,如何在一定事件内,只发生一次碰撞事件的成功检测,值得开发者考究一下。

步骤1:
碰撞检测体包围盒的制作。在场景中创建->空物体(空物体,即空Actor),将空Actor拖动到物体上,成为其子空Actor。
步骤2:
程序上碰撞提包围盒的创建如下所示。

01//玩家碰撞体的创建,三部分:左手、右手和身体
02public override void OnLoad()
03{
04 Actor leftActor = ActorManager.FindActiveActor("BBCollider_LeftCollider");
05 Actor rightActor = ActorManager.FindActiveActor("BBCollider_RightCollider");
06 Actor playerActor = ActorManager.FindActiveActor("BBCollider_Player");
07 playerCollder.RegistFun(playerActor,BBCollideHitCallBack);
08 leftCollder.RegistFun(leftActor ,BBCollideCallBack);
09 rightCollder.RegistFun(rightActor,BBCollideCallBack);
10 Logic.BBCollideMgr.Instance.Register(leftCollder);
11 Logic.BBCollideMgr.Instance.Register(rightCollder);
12 Logic.BBCollideMgr.Instance.Register(playerCollder);
13}
14//敌人的碰撞体创建分两部分:武器和身体。
15public override void OnLoad()//武器
16{
17 Logic.BBCollder weaponCollder = new Logic.BBCollder();
18 Actor weaponCollderActor = Owner;
19 if (weaponCollderActor != null)
20 {
21  weaponCollder.RegistFun(weaponCollderActor, BBCollideATKCallBack);
22  Logic.BBCollideMgr.Instance.Register(weaponCollder);
23 }
24}
25
26public override void OnLoad()//敌人
27{
28 string ownerNum = Owner.Name.Substring(TriggerNameHead.Length);
29 EnemyParent = ActorManager.FindActiveActor(EnemyParentNameHead + ownerNum);
30 Name = "BBCollider_Enemy001";
31 Logic.BBCollder collder = new Logic.BBCollder();
32 Actor collderActor = Owner;
33 if (collderActor != null)
34 {
35  collder.RegistFun(collderActor, BBCollideCallBack);
36  Logic.BBCollideMgr.Instance.Register(collder);
37 }
38}
步骤3:
碰撞检测。
view sourceprint?
01//实时监测碰撞状态
02public void Tick(float elapseTime)
03{
04 //遍历碰撞体容器,检测每两个碰撞体间碰撞状态
05 int iCollidersCount = Colliders.Count;
06 for (int ii = 0; ii < iCollidersCount; ++ii)
07 {
08  for (int jj = ii + 1; jj < iCollidersCount; ++jj)
09  {
10   RemoveBeCollidedActor(Colliders[ii], Colliders[jj]);
11   BoundingBox bbi = Colliders[ii].ColliderActor.WorldBoundingBox;
12   BoundingBox bbj = Colliders[jj].ColliderActor.WorldBoundingBox;
13   if (ClipStatus.Outside != bbi.Contains(bbj) && ClipStatus.Outside != bbj.Contains(bbi))
14   {
15    if (Colliders[jj].ColliderActor.IsActive && !Colliders[ii].IsContainsBeCollidedActor(Colliders[jj].ColliderActor))
16    {
17     Colliders[ii].Call(Colliders[jj].ColliderActor);
18     Colliders[ii].AddBeCollidedActor(Colliders[jj].ColliderActor);
19    }
20
21    if (Colliders[ii].ColliderActor.IsActive && !Colliders[jj].IsContainsBeCollidedActor(Colliders[ii].ColliderActor))
22    {
23     Colliders[jj].Call(Colliders[ii].ColliderActor);
24     Colliders[jj].AddBeCollidedActor(Colliders[ii].ColliderActor);
25    }
26   }
27  }
28 }
29}
30//移除碰撞对象
31private void RemoveBeCollidedActor(BBCollder actor, BBCollder beCollided)
32{
33 BoundingBox actorBox = actor.ColliderActor.WorldBoundingBox;
34 BoundingBox beCollidedBox = beCollided.ColliderActor.WorldBoundingBox;
35 if (ClipStatus.Outside == actorBox.Contains(beCollidedBox))
36 {
37  actor.RemoveBeCollidedActor(beCollided.ColliderActor);               
38 }
39  if (ClipStatus.Outside == beCollidedBox.Contains(actorBox))
40 {
41  beCollided.RemoveBeCollidedActor(actor.ColliderActor);               
42 }
43}
44
45//定义BBCollder类
46public class BBCollder
47{
48 public void RegistFun(Actor self, callback fun)
49 {
50  _colliderActor = self;
51  _callback = fun;
52 }
53 public void Call(Actor other)
54 {
55  _callback(other);
56 }
57//
58public void RemoveBeCollidedActor(Actor beCollidedActor)
59{
60 if (_beCollidedActors.Contains(beCollidedActor))
61 {
62  _beCollidedActors.Remove(beCollidedActor);
63 }
64}
65public bool IsContainsBeCollidedActor(Actor beCollidedActor)
66{
67 return _beCollidedActors.Contains(beCollidedActor);
68}
69public delegate void callback(Actor other);//注册回调函数???
70private callback _callback;
71private Actor _colliderActor;
72private List<actor> _beCollidedActors = new List<actor>(); //碰撞中Actor列表</actor></actor>
步骤4:
碰撞效果。举例:主角攻击敌人,敌人掉血。
01public void BBCollideHitCallBack (Actor other)
02{
03 if (other.Name.StartsWith ("BBCollider_EnemyATK"))
04 {
05 EnemyState state = Logic.EnemyMgr.Instance.EnemyState(other.Parent.Name);
06 bool judget = Logic.EnemyMgr.Instance.GetEnemyJudge(other.Parent.Name);
07  if (state == EnemyState.Attack && judget
08
                  && !Logic.LogicMgr.Instance.CurPlayer.CheckDefenseState()
09
                  && !Logic.LogicMgr.Instance.CurPlayer.CheckDieState())
10  {
11   int playerHP = Logic.PlayerDateMgr.Instance.HP;
12   playerHP --;
13   Logic.PlayerDateMgr.Instance.SetHP(playerHP);
14   Logic.LogicMgr.Instance.CurPlayer.State = Logic.CharacterState.Hurt;
15  }
16 }
17}

 

引擎官方网站:http://www.genesis-3d.com.cn/

官方论坛:http://bbs.9tech.cn/genesis-3d/

官方千人大群:59113309   135439306

YY频道-游戏开发大讲堂(完全免费,定期开课):51735288 

Genesis-3D开源游戏引擎:游戏起源,皆因有我!!!

 


© 著作权归作者所有

Genesis-3D
粉丝 12
博文 34
码字总数 33360
作品 0
佛山
私信 提问
《Genesis-3D开源游戏引擎--横版格斗游戏制作教程04:技能的输入与检测》

4.技能的输入与检测 概述: 技能系统的用户体验,制约着玩家对整个游戏的体验。游戏角色的技能华丽度,连招的顺利过渡,以及逼真的打击感,都作为一款游戏的卖点吸引着玩家的注意。开发者在开...

Genesis-3D
2014/01/14
307
0
《Genesis-3D开源游戏引擎--横版格斗游戏制作教程07:UI》

概述: UI即User Interface(用户界面)的简称。UI设计是指对软件的燃机交互、操作逻辑、界面美观的整体设计。好的UI设计不仅可以让游戏变得更有品位,更吸引玩家,还能充分体现开发者对游戏...

Genesis-3D
2014/01/14
1K
0
《Genesis-3D游戏引擎系列教程-进阶篇》1:物理

注:本系列进阶教程仅针对引擎编辑器:v1.2.2及以下版本 物理 资源下载 工程文件 物理组件是实现游戏功能的重要组成部分,Genesis-3D中三种物理组件刚体、碰撞器、角色控制器分别有其各自的作...

Genesis-3D
2014/01/20
508
0
《Genesis-3D开源游戏引擎完整实例教程-跑酷游戏篇:简介及目录》(附上完整工程文件)

跑酷游戏制作 游戏类型: 此游戏Demo,为跑酷类游戏。 框架简介: 游戏通常由程序代码和资源组成。如果说模型、贴图、声音之类的可以给游戏环境提供一个物理描述和设置,那么脚本和代码块会给...

Genesis-3D
2014/01/15
328
0
开源游戏框架(转至wiki)

免费和开源引擎,转载自维基 Agar - 一个高级图形应用程序框架,用于2D和3D游戏。 Allegro - 基于 C/C++ 的游戏引擎,支持图形,声音,输入,游戏时钟,浮点,压缩文件以及GUI。 Axiom 引擎 ...

Matrix4X4
2012/04/17
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

最简单的获取相机拍照的图片

  import android.content.Intent;import android.graphics.Bitmap;import android.os.Bundle;import android.os.Environment;import android.provider.MediaStore;import andr......

MrLins
55分钟前
4
0
说好不哭!数据可视化深度干货,前端开发下一个涨薪点在这里~

随着互联网在各行各业的影响不断深入,数据规模越来越大,各企业也越来越重视数据的价值。作为一家专业的数据智能公司,个推从消息推送服务起家,经过多年的持续耕耘,积累沉淀了海量数据,在...

个推
57分钟前
7
0
第三方支付-返回与回调注意事项

不管是支付宝,微信,还是其它第三方支付,第四方支付,支付机构服务商只要涉及到钱的交易都要进行如下校验,全部成功了才视为成功订单 1.http请求是否成功 2.校验商户号 3.校验订单号及状态...

Shingfi
今天
4
0
简述Java内存分配和回收策略以及Minor GC 和 Major GC(Full GC)

内存分配: 1. 栈区:栈可分为Java虚拟机和本地方法栈 2. 堆区:堆被所有线程共享,在虚拟机启动时创建,是唯一的目的是存放对象实例,是gc的主要区域。通常可分为两个区块年轻代和年老代。更...

DustinChan
今天
6
0
Excel插入批注:可在批注插入文字、形状、图片

1.批注一直显示:审阅选项卡-------->勾选显示批注选项: 2.插入批注快捷键:Shift+F2 组合键 3.在批注中插入图片:鼠标右键点击批注框的小圆点【重点不可以在批注文本框内点击】----->调出批...

东方墨天
今天
6
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部