继续上一篇的创建游戏角色部分内容…

4、创建坦克角色

为了简单起见,我们暂时不按官方文档来,本教程的目的是让大家熟悉流程,太多其他的功能会影响大家的关注点,因此我这里创建的角色暂时先不添加消息处理,可激活体注册等这些代码,只是先创建一个静态角色能加载到场景中显示即可,后续会专门开篇写怎么添加消息处理函数、怎么注册可激活体等内容。

坦克角色部分代码如下:

// HoverTandActor.h
#ifndef HoverTankActor_h__
#define HoverTankActor_h__#include "delta3d_export.h"
#include <dtActors/gamemeshactor.h>class DELTA3D_EXPORT HoverTankActor : public dtActors::GameMeshDrawable
{
public:// 所有的角色类都需要以GameActorProxy为参数的构造函数HoverTankActor(dtGame::GameActorProxy &proxy);void setVelocity(float velocity);float getVelocity() const { return m_velocity; }public:// 当角色加载到场景中时由框架调用,常用于初始化角色virtual void OnEnteredWorld();protected:// 自动内存管理,需要把析构函数隐藏virtual ~HoverTankActor();  private:// Mesh由父类提供,可直接使用float m_velocity; // 此属性暂时在实现中不会使用,仅作代理绑定属性时使用
};#endif // HoverTankActor_h__

(原文档这里继承的是dtActors::GameMeshActor,发现构造函数并不支持此类,查阅源码后,发现此类的基类是角色代理dtGame::GameActorProxy,而这应该继承角色基类,所以这里需要改成dtActors::GameMeshDrawable,这才是角色基类)

角色的构造函数中需要传入一个游戏角色代理,所有的角色都需要有一个这样的构造函数

仅创建静态角色,以上代码就足够了,下面来看一下实现(主要是加载静态物体网格):

// HoverTandActor.cpp
#include "HoverTankActor.h"HoverTankActor::HoverTankActor(dtGame::GameActorProxy &proxy): dtActors::GameMeshDrawable(proxy)
{this->SetName("HoverTank"); // 设置角色名称
}void HoverTankActor::setVelocity(float velocity)
{m_velocity = velocity;
}void HoverTankActor::OnEnteredWorld()
{// 设置此角色的网格数据文件this->SetMesh("data/StaticMeshes/bmp_hover.ive");//这里调用父类的同名函数dtActors::GameMeshDrawable::OnEnteredWorld();
}HoverTankActor::~HoverTankActor()
{}

5、创建角色代理

我们在第4步创建了一个游戏角色,如前所说,我们还需要一个角色对应的代理。代理在GameManager框架中是非常重要的。不管我们在角色中写了多少代码,GameManager都只识别代理,角色只能通过角色代理来对外暴露角色的属性并通过可激活体处理来自游戏管理器的消息。下面来创建代理:

// HoverTankActorProxy.h
#ifndef HoverTankActorProxy_h__
#define HoverTankActorProxy_h__#include "delta3d_export.h"
#include <dtActors/gamemeshactor.h>// GameMeshActor是继承自GameMeshActorProxy,并实现及一些通用功能,因此可继承此类,实现自己的代理
class DELTA3D_EXPORT HoverTankActorProxy : public dtActors::GameMeshActor
{
public:HoverTankActorProxy();// 通过此方法创建自定义的属性,并暴露给外部,如STAGE编辑器virtual void BuildPropertyMap();// 绑定可激活体,绑定后,游戏管理器即可通知角色。默认已经绑定TickLocal、TickRemote、ProcessMessage// 此教程我们暂时不用绑定任何可激活体,使用默认的// virtual void BuildInvokables();protected:~HoverTankActorProxy();// 原文档是CreateActor,2.8.0中已改为CreateDrawablevirtual void CreateDrawable();// 当代理添加到GameManager中时,在AddActor函数中被调用,此方法在Actor中也有,可在这两个地方使用virtual void OnEnteredWorld();
};#endif // HoverTankActorProxy_h__

这里面有几个函数需要了解下:

  • BuildInvokables()

虽然在教程中我们不使用此函数,但是在创建我们自己的可激活体的时候就会用到,通过重载此函数,我们可窗创建各种不同的消息的消息处理器(可激活体),并在角色第一次被创建时调用,GameMeshActorProxy已经帮我们创建了三个可激活体,TickLocal(),TickReomte(),ProcessMessage(),因此在重载此函数时,需要首先调用父类的同名函数:dtActors::GameMeshActor::BuildInvokables()。

  • OnEnteredWrold()

