在游戏中的交互过程中输入是一个必不可少的过程,比如登陆的时候需要用户输入用户名与密码,就算是单机游戏很多时候也要求用户输入一个用户名作为存档的依据。网络游戏中没有了输入,只用鼠标来交互是不切实际的,因为用户总会为单一的操作而觉得厌烦。资源提供系统,是将游戏中各种的资源加载到内存中以供使用,比如说一张图片,一张数据表等等。在cegui和ogre中都自己封装了输入与资源管理的类,本次设计中自然是在它基础上扩展封装。那么,就让我们看看这两块提供了哪些方法吧。

CODE

模块resource 文件provider.h

/**
* PAP Engine ( -- )
* $Id provider.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-19 19:06:31
* @uses vegine resource provider module
*/
#ifndef VENGINE_RESOURCE_PROVIDER_H_
#define VENGINE_RESOURCE_PROVIDER_H_ #include "vengine/config.h"
#include "vengine/kernel/node.h" namespace vengine_resource { class VENGINE_API Provider : public vengine_kernel::Node { VENGINE_KERNEL_DECLARE_DYNAMIC(vengine_resource_Provider); public:
virtual uint64_t loadresource(const char* filename,
char*& memoryaddress,
const char* group = NULL) = ;
virtual bool unloadresource(char* memoryaddress, uint64_t size) = ; }; }; //namespace vengine_resource #endif //VENGINE_RESOURCE_PROVIDER_H_

