2014年8月13日星期三

MMORGP大型游戏设计与开发(客户端架构 part10 of vegine) - 恋月

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
MMORGP大型游戏设计与开发(客户端架构 part10 of vegine) - 恋月  阅读原文»

界面是游戏中必不可少的一部分,就算你进入游戏没有看到什么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 手把手教你做关键词匹配项目(搜索引擎)---- 第十天 - oShine.Q  阅读原文»

第十天

起点:

1. 手把手教你做关键词匹配项目(搜索引擎)---- 第一天

回顾:

9. 手把手教你做关键词匹配项目(搜索引擎)---- 第九天

小帅帅收到记录Log的任务后,就安心去研究去了。。。

其实按照于老大的水平来说,看惯了开源框架,写个普通的Logger是轻而易举,他为什么要小帅帅去做呢?

小帅帅当时其实也想不通,因为他没有经历过那个阶段。

小帅帅的想法其实也挺简单,就是完成于老大给的任务,成为可以胜任这项工作的好员工。

小帅帅这个阶段对需求不敏感,所以一接到任务他就去研究技术细节去了。 殊不知代码已经写好了。

小帅帅的初稿,就是尝试用面向对象的思维能力去写这个记录Log的任务, 初稿如下:

class Logger {

public static function log($message){
$file = fopen('application.error.log', "a+");
fwrite($file, $message);
fclose($file);
}
}

那么TopClient的代码如下:

class TopClient {
......

protected function logCommunicationError($apiName, $requestUrl, $errorCode, $responseTxt)
{
$localIp = isset($_SERVER["SERVER_ADDR"]) ? $_SERVER["SERVER_ADDR"] : "CLI";

$logData = "API_NAME:$apiName,APP_KEY:$this->appkey,CLIENT_IP:$localIp,SDK_VERSION:$this->sdkVersion,REQUEST_URL:$requestUrl,ERROR_CODE:$errorCode,ERROR_MSG:".str_replace("\n","",$responseTxt);

Logger
::log($logData);
}
......
}

其实这是一个进步,小帅帅终于在慢慢转变自己的思维能力。

当小帅帅拿着这份代码找到于老大时,于老大很高心,但是不是他想要的成果,于是于老大就对小帅帅说:

1. 如果你要记录错误log,你期望怎么去用,期望看到哪些信息。

2. 如果你要记录警告log, 你期望怎么去用,期望看到哪些信息。

3. 如果你要调试,想看看代码的执行效率,你期望怎么去用,期望看到哪些信息。

三个为什么把小帅帅给压倒了,小帅帅一听,有点气闯不过来。

就这样小帅帅就去思索于老大说的话。

小帅帅有幸能听懂其中的含义的时候,所学的心法就更加强大,我们期待小帅帅能够开窍。


本文链接:手把手教你做关键词匹配项目(搜索引擎)---- 第十天,转载请注明。

阅读更多内容

没有评论:

发表评论