在此函数中,处理当角色进入世界时希望的各种不同的行为,若播放声音、触发游戏事件等。该函数在GameManager::AddActor中被调用,且是在角色属性和可激活体创建完成后调用。此处我们需要在此注册tick事件及游戏事件,这样,角色类在重载OnTickLock,OnTickRemote,ProcessMessage函数后,即可处理相应的消息

  • BuildPropertyMap()

此函数用于绑定角色属性,并暴露给GameManager及STAGE编辑器,即可可视化的修改角色的属性值,具体实现,查看代理实现,如下:

// HoverTankActorProxy.cpp
#include "HoverTankActorProxy.h"
#include "HoverTankActor.h"#include <dtCore/floatactorproperty.h>
#include <dtUtil/functor.h>HoverTankActorProxy::HoverTankActorProxy()
{// 设置名称SetClassName("HoverTank");
}void HoverTankActorProxy::BuildPropertyMap()
{// 首先调用父类方法dtActors::GameMeshActor::BuildPropertyMap();// 分组,也就是在角色库添加在STAGE编辑器中是,此属性会分组到指定的名称下面const std::string GROUP = "HoverTank";HoverTankActor *actor = GetDrawable<HoverTankActor>();// Velocity属性AddProperty(new dtCore::FloatActorProperty("Velocity",      // 属性名称"速度",          // 标签dtCore::FloatActorProperty::SetFuncType(actor, &HoverTankActor::setVelocity),  // 修改属性值的方法dtCore::FloatActorProperty::GetFuncType(actor, &HoverTankActor::getVelocity),    // 获取属性值的方法"Set/Get the Hover tank's velocity.", // 属性描述GROUP)); // 分组
}HoverTankActorProxy::~HoverTankActorProxy()
{}void HoverTankActorProxy::CreateDrawable()
{// 创建游戏角色ActorSetDrawable(*new HoverTankActor(*this));
}void HoverTankActorProxy::OnEnteredWorld()
{dtActors::GameMeshActor::OnEnteredWorld();// 注册游戏消息,会自动发送到ProcessMessage可激活体RegisterForMessages(dtGame::MessageType::INFO_GAME_EVENT);// 注册TickLocal、TickRemote,只能选其中之一if (!IsRemote()){RegisterForMessages(dtGame::MessageType::TICK_LOCAL, dtGame::GameActorProxy::TICK_LOCAL_INVOKABLE);}else{RegisterForMessages(dtGame::MessageType::TICK_REMOTE, dtGame::GameActorProxy::TICK_REMOTE_INVOKABLE);}// XYZActor Invokable//  RegisterForMessages(FireFighterMessageType::GAME_STATE_CHANGED, "EventName");// 注册消息有两种方式/*RegisterForMessageAboutOtherActor() 和 RegisterForMessageAboutSelf()第二种可以只处理自己Actor发送的消息,即别的Actor关闭了引擎,不会影响自己需要在创建事件时设置角色Id,eventMsg->setAboutActorId();*/
}

以上我们就完成了角色和角色代理的创建,此时编译工程,即可生成成功,但离我们加载到STAGE场景编辑器或能被游戏管理器识别,还差一个角色注册器,下一部分介绍…

6、在场景编辑器中加载角色

待续

Delta3D(6)教程:创建游戏角色-2相关推荐

  1. 几乎所有的RPG游戏(一种源自《龙与地下城》的游戏类型)在进入游戏时都会让用户自己来创建自己喜欢的角色。本次上机要求编写一个简化的创建游戏角色的程序。

    一:题目分析 1.功能描述 几乎所有的RPG游戏(一种源自<龙与地下城>的游戏类型)在进入游戏时都会让用户自己来创建自己喜欢的角色.本次上机要求编写一个简化的创建游戏角色的程序. 2.游戏 ...

  2. C++ RPG创建游戏角色

    创建游戏角色``` (1).功能描述 几乎所有的RPG游戏(一种源自<龙与地下城>的游戏类型)在进入游戏时都会让用户自己来创建自己喜欢的角色.本次上机要求编写一个简化的创建游戏角色的程序. ...

  3. RPG角色生成器 1.功能描述 几乎所有的RPG游戏(一种源自《龙与地下城》的游戏类型)在进入游戏时都会让用户自己来创建自己喜欢的角色。要求编写一个简化的创建游戏角色的程序。 2.游戏角色应

    RPG角色生成器 1.功能描述 几乎所有的RPG游戏(一种源自<龙与地下城>的游戏类型)在进入游戏时都会让用户自己来创建自己喜欢的角色.本次上机要求编写一个简化的创建游戏角色的程序. 2. ...

  4. 用一个简单的创建游戏角色方案来理解类继承的运用以及浅淡protected权限修饰符的作用。

    最近不知道怎得懒了许多,就是不想写总结. 想了想还是在这里说下protected的权限关系吧,怕大家在后面找不到 首先我们可能在学c++中都会听到老师说protected权限是介于public和pri ...

  5. Delta3D(5)教程:创建游戏角色-1

    通过上一篇的介绍,应该对游戏角色有所了解了.下面,我们将创建我们自己的游戏角色,它是一个坦克,我们将通过代码编写此角色,然后生成一个角色库将其加载到场景编辑器,并创建一个小的包含坦克角色的场景地图. ...

  6. JavaFX战旗类游戏开发 第三课 创建游戏角色

    在上一节课程中,我们学习了在JavaFX中绘制游戏地图.这一节课,我们将会创建我们的游戏角色. 首先,同样的,我们创建一个简单的基类. import javafx.scene.canvas.Graph ...

  7. C++ RPG游戏角色的创建

    题目 几乎所有的RPG游戏(一种源自<龙与地下城>的游戏类型)在进入游戏时都会让用户自己来创建自己喜欢的角色.本次上机要求编写一个简化的创建游戏角色的程序. 1.游戏角色应有的属性 本题目 ...

  8. 复杂对象的组装与创建——建造者模式(一):游戏角色设计,建造者模式概述

    没有人买车会只买一个轮胎或者方向盘,大家买的都是一辆包含轮胎.方向盘和发动机等多个部件的完整汽车.如何将这些部件组装成一辆完整的汽车并返回给用户,这是建造者模式需要解决的问题.建造者模式又称为生成器模 ...

  9. 只需一张自拍,网易伏羲用这种方法直接生成「个人专属」游戏角色

    选自:arXiv 作者:Tianyang Shi等 参与:魔王 来源:机器之心(ID:almosthuman2014) 角色扮演游戏允许玩家挑选自己喜欢的角色或定制角色外观,但这一过程比较麻烦.那么, ...

  10. RPG游戏角色生成器

    一,题目分析: 1. 题目:编写一个简化的创建游戏角色的程序: 2. 分析:要编写此程序,建立一个角色类,围绕角色类进行选择和保存等操作.单一职责原则将不同的职责分离到单独的类,每一个职责都是一个变化 ...

最新文章

  1. 思考:行业客户项目中的代理商(国外厂商)
  2. python excel增加一列_(用Python修改excel中一列数据)python新增一列
  3. 存储ic载板_【热点】深南电路:通讯PCB维持增长 IC载板打造成长新核心
  4. java hashcode返回值_Java String hashCode() 使用方法及示例
  5. C:如何分解整数(从末位往前取以及从首位往后取)
  6. python给出数据点进行插值_Python对数据进行插值和下采样的方法
  7. c语言中各个符号的意义及作用是什么,C语言特殊符号意义
  8. PAIP.HIBERNATE ORA-02289 sequence does not exist的解决
  9. matlab:randn函数产生图像高斯噪声
  10. Axure RP8介绍
  11. 不知道如何管理眼镜店?这款管理软件帮助你搞定所有烦恼!
  12. 零基础系统化学习白帽黑客技术
  13. shiro中基于注解实现的权限认证过程
  14. aspose实现word,excel在线预览
  15. javaweb三大框架
  16. UDF、UDAF、UDTF之间的区别
  17. 截至20161210深市股票代码和名称
  18. 计算机操作系统原理--Linux实例分析
  19. 在贵州大数据峰会上,马云再次语出惊人!
  20. 小飞升值记——(终章)

热门文章

  1. 元气骑士超级科学计算机有什么用,元气骑士超级科学计算机攻略 天赋及获取方式汇总...
  2. itunes显示无法更新服务器失败怎么办啊,更新iTunes出现错误解决办法介绍
  3. android rn热更新闪退,react-native 导致热更新失败的问题之一
  4. 杭州最新公交线路一览(41-50)
  5. 思科ccie认证网络工程师——MAC地址认证和MAC地址旁路认证解析必看
  6. 大话西游2服务器修改,大话西游2:9.17维护解读:五倍次数修改全服上线,灵兽村要变样啦...
  7. 出现—passwd:Authentication token manipulation error—错误的解决办法
  8. 移动硬盘做pe启动盘
  9. 最后一个自己_拔剑-浆糊的传说_新浪博客
  10. 使用PHP获取图像文件的EXIF信息