模块input 文件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-19 17:23:32
* @uses vengine inpout system module
*/
#ifndef VENGINE_INPUT_SYSTEM_H_
#define VENGINE_INPUT_SYSTEM_H_ #include "vengine/config.h"
#include "vengine/kernel/node.h" namespace vengine_input { typedef enum { //for windows keycode
kKeyCode_ESCAPE =0x01,
kKeyCode_1 =0x02,
kKeyCode_2 =0x03,
kKeyCode_3 =0x04,
kKeyCode_4 =0x05,
kKeyCode_5 =0x06,
kKeyCode_6 =0x07,
kKeyCode_7 =0x08,
kKeyCode_8 =0x09,
kKeyCode_9 =0x0A,
kKeyCode_0 =0x0B,
kKeyCode_MINUS =0x0C, /* - on main keyboard */
kKeyCode_EQUALS =0x0D,
kKeyCode_BACK =0x0E, /* backspace */
kKeyCode_TAB =0x0F,
kKeyCode_Q =0x10,
kKeyCode_W =0x11,
kKeyCode_E =0x12,
kKeyCode_R =0x13,
kKeyCode_T =0x14,
kKeyCode_Y =0x15,
kKeyCode_U =0x16,
kKeyCode_I =0x17,
kKeyCode_O =0x18,
kKeyCode_P =0x19,
kKeyCode_LBRACKET =0x1A,
kKeyCode_RBRACKET =0x1B,
kKeyCode_RETURN =0x1C, /* Enter on main keyboard */
kKeyCode_LCONTROL =0x1D,
kKeyCode_A =0x1E,
kKeyCode_S =0x1F,
kKeyCode_D =0x20,
kKeyCode_F =0x21,
kKeyCode_G =0x22,
kKeyCode_H =0x23,
kKeyCode_J =0x24,
kKeyCode_K =0x25,
kKeyCode_L =0x26,
kKeyCode_SEMICOLON =0x27,
kKeyCode_APOSTROPHE =0x28,
kKeyCode_GRAVE =0x29, /* accent grave */
kKeyCode_LSHIFT =0x2A,
kKeyCode_BACKSLASH =0x2B,
kKeyCode_Z =0x2C,
kKeyCode_X =0x2D,
kKeyCode_C =0x2E,
kKeyCode_V =0x2F,
kKeyCode_B =0x30,
kKeyCode_N =0x31,
kKeyCode_M =0x32,
kKeyCode_COMMA =0x33,
kKeyCode_PERIOD =0x34, /* . on main keyboard */
kKeyCode_SLASH =0x35, /* '/' on main keyboard */
kKeyCode_RSHIFT =0x36,
kKeyCode_MULTIPLY =0x37, /* * on numeric keypad */
kKeyCode_LMENU =0x38, /* left Alt */
kKeyCode_SPACE =0x39,
kKeyCode_CAPITAL =0x3A,
kKeyCode_F1 =0x3B,
kKeyCode_F2 =0x3C,
kKeyCode_F3 =0x3D,
kKeyCode_F4 =0x3E,
kKeyCode_F5 =0x3F,
kKeyCode_F6 =0x40,
kKeyCode_F7 =0x41,
kKeyCode_F8 =0x42,
kKeyCode_F9 =0x43,
kKeyCode_F10 =0x44,
kKeyCode_NUMLOCK =0x45,
kKeyCode_SCROLL =0x46, /* Scroll Lock */
kKeyCode_NUMPAD7 =0x47,
kKeyCode_NUMPAD8 =0x48,
kKeyCode_NUMPAD9 =0x49,
kKeyCode_SUBTRACT =0x4A, /* - on numeric keypad */
kKeyCode_NUMPAD4 =0x4B,
kKeyCode_NUMPAD5 =0x4C,
kKeyCode_NUMPAD6 =0x4D,
kKeyCode_ADD =0x4E, /* + on numeric keypad */
kKeyCode_NUMPAD1 =0x4F,
kKeyCode_NUMPAD2 =0x50,
kKeyCode_NUMPAD3 =0x51,
kKeyCode_NUMPAD0 =0x52,
kKeyCode_DECIMAL =0x53, /* . on numeric keypad */
kKeyCode_OEM_102 =0x56, /* < > | on UK/Germany keyboards */
kKeyCode_F11 =0x57,
kKeyCode_F12 =0x58,
kKeyCode_F13 =0x64, /* (NEC PC98) */
kKeyCode_F14 =0x65, /* (NEC PC98) */
kKeyCode_F15 =0x66, /* (NEC PC98) */
kKeyCode_KANA =0x70, /* (Japanese keyboard) */
kKeyCode_ABNT_C1 =0x73, /* / ? on Portugese (Brazilian) keyboards */
kKeyCode_CONVERT =0x79, /* (Japanese keyboard) */
kKeyCode_NOCONVERT =0x7B, /* (Japanese keyboard) */
kKeyCode_YEN =0x7D, /* (Japanese keyboard) */
kKeyCode_ABNT_C2 =0x7E, /* Numpad . on Portugese (Brazilian) keyboards */
kKeyCode_NUMPADEQUALS =0x8D, /* = on numeric keypad (NEC PC98) */
kKeyCode_PREVTRACK =0x90, /* Previous Track ( kKeyCode_CIRCUMFLEX on Japanese keyboard) */
kKeyCode_AT =0x91, /* (NEC PC98) */
kKeyCode_COLON =0x92, /* (NEC PC98) */
kKeyCode_UNDERLINE =0x93, /* (NEC PC98) */
kKeyCode_KANJI =0x94, /* (Japanese keyboard) */
kKeyCode_STOP =0x95, /* (NEC PC98) */
kKeyCode_AX =0x96, /* (Japan AX) */
kKeyCode_UNLABELED =0x97, /* (J3100) */
kKeyCode_NEXTTRACK =0x99, /* Next Track */
kKeyCode_NUMPADENTER =0x9C, /* Enter on numeric keypad */
kKeyCode_RCONTROL =0x9D,
kKeyCode_MUTE =0xA0, /* Mute */
kKeyCode_CALCULATOR =0xA1, /* Calculator */
kKeyCode_PLAYPAUSE =0xA2, /* Play / Pause */
kKeyCode_MEDIASTOP =0xA4, /* Media Stop */
kKeyCode_VOLUMEDOWN =0xAE, /* Volume - */
kKeyCode_VOLUMEUP =0xB0, /* Volume + */
kKeyCode_WEBHOME =0xB2, /* Web home */
kKeyCode_NUMPADCOMMA =0xB3, /* , on numeric keypad (NEC PC98) */
kKeyCode_DIVIDE =0xB5, /* / on numeric keypad */
kKeyCode_SYSRQ =0xB7,
kKeyCode_RMENU =0xB8, /* right Alt */
kKeyCode_PAUSE =0xC5, /* Pause */
kKeyCode_HOME =0xC7, /* Home on arrow keypad */
kKeyCode_UP =0xC8, /* UpArrow on arrow keypad */
kKeyCode_PGUP =0xC9, /* PgUp on arrow keypad */
kKeyCode_LEFT =0xCB, /* LeftArrow on arrow keypad */
kKeyCode_RIGHT =0xCD, /* RightArrow on arrow keypad */
kKeyCode_END =0xCF, /* End on arrow keypad */
kKeyCode_DOWN =0xD0, /* DownArrow on arrow keypad */
kKeyCode_PGDOWN =0xD1, /* PgDn on arrow keypad */
kKeyCode_INSERT =0xD2, /* Insert on arrow keypad */
kKeyCode_DELETE =0xD3, /* Delete on arrow keypad */
kKeyCode_LWIN =0xDB, /* Left Windows key */
kKeyCode_RWIN =0xDC, /* Right Windows key */
kKeyCode_APPS =0xDD, /* AppMenu key */
kKeyCode_POWER =0xDE, /* System Power */
kKeyCode_SLEEP =0xDF, /* System Sleep */
kKeyCode_WAKE =0xE3, /* System Wake */
kKeyCode_WEBSEARCH =0xE5, /* Web Search */
kKeyCode_WEBFAVORITES =0xE6, /* Web Favorites */
kKeyCode_WEBREFRESH =0xE7, /* Web Refresh */
kKeyCode_WEBSTOP =0xE8, /* Web Stop */
kKeyCode_WEBFORWARD =0xE9, /* Web Forward */
kKeyCode_WEBBACK =0xEA, /* Web Back */
kKeyCode_MYCOMPUTER =0xEB, /* My Computer */
kKeyCode_MAIL =0xEC, /* Mail */
kKeyCode_MEDIASELECT =0xED /* Media Select */
} keycode_enum; // 鼠标状态定义
const int32_t kMouse_LBCLICK = 0x1; // 00000000 00000001
const int32_t kMouse_LBCLICKED = 0x2; // 00000000 00000010
const int32_t kMouse_LBDOWN = 0x4; // 00000000 00000100
const int32_t kMouse_MBCLICK = 0x8; // 00000000 00001000
const int32_t kMouse_MBCLICKED = 0x10; // 00000000 00010000
const int32_t kMouse_MBDOWN = 0x20; // 00000000 00100000
const int32_t kMouse_RBCLICK = 0x40; // 00000000 01000000
const int32_t kMouse_RBCLICKED = 0x80; // 00000000 10000000
const int32_t kMouse_RBDOWN = 0x100; // 00000001 00000000
const int32_t kMouse_LBDBLCLK = 0x200; // 00000010 00000000
const int32_t kMouse_MBDBLCLK = 0x400; // 00000100 00000000
const int32_t kMouse_RBDBLCLK = 0x800; // 00001000 00000000
const int32_t kMouse_WHEELUP = 0x1000; // 00010000 00000000
const int32_t kMouse_WHEELDOWN = 0x2000; // 00100000 00000000 //外部输入事件定义
typedef enum {
kEventId_KEY_DOWN,
kEventId_KEY_UP,
kEventId_MOUSE_MOVE,
kEventId_MOUSE_LDRAG_MOVE,
kEventId_MOUSE_RDRAG_MOVE,
kEventId_MOUSE_LBDOWN,
kEventId_MOUSE_LBUP,
kEventId_MOUSE_LBCLICK,
kEventId_MOUSE_RBDOWN,
kEventId_MOUSE_RBUP,
kEventId_MOUSE_RBCLICK,
kEventId_MOUSE_MBDOWN,
kEventId_MOUSE_MBUP,
kEventId_MOUSE_MBCLICK,
kEventId_MOUSE_LDBCLICK,
kEventId_MOUSE_MDBCLICK,
kEventId_MOUSE_RDBCLICK,
kEventId_MOUSE_WHEEL_UP,
kEventId_MOUSE_WHEEL_DOWN,
kEventId_MOUSE_LBDOWNREPEAT,
} eventid_enum; typedef struct {
eventid_enum id;
//键盘事件的键盘编号,如果是鼠标事件,此值无效
keycode_enum keyindex;
//是否已被处理
bool processed;
} event_t; typedef std::vector<event_t> eventqueue; typedef enum {
kCaptureStatusNone, //没有被捕获
kCaptureStatusUI, //被UI捕获
kCaptureStatusGame, //被Game捕获
} capturestatus_enum; class VENGINE_API System : public vengine_kernel::Node { VENGINE_KERNEL_DECLARE_DYNAMIC(vengine_input_System); public:
//获得传输的队列
virtual eventqueue& get_eventqueue() = ;
//查询队列中是否有某事件存在
virtual bool is_eventexist(eventid_enum id) = ;
//捕获状态
virtual capturestatus_enum getcapture() const = ;
virtual void setcapture(capturestatus_enum type) = ;
//处理windows消息
virtual bool messageprocess(HWND hwnd,
uint32_t message,
WPARAM wparam,
LPARAM lparam) = ; public:
//某个键是否被按下
virtual bool is_keydown(keycode_enum key) = ;
//某个键是否刚被按下
virtual bool is_keypress(keycode_enum key) = ;
//某个键是否刚被抬起
virtual bool is_keypressed(keycode_enum key) = ;
//判断某个系统键是否按下
virtual bool is_ctrldown() = ;
virtual bool is_shiftdown() = ;
virtual bool is_altdown() = ; public:
//设置鼠标
virtual void set_mouseposition(int32_t x, int32_t y) = ;
virtual POINT get_mousepostion() = ;
virtual POINT get_mouse_oldpostion() = ;
virtual RECT get_mouse_LB_dragrect() = ;
virtual RECT get_mouse_MB_dragrect() = ;
virtual RECT get_mouse_RB_dragrect() = ;
virtual uint32_t get_mouseflag() = ;
virtual uint32_t get_mouse_oldflag() = ;
virtual uint32_t get_L_putdown_time() = ; }; }; //namespace vengine_input #endif //VENGINE_INPUT_SYSTEM_H_

SIMPLE

剑侠情缘3 输入角色名

天龙八部资源配置

总结

客户端由于是基于windows开发的,所以依赖了许多与之相关的API,如果有疑惑可以提出或查询msdn资料手册。在这里由于时间关系,也不多详细讲解了,这一部分大家只要了解一下两个模块提供的方法就行。比如资源模块的只有两个API:加载与释放,而输入模块有捕获以及按键的状态。下节讲的是db模块,前端比较重要的文件数据处理,希望大家不要错过这节,因为配置的数据都是由此模块提供。

MMORPG大型游戏设计与开发(客户端架构 part12 of vegine)的更多相关文章

  1. MMORPG大型游戏设计与开发(客户端架构 part8 of vegine)

    脚本模块是游戏设计中争论比较多的话题,那是因为作为脚本本身所带来的利弊.其实这都无关紧要,取舍是人必须学会的一项技能,如果你不会取舍那么就让趋势给你一个满意的答复.自从魔兽世界以及传奇(世界)问世以来 ...

  2. MMORPG大型游戏设计与开发(概述)updated

    1.定义 MMORPG,是英文Massive(或Massively)Multiplayer Online Role-PlayingGame的缩写,即大型多人在线角色扮演游戏. 2.技术与知识 在这系列 ...

  3. MMORPG大型游戏设计与开发(UI SYSTEM SHOW)

    接下来一段时间,这些文件可能不再更新,期间我会学习和掌握一些前端知识.虽然我非常欣赏剑侠网络版叁和九阴真经的画面,但是那是一个庞大的游戏引擎,一般人是无法窥伺的,除非你是天才而且要拥有机器毫无中断的毅 ...

  4. MMORPG大型游戏设计与开发(服务器 游戏场景 核心详述)

    核心这个词来的是多么的高深,可能我们也因为这个字眼望而却步,也就很难去掌握这部分的知识.之所以将核心放在最前面讲解,也可以看出它真的很重要,希望朋友们不会错过这个一直以来让大家不熟悉的知识,同我一起进 ...

  5. MMORPG大型游戏设计与开发(游戏服务器 游戏场景 概述 updated)

    我们在玩游戏的时候,我们进入游戏后第一眼往往都是看到游戏世界中的场景,当然除了个别例外,因为那些游戏将游戏场景隐藏了起来,如文字游戏中的地点一样.既然我们接触了游戏世界的核心,那么作为核心的场景又包括 ...

  6. MMORPG大型游戏设计与开发(客户端架构 part2 of vgui)

    这一节我将讲解vgui的基础系统部分,也是该库提供给外部使用的一些重要接口.作为UI部分比较重要的部分,该节有着至关重要的部分,如果没有看到上一节内容,请留意下面的连接.我们现在可以猜想一下在客户端U ...

  7. MMORPG大型游戏设计与开发(客户端架构 part16 of vegine)

    由于近来比较忙碌和有些困倦的原因,所以关于这部分的文章没有及时更新,一句话:让朋友们久等了!今天所讲的是客户端vengine(微引擎)中最后一个部分,就像上节所说,这一部分的内容比较多.可能有些朋友看 ...

  8. MMORPG大型游戏设计与开发(客户端架构 part9 of vegine)

    时间在人们的生活中是多么重要的东西,如果打乱了时间,不知道这个时间会成什么样子.在客户端中,自然也有时间模块,因为不同的时间可能会处理不同的事情,特别是在追求高度自由化的同时,时间也成为了一个很重要的 ...

  9. MMORPG大型游戏设计与开发(客户端架构)

    首先为所有等待的朋友说一声歉意,实在让大家等的太久.客户端的设计本来就是一个大的工程,而且工作的关系,也没有太多时间在这方面做研究.不过在私下有空的时间,我还是继续着这方面的研究,很遗憾没有用期望的o ...

