界面是游戲中必不可少的一部分,就算你進入游戲沒有看到什么UI窗口,你也不必着急,因為多多少少都會有隱藏着的界面等你去體驗。一個好的UI大部分應該歸功於設計的人與提供美術支持的人員,因為他們是直接設計UI的人,而程序只提供一些顯示的功能支持。本次用到的UI渲染為開源的CEGUI,想必很多做游戲的朋友都能耳熟能詳了吧。好了,就讓我們看看在本次設計中用到了那些與UI有光的方法吧。
CODE
模塊ui 文件creature_headboard.h --對象頭頂板UI
/** * PAP Engine ( -- ) * $Id system.h * @link -- for the canonical source repository * @copyright Copyright (c) 2013-2014 viticm( viticm@126.com ) * @license * @user viticm<viticm@126.com/viticm.ti@gmail.com> * @date 2014-3-21 12:05:53 * @uses vengine ui system module */ #ifndef VENGINE_UI_SYSTEM_H_ #define VENGINE_UI_SYSTEM_H_ #include "vengine/config.h" #include "vengine/game/itemtransfer_system.h" #include "vengine/ui/creature_headboard.h" namespace vengine_ui { typedef enum { kTalkTemplateNobody, kTalkTemplateOther, kTalkTemplateSelf, kTalkTemplateMax } talktemplate_enum; typedef enum { kFilterTypeNone, //無類型 kFilterTypeChat, //聊天 kFilterTypeRole, //角色創建 kFilterTypeName, //命名 kFilterTypeStall, //擺攤 kFilterTypeMax } filtertype_enum; typedef enum { kFilterLevelNoMatch, //忽略 kFilterLevelPartMatch, //部分匹配 kFilterLevelFullMatch, //完全匹配 kFilterLevelMax } filterlevel_enum; //static const uint16_t kHelpStringMax = 200; static const char* kHelpStringKey = "help"; //this if have problem //then change it to macros //interface for ui system class VENGINE_API System : public vengine_kernel::Node{ VENGINE_KERNEL_DECLARE_DYNAMIC(vengine_ui_System); public: virtual void on_windowsize_change(uint32_t message, WPARAM wparam, LPARAM lparam) = 0; //窗口大小改變事件 virtual void injectinput() = 0; //如果事件結果為true則獲取了輸入 virtual bool messageprocess(HWND hwnd, uint32_t message, WPARAM wparam, LPARAM lparam) = 0; //文字輸入消息 virtual bool is_mousehover() = 0; //鼠標是否在UI上空 //鼠標是否在聊天板上空 virtual bool is_mousehover_chatboard(int64_t x, int64_t y) = 0; //獲得聊天信息里的超鏈接信息 virtual STRING get_chatboard_hyplink_content(int64_t x, int64_t y) = 0; //創建一個新的角色信息板 virtual CreatureHeadBoard* create_creature_headboard() = 0; //添加一個新的被擊中信息框 virtual void add_behit_board(bool _double, const char* info, float startx, float starty, uint8_t type = 0, uint8_t movetype = 0) = 0; virtual bool is_windowshow(const char* name, const char* childname = NULL) = 0; virtual bool close_allwindow() = 0; //通知UI創建一組UI顯示模型 virtual void fakeobject_show(const char* windowname, const char* name) = 0; //知UI銷毀一組UI顯示模型 virtual void fakeobject_destroy(const char* windowname, const char* name) = 0; //debugs public: virtual void debug_push_chatstring(const char* name, const char* message) = 0; virtual void debug_save_fonttexture() = 0; public: virtual void change_dragflag(bool flag) = 0; virtual bool is_dragend() = 0; public: //邏輯層添加系統通知信息 virtual STRING parsestring_varparam(const char* id, ...) = 0; virtual void parsestring_nocolor(const STRING& in, STRING& out, bool control = false) = 0; virtual STRING parsestring_nocolor_varparam(const char* id, ...) = 0; virtual STRING parsestring_no_varparam(const char* id) = 0; virtual STRING parsestring_nocolor_no_varparam(const char* id) = 0; //聊天模板字串的取得 virtual STRING get_talktemplate(const STRING& key, uint16_t index) = 0; virtual STRING modify_chattemplate(const STRING& temp, const STRING& talker, const STRING& target) = 0; virtual STRING get_talkrand_helpmessage() = 0; //聊天隨機提示消息 //查看當前獲取輸入的EditBox virtual bool is_IME_editbox_active(const char* windowname) = 0; virtual int32_t get_current_IMEstate() = 0; //獲取當前輸入法狀態 virtual STRING get_IME_editbox_string(const char* name) = 0; //獲得輸入內容 //傳入一個物品信息 virtual bool inject_iteminfo( vengine_game::ItemTransferSystem::element_t* element) = 0; virtual void on_pushescape() = 0; virtual bool is_paopao_active() = 0; virtual uint32_t lumination_ogrecolor(uint32_t ogrecolor, int32_t lumination) = 0; virtual int32_t ogrecolor_lumination(uint32_t ogrecolor) = 0; //過濾字符串中的非法敏感字符 virtual bool check_stringfilter( const STRING& in, const filtertype_enum type = kFilterTypeNone) = 0; virtual bool check_stringcode(const STRING& in, STRING& out) = 0; //完全匹配過濾 virtual bool check_string_fullcompare(const STRING& in, const STRING& filtertype = "all", bool use_alltable = true) = 0; virtual STRING get_debugstring() = 0; //取當前的鼠標下面的窗口 virtual void openwindow(const STRING& name) = 0; virtual void closewindow(const STRING& name) = 0; virtual void togglewindow(const STRING& name) =0; virtual bool has_inputfocus() = 0; //加聊天信息(提高顯示聊天信息的效率) virtual bool add_chathistory_message(int32_t id, const char* windowname, const char* message, int32_t type = -1, uint32_t disappeartime = 0) = 0; virtual void replacestring_usefilter( const STRING& in, STRING& out, filtertype_enum filtertype = kFilterTypeChat) = 0; virtual STRING check_stringvalid(const char* string) = 0; virtual bool reload_windowscript(const STRING& windowname) = 0; virtual void uirender_toggleshow() = 0; }; }; //namespace vengine_ui #endif //VENGINE_UI_SYSTEM_H_
模塊ui 文件system.h
/** * PAP Engine ( -- ) * $Id system.h * @link -- for the canonical source repository * @copyright Copyright (c) 2013-2014 viticm( viticm@126.com ) * @license * @user viticm<viticm@126.com/viticm.ti@gmail.com> * @date 2014-3-21 12:05:53 * @uses vengine ui system module */ #ifndef VENGINE_UI_SYSTEM_H_ #define VENGINE_UI_SYSTEM_H_ #include "vengine/config.h" #include "vengine/game/itemtransfer_system.h" #include "vengine/ui/creature_headboard.h" namespace vengine_ui { typedef enum { kTalkTemplateNobody, kTalkTemplateOther, kTalkTemplateSelf, kTalkTemplateMax } talktemplate_enum; typedef enum { kFilterTypeNone, //無類型 kFilterTypeChat, //聊天 kFilterTypeRole, //角色創建 kFilterTypeName, //命名 kFilterTypeStall, //擺攤 kFilterTypeMax } filtertype_enum; typedef enum { kFilterLevelNoMatch, //忽略 kFilterLevelPartMatch, //部分匹配 kFilterLevelFullMatch, //完全匹配 kFilterLevelMax } filterlevel_enum; //static const uint16_t kHelpStringMax = 200; static const char* kHelpStringKey = "help"; //this if have problem //then change it to macros //interface for ui system class VENGINE_API System : public vengine_kernel::Node{ VENGINE_KERNEL_DECLARE_DYNAMIC(vengine_ui_System); public: virtual void on_windowsize_change(uint32_t message, WPARAM wparam, LPARAM lparam) = 0; //窗口大小改變事件 virtual void injectinput() = 0; //如果事件結果為true則獲取了輸入 virtual bool messageprocess(HWND hwnd, uint32_t message, WPARAM wparam, LPARAM lparam) = 0; //文字輸入消息 virtual bool is_mousehover() = 0; //鼠標是否在UI上空 //鼠標是否在聊天板上空 virtual bool is_mousehover_chatboard(int64_t x, int64_t y) = 0; //獲得聊天信息里的超鏈接信息 virtual STRING get_chatboard_hyplink_content(int64_t x, int64_t y) = 0; //創建一個新的角色信息板 virtual CreatureHeadBoard* create_creature_headboard() = 0; //添加一個新的被擊中信息框 virtual void add_behit_board(bool _double, const char* info, float startx, float starty, uint8_t type = 0, uint8_t movetype = 0) = 0; virtual bool is_windowshow(const char* name, const char* childname = NULL) = 0; virtual bool close_allwindow() = 0; //通知UI創建一組UI顯示模型 virtual void fakeobject_show(const char* windowname, const char* name) = 0; //知UI銷毀一組UI顯示模型 virtual void fakeobject_destroy(const char* windowname, const char* name) = 0; //debugs public: virtual void debug_push_chatstring(const char* name, const char* message) = 0; virtual void debug_save_fonttexture() = 0; public: virtual void change_dragflag(bool flag) = 0; virtual bool is_dragend() = 0; public: //邏輯層添加系統通知信息 virtual STRING parsestring_varparam(const char* id, ...) = 0; virtual void parsestring_nocolor(const STRING& in, STRING& out, bool control = false) = 0; virtual STRING parsestring_nocolor_varparam(const char* id, ...) = 0; virtual STRING parsestring_no_varparam(const char* id) = 0; virtual STRING parsestring_nocolor_no_varparam(const char* id) = 0; //聊天模板字串的取得 virtual STRING get_talktemplate(const STRING& key, uint16_t index) = 0; virtual STRING modify_chattemplate(const STRING& temp, const STRING& talker, const STRING& target) = 0; virtual STRING get_talkrand_helpmessage() = 0; //聊天隨機提示消息 //查看當前獲取輸入的EditBox virtual bool is_IME_editbox_active(const char* windowname) = 0; virtual int32_t get_current_IMEstate() = 0; //獲取當前輸入法狀態 virtual STRING get_IME_editbox_string(const char* name) = 0; //獲得輸入內容 //傳入一個物品信息 virtual bool inject_iteminfo( vengine_game::ItemTransferSystem::element_t* element) = 0; virtual void on_pushescape() = 0; virtual bool is_paopao_active() = 0; virtual uint32_t lumination_ogrecolor(uint32_t ogrecolor, int32_t lumination) = 0; virtual int32_t ogrecolor_lumination(uint32_t ogrecolor) = 0; //過濾字符串中的非法敏感字符 virtual bool check_stringfilter( const STRING& in, const filtertype_enum type = kFilterTypeNone) = 0; virtual bool check_stringcode(const STRING& in, STRING& out) = 0; //完全匹配過濾 virtual bool check_string_fullcompare(const STRING& in, const STRING& filtertype = "all", bool use_alltable = true) = 0; virtual STRING get_debugstring() = 0; //取當前的鼠標下面的窗口 virtual void openwindow(const STRING& name) = 0; virtual void closewindow(const STRING& name) = 0; virtual void togglewindow(const STRING& name) =0; virtual bool has_inputfocus() = 0; //加聊天信息(提高顯示聊天信息的效率) virtual bool add_chathistory_message(int32_t id, const char* windowname, const char* message, int32_t type = -1, uint32_t disappeartime = 0) = 0; virtual void replacestring_usefilter( const STRING& in, STRING& out, filtertype_enum filtertype = kFilterTypeChat) = 0; virtual STRING check_stringvalid(const char* string) = 0; virtual bool reload_windowscript(const STRING& windowname) = 0; virtual void uirender_toggleshow() = 0; }; }; //namespace vengine_ui #endif //VENGINE_UI_SYSTEM_H_
SIMPLE
天龍八部的UI
總結
因為是接口所以只提供了核心的管理方法,UI是個比較繁瑣的模塊,一般都是配合腳本一起使用,CEGUI自己就集成了腳本綁定,有了解的應該知道。在這里我不再多講UI的什么知識,希望大家看一下注釋的每條方法的用處。UI模塊有單獨的一個庫vgui(微gui)來控制,咱們到時候再詳細探討這里面的問題。下節講的是聲音模塊。