1. 程式人生 > >MMORGP大型遊戲設計與開發(客戶端架構 part16 of vegine)

MMORGP大型遊戲設計與開發(客戶端架構 part16 of vegine)

由於近來比較忙碌和有些睏倦的原因,所以關於這部分的文章沒有及時更新,一句話:讓朋友們久等了!今天所講的是客戶端vengine(微引擎)中最後一個部分,就像上節所說,這一部分的內容比較多。可能有些朋友看了程式碼以及註釋後,仍有不少疑惑的地方,歡迎評論留言相互討論,如果有不好的地方,也希望大家勇於批評與指正。遊戲模組,是提供給客戶端最核心的部分,它將直接影響到遊戲內容,如資料、渲染等。

構架

CODE

  模組game下模組action 檔案item.h

複製程式碼
/**
 * PAP Engine ( -- )
 * $Id item.h
 * @link -- for the canonical source repository
 * @copyright Copyright (c) 2013-2014 viticm( 
[email protected]
) * @license * @user viticm<[email protected]/[email protected]> * @date 2014-3-24 18:06:13 * @uses vengine game action item class
*/ #ifndef VENGINE_GAME_ACTION_ITEM_H_ #define VENGINE_GAME_ACTION_ITEM_H_ #include "vengine/config.h" namespace vengine_game { namespace
action { typedef enum { kOperateTypeEmpty, // kOperateTypeSkill, //戰鬥技能 kOperateTypeItem, //物品 kOperateTypeXinfa, //心法 kOperateTypePetSkill, //寵物技能 kOperateTypeEquip, //裝備 kOperateTypeChatMood, //聊天動作 kOperateTypeMouseCommandRepair, //滑鼠指令--修理 kOperateTypeMouseCommandIdentify, //滑鼠指令--鑑定 kOperateTypeMouseCommandAddFriend, //
滑鼠指令--增加好友 kOperateTypeChangeSet, //一鍵換裝 kOperateTypeMouseCommandExchange, //交易 } operatetype_enum; class Reference; class VENGINE_API Item { public: virtual int32_t getid() const = 0; virtual const char* getname() const = 0; virtual const char* geticon() const = 0; virtual void seticon(STRING& name) = 0; virtual void set_checkstate(bool check) = 0; //新增引用 virtual void addreference(Reference* reference, bool is_menu_toolbar = false) = 0; //移除引用 virtual void removereference(Reference* reference) = 0; virtual operatetype_enum get_operatetype() const = 0; virtual const char* get_typestring() = 0; //對於戰鬥技能, 是技能表中的ID (DBC_SKILL_DATA) //對於生活技能,是生活技能表中的ID(DBC_LIFEABILITY_DEFINE) //對於物品,是物品表中的ID //對於心法,是心法表中的ID virtual int32_t get_defineid() const = 0; virtual int32_t getnumber() const = 0; //得到內部資料 virtual void* get_internaldata() const = 0; //得到解釋 virtual const char* getdescription() const = 0; virtual int32_t get_cooldownid() const = 0; //得到所在容器的索引 virtual int32_t get_positionindex() const = 0; //啟用動作 virtual void doaction() = 0; //啟用子動作 virtual void do_subaction() = 0; virtual bool isvalid() const = 0; //是否有效 virtual bool isenable() const = 0; //是否啟用 virtual void enable() = 0; virtual void disable() = 0; virtual bool cooldown_isover() const = 0; //檢查冷卻是否結束 //拖動結束 virtual void notify_dragdrop_dragged(bool destory, const char* targetname, const char* sourcename) = 0; //顯示tooltips virtual void notify_tooltips_show(int32_t left, int32_t top, int32_t right, int32_t bottom) = 0; //隱藏tooltips virtual void notify_tooltips_hide() = 0; //查詢邏輯屬性 virtual STRING get_attributevalue(const char* name) = 0; }; }; //namespace action }; //namespace vengine_game #endif //VENGINE_GAME_ACTION_ITEM_H_
複製程式碼

  模組game下模組action 檔案reference.h

複製程式碼
/**
 * PAP Engine ( -- )
 * $Id reference.h
 * @link -- for the canonical source repository
 * @copyright Copyright (c) 2013-2014 viticm( [email protected] )
 * @license
 * @user viticm<[email protected]/[email protected]>
 * @date 2014-3-24 19:17:02
 * @uses vengine game action reference class
 */
#ifndef VENGINE_GAME_ACTION_REFERENCE_H_
#define VENGINE_GAME_ACTION_REFERENCE_H_

#include "vengine/config.h"

namespace vengine_game {

namespace action {

//UI引用類
class VENGINE_API Reference {

 public:
   //邏輯Action消失
   virtual void bedestroyed() = 0;
   //資料更新
   virtual void update(int32_t itemid) = 0;
   //按鈕按下
   virtual void setcheck(bool check) = 0;
   //按鈕設定成default的狀態
   virtual void setdefault(bool flag) = 0;
   //進入冷卻
   virtual void enter_cooldown(int32_t time, float percent) = 0;
   //顯示字元, _char所顯示的字元,0不顯示
   typedef enum {
     kCornerNumberPositionTopLeft = 0,
     kCornerNumberPositionTopRight,
     kCornerNumberPositionFootLeft,
     kCornerNumberPositionFootRight
   } cornernumber_position_enum;
   virtual void set_cornerchar(cornernumber_position_enum position,
                               const char* _char) = 0;
   virtual void enable() = 0;
   virtual void disable() = 0;

};

}; //namespace action

}; //namespace vengine_game

#endif //VENGINE_GAME_ACTION_REFERENCE_H_
複製程式碼

  模組game下模組action 檔案system.h

複製程式碼
/**
 * PAP Engine ( -- )
 * $Id actionsystem.h
 * @link -- for the canonical source repository
 * @copyright Copyright (c) 2013-2014 viticm( [email protected] )
 * @license
 * @user viticm<[email protected]/[email protected]>
 * @date 2014-3-24 17:59:35
 * @uses vengine game action system module
 */
#ifndef VENGINE_GAME_ACTIONSYSTEM_H_
#define VENGINE_GAME_ACTIONSYSTEM_H_

#include "vengine/config.h"
#include "vengine/kernel/node.h"
#include "vengine/game/action/item.h"

namespace vengine_game {

namespace action {

class VENGINE_API System : public vengine_kernel::Node {

VENGINE_KERNEL_DECLARE_DYNAMIC(vengine_game_action_System);

 public:
   virtual Item* get(int32_t id) = 0;
   //當前正在顯示Tootips的按鈕
   virtual Item* get_tooltips_focus() = 0;
   virtual void save() = 0;
   //得到預設操作
   virtual Item* getdefault() = 0;
   //設定預設操作
   virtual void setdefault(Item* action) = 0;
   virtual void set_systemkey_state(int32_t keystate, bool is_Fkey) = 0;

};

} //namespace action

}; //namespace vengine_game

#endif //VENGINE_GAME_ACTIONSYSTEM_H_
複製程式碼

  data資料模組暫時沒用,所以也就不貼出原始碼了

  模組game下模組object 檔案base.h

複製程式碼
/**
 * PAP Engine ( -- )
 * $Id base.h
 * @link -- for the canonical source repository
 * @copyright Copyright (c) 2013-2014 viticm( [email protected] )
 * @license
 * @user viticm<[email protected]/[email protected]>
 * @date 2014-3-24 19:45:21
 * @uses vengine game object base class
 */
#ifndef VENGINE_GAME_OBJECT_BASE_H_
#define VENGINE_GAME_OBJECT_BASE_H_

#include "vengine/config.h"
#include "vengine/kernel/node.h"
#include "vengine/render/entitynode.h"
#include "vengine/cursor/system.h"

namespace vengine_game {

namespace object {

typedef enum {
  kStatusNone = 0x0,
  kStatusVisiable = 0x1, //是否可見
  //已經不再玩家的視野範圍,如果該值維持一定時間,則會被刪除
  kStatusOutVisualField = 0x2,
  kStatusRayQuery = 0x3, //滑鼠是否能選中
} status_enum;

const uint8_t kExtraParamMax = 3;

class VENGINE_API Base : public vengine_kernel::Node {

VENGINE_KERNEL_DECLARE_DYNAMIC(vengine_game_object_Base);

 public:
   //根據初始化物體,並同步到渲染層
   virtual void init(void*) = 0;
   //得到物體的ID
   virtual int32_t getid() const = 0; //客戶端
   virtual int32_t get_serverid() const = 0; //與伺服器同步的ID
   //設定某項基本狀態為enable
   virtual void enable(uint8_t flag) = 0;
   //設定某項基本狀態為disable
   virtual void disable(uint8_t flag) = 0;
   virtual bool isenable(uint8_t flag) = 0;
   virtual bool isdisable(uint8_t flag) = 0;
   //是否能夠被作為主目標選擇
   virtual bool can_beselect() const = 0;
   //獲得渲染層指標
   virtual vengine_render::EntityNode* get_renderinterface() = 0;

 public:
   typedef enum {
     kTripperObjectTypeNone, //非tripper物體
     kTripperObjectTypeTransPort, //轉送點
     kTripperObjectTypeItemBox, //掉落箱子
     kTripperObjectTypeResource, //生活技能中的礦物資源
     kTripperObjectTypePlatform, //生活技能中的合成所需要的平臺
   } tripperobject_type_enum;
   //物體型別
   virtual tripperobject_type_enum tripper_gettype() const = 0;
   //能否滑鼠操作
   virtual bool tripper_canoperate() const = 0;
   //獲得滑鼠型別
   virtual vengine_cursor::type_enum tripper_getcursor_type() const = 0;
   //進入啟用狀態
   virtual void tripper_active() = 0;

VENGINE_KERNEL_DECLARE_LOGICAL(false); //宣告該物件沒有邏輯功能

};

}; //namespace object

}; //namespace vengine_game

#endif //VENGINE_GAME_OBJECT_BASE_H_
複製程式碼

  模組game下模組object 檔案basesystem.h

複製程式碼
/**
 * PAP Engine ( -- )
 * $Id basesystem.h
 * @link-- for the canonical source repository
 * @copyright Copyright (c) 2013-2014 viticm( [email protected] )
 * @license
 * @user viticm<[email protected]/[email protected]>
 * @date 2014-3-25 11:01:41
 * @uses vengine game base object system class
 */
#ifndef VENGINE_GAME_OBJECT_BASESYSTEM_H_
#define VENGINE_GAME_OBJECT_BASESYSTEM_H_

#include "vengine/config.h"
#include "vengine/kernel/node.h"
#include "vengine/math/base.h"
#include "vengine/game/object/base.h"
#include "vengine/game/object/item.h"

namespace vengine_game {

namespace object {

class VENGINE_API BaseSystem : public vengine_kernel::Node {

VENGINE_KERNEL_DECLARE_DYNAMIC(vengine_game_object_BaseSystem);

 public:
   typedef enum {
     kDestroyMainTargetTypeObject, //銷燬的物件
     kDestroyMainTargetTypeMouseRightClick, //滑鼠右鍵銷燬
   } destroy_maintarget_type_enum;

 public:
   //產生新物體,並加入資料鏈
   virtual Base* create(const char* classname, 
                        int32_t id_fromserver, 
                        Base* parent = NULL) = 0;
   //銷燬物體,並從資料鏈上拆除
   virtual void destroy(Base* object) = 0;
   //跟據ID得到某物體
   virtual Base* find(int32_t id) = 0
            
           

相關推薦

MMORGP大型遊戲設計開發客戶架構 part16 of vegine

由於近來比較忙碌和有些睏倦的原因,所以關於這部分的文章沒有及時更新,一句話:讓朋友們久等了!今天所講的是客戶端vengine(微引擎)中最後一個部分,就像上節所說,這一部分的內容比較多。可能有些朋友看了程式碼以及註釋後,仍有不少疑惑的地方,歡迎評論留言相互討論,如

MMORPG大型遊戲設計開發構架

遊戲整體是以經典的武俠世界/天龍八部作為基本的一種設計模式,大致分為以下幾個部分。  遊戲的簡單的一次處理流程如下,不過有些凌亂,還有待完善。  程式設計方面,伺服器基本上分為資料處理、日誌、網路等模組,客戶端分為UI、場景、動作等模組。客戶端選擇的開源引擎OGRE+CEGUI。

【棋牌遊戲】JAVA伺服器設計開發

####開篇語 大概在16年時候,新型房卡模式開啟棋牌遊戲新里程,整個棋牌行業迅速改變模式,出現近兩三年激烈的競爭景象,據統計全國大大小小棋牌遊戲公司,專職棋牌公司近兩萬多家,這都不算後起大大小小遊戲公司加緊棋牌研發行列。新型棋牌模式有一個很明顯的特點,那就是地

Python全棧開發之路 【第八篇】:面向對象編程設計開發2

ssi pen 解析 執行 示例 動態 類型 put 所有 一、繼承與派生 什麽是繼承? 繼承指的是類與類之間的關系,是一種什麽是什麽的關系,繼承的功能之一就是用來解決代碼重用問題。 繼承是一種創建新的類的方式,在python中,新建的類可以繼承一個或多個父類,父類又可以成

(改)ArcEngine10.2設計開發作業一——還有啥是axMapControl?maps?Layers?

第一個作業做得不好,加上時間匆忙自己也沒有怎麼理清楚箇中關係,所以今天抽空整理了一下,畢竟是基礎,這對之後的學習也是必要的。 目錄: 1,地圖控制元件,axMapControl1 2,地圖(地圖)和圖層(層) 3,修改 1,地圖控制元件,axMapC

分散式設計開發------幾種必須瞭解的分散式演算法

分散式設計與開發中有些疑難問題必須藉助一些演算法才能解決,比如分散式環境一致性問題,感覺以下分散式演算法是必須瞭解的(隨著學習深入有待新增): Paxos演算法 一致性Hash演算法 Paxos演算法 1)問題描述 分散式中有這麼一個疑難問題,客戶端向一個分散式叢集的服務

分散式設計開發------巨集觀概述

在IDF05(Intel Developer Forum 2005)上,Intel執行長Craig Barrett就取消4GHz晶片計劃一事,半開玩笑當眾單膝下跪致歉,給廣大軟體開發者一個明顯的訊號,單純依靠垂直提升硬體效能來提高系統性能的時代已結束,分散式開發的時代實際上早

unity_小功能實現客戶相互通信功能

直接 endpoint 客戶端和服務器端 network hat sockets odi family void 服務器端:在VS中新建項目,用於服務器的搭建 using System;using System.Collections.Generic; using

C語言 Socket入門示例1—— 單工通訊客戶向伺服器傳送訊息

        如果對Windows API不太熟悉、對TCP/IP通訊協議不太熟悉,或者對C語言本身不太熟悉的話,學習Socket會有點難受的。以前學習作業系統的時候,被API嚇怕了,很多莫名其妙的API有著多如牛毛的引數,令人費解。學習計算機網路的時候,又有那麼多的協議

遊戲腳本的設計開發》-(RPG部分)3.8 通過腳本來自由控制遊戲(一)

pan tro prototype chan detail 大致 位置 trim dir 註意:本系列教程為長篇連載無底洞。半路殺進來的朋友,假設看不懂的話。請從第一章開始看起。文章文件夾請點擊以下鏈接。http://blog.csdn.net/lufy_legend/a

Redis 設計實現第十三章 -- 客戶

腳本 ons listening last then red logs 可能 reply 概述 對於每個與服務器連接的客戶端,服務器都為它創建相應的redisClient的數據結構,並保持了相應的狀態。Redis Server通過一個鏈表來保存所有的客戶端連接。 本章包括:

Linux核心設計實現1--核心開發的特點

1. 核心程式設計時既不能訪問C庫也不能訪問標準的C標頭檔案        其中的原因有很多種。其一,C標準庫的很多函式實現都是基於核心實現的,這核心編譯的時候都還沒有核心,所以就不存在這些函式,這個就是先有雞還是先有蛋這個悖論。其二,其主主要的的

ArcEngine10.2設計開發課程學習作業一——地圖、圖層載入及屬性訪問

先說一句,我是新手,剛註冊的CSDN,剛學的C#和engine,剛寫的文章。下面的程式碼質量肯定是經不住的,慢慢來,相信有很多和我一樣的未入門級的同胞,沒事的,都是這麼一竅不通過來的啦,我也是斷斷續續折騰了好幾天搞出來的。踩了賊多坑,也都是很**的坑,建議還是瞭解一下控制元件和類的功能實現原理等等,

ArcEngine10.2設計開發課程學習作業二——基本應用程式生成,右擊選單實現:顯示、移除和開啟屬性表功能

前言:這裡是我的筆記本 目錄: 準備工作——工具方法等 程式碼   首先說明一下第一個作業,這是第二個的連結:https://pan.baidu.com/s/1NziPHoMEJx0vc8DCNrX-dA提取碼:qpee 看的時候希望能夠靜下心來看,不要著急

Activiti的簡單配置開發通過Idea設計流程圖

原文地址:https://blog.csdn.net/c1225992531/article/details/81181017 使用idea進行activiti工作流開發 emmm.......因為工作需要,所以要學習activiti工作流,初次學習,寫個部落格記錄一下,下次再用就知道大概流程了

ArcEngine10.2設計開發課程學習作業四——實現地圖的簡單渲染和唯一值渲染

所有習題材料:連結:HTTPS://pan.baidu.com/s/1oiylGi6IEgndYO2j9_oQnQ  提取碼:jp3r  複製這段內容後開啟百度網盤手機應用程式,操作更方便哦 本題EXE:連結:HTTPS://pan.baidu.com/s/10_buC4K1

開發筆記】Unity聯網鬥地主的實現一,伺服器客戶的資料傳遞流程

話不多說,先上我李老師的思維導圖 大致構思了一個框架 1.首先要定義一下伺服器與客戶端的傳輸協議,必須保持一致 2.定義服務於客戶端傳輸的訊息型別,如(申請加入,同意加入,出牌,之類的) 3.定義一下牌的型別,出的牌的型別,在客戶端判斷是否可以出牌,牌型傳給伺服器,伺服器在完成三個玩家的出

四川職業技術學院輔導員工作管理資訊系統的設計開發--文獻隨筆十四

一、基本資訊 標題:四川職業技術學院輔導員工作管理資訊系統的設計與開發 時間:2013 出版源:電子科技大學 關鍵詞:輔導員; 學生管理; 面向物件; 統一建模語言; 二、研究背景 問題定義:面臨日益複雜繁縟的工作,僅靠傳統手工的輔導員管理顯然不能適應資訊科技發展給社會和高校發展帶來的積極效應,但是針對

完美世界GameJam參加報告——《解字》遊戲設計開發

前言 這次我們組成了7人團隊去參加完美世界組織的位於天河軟體園的GameJam。GameJam的規則是利用48小時開發一個遊戲,這次的遊戲主題是:烎 。我們的團隊由三個程式、三個美術、一個音樂組成(由於GameJam的特性,一般不會特化安排專職的策劃),來自中山大學和廣州美術學院。 本

【Android UI設計開發】第06期:底部選單欄使用TabActivity實現底部選單欄

轉載請註明出處:http://blog.csdn.net/yangyu20121224/article/details/8989063               從這一篇文章開始,我們將進入到一個應用程式主介面UI的開發和設計中了,底部選單欄在Android的應用開發當