随机推荐

  1. 6to5 – 让你即刻体验 ECMAScript 6 编程

    ECMAScript 6 是下一代的 ECMAScript 标准.ECMAScript 6 的目标是让 JavaScript 可以用来编写复杂的应用程序.函数库和代码的自动生成器. ES6 是这门语言 ...

  2. Html技巧 语义化你的代码

    首先是关于语义(Semantics)和默认样式的区别,默认样式是浏览器设定的一些常用tag的表现形式,语义化的主要目的就是让大家直观的认识标签(markup)和属性(attribute)的用途和作用. ...

  3. Sharepoint学习笔记—习题系列--70-576习题解析 -(Q21-Q24)

    Question 21 An application will be deployed in a SharePoint 2010 server farm that is managed by depa ...

  4. CAGradientLayer渐变效果

    属性 startPoint和endPoint 决定渐变方向,以单位坐标系定义.左上角{0,0},右下角{1,1} colors 渐变的颜色,是一个CGColorRef的数组. locations 定义 ...

  5. Double 数据保留两位小数一:五舍六入

    package com; public class T2 { public static void main(String[] args) { System.out.println(calculate ...

  6. 自定义圆形控件 RoundImageView

    1.自定义圆形控件 RoundImageView package com.ronye.CustomView; import android.content.Context; import androi ...

  7. 【代码笔记】iOS-点击顶点处,弹出另一个小的界面

    一,效果图. 二,文件目录. 三,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewControlle ...

  8. 【Android】友盟的自动更新组件

    前言 又好又专业的服务能帮开发者省很多时间.一开始做项目也准备自己来统计数据.自己做自动更新,随着使用友盟服务的时间增加,渐渐放弃了这种想法,转而研究如何更充分的使用,这里分享一下使用自动更新组件的心 ...

  9. Play Framework 第一个应用

    熟悉的Hello World 新创建一个工程,了解下重要文件的结构 .\app controllers\models\views 目前比较流行的MVC架构 .\conf application.con ...

  10. EMC Documentum DQL整理(二)

    1.Get file extension SELECT dos_extension FROM dm_format WHERE name IN (SELECT a_content_type FROM d ...