【FOL】第三周
这周还是在改自己的这个框架,被多线程折腾了两天,最终无奈放弃在游戏启动时调用引擎进行图片相关资源的初始化,当然进展还是不错的。
嗯,下面还是以流水的方式继续记录一下本周完成的工作:
1、调通了客户端与lua的相互调用,用的是verysimple这个第三方库(跨平台的库)。这边遇到一个坑,特此记录。
我用的版本lua5.3,似乎官方已经取消了module函数,反正我在lua文件里面直接写“module(模块名,package.seeall)”,require这个lua文件的时候会报错。网上查了不少资料,据说module方法效率慢,而且极易污染全局空间,官方并不提倡使用。看来真有可能新版本把这个方法给丢弃了。反正我是没办法再去花时间找原因了(已经浪费了大半天时间,而且有个前辈劝我说不要用这个方法)。后来实现的代码如下,在此特别感谢 "广州-随云" 的无私帮助。
local module_notice = {}
function module_notice:open()
client.monitor:register(,module_notice.OnClose);
createScene("notice");
end
function module_notice:OnClose()
closeScene("notice");
client.monitor:unRegister(,module_notice.OnClose);
end
return module_notice
testLua('lua system running');
notice = require "script/module_notice";
notice:open();
2、关于资源的加载:本来的思路是游戏启动时载入一个base.data的资源包,显示一个载入界面(包含背景图、logo、进度条、默认字体等等),然后同时开个网络线程进行自动更新,自动更新完再开一个线程进行各种配置文件、声音文件、脚本文件、字体文件、图片资源文件的加载/初始化。但是前面几个操作在线程里面都没有问题,就是有两个地方无法做到:
1)lua文件,不能统一加载到一个列表中,否则lua文件中用require函数无法正常载入。
2)用pxl(asphyre)引擎进行图片资源的加载及初始化,在线程里面各种错误。首先,报“ECannotCreateWICImagingFactory”错误,加了"{$IFDEF MSWINDOWS}CoInitialize(nil);{$ENDIF}"代码后,不再报错了。然后在初始化图片时,偶尔会报浮点错误,这个搞了一天多愣是没解决,问了pxl的作者,他回复我在主线程初始化不会有错(ps:这个我知道的,作者自己的游戏就是启动的时候开了个窗口在初始化)。没办法了,后来整理了一下思路,最终决定在解析配置的时候进行初始化。具体实现看下面几段代码。
function TFOLScene.createButton(const pvParent: TFOLSprite; const pvName, pvRectSet, pvImageName: string; const pvMsgcode: Integer; const pvText: string): TFOLButton; var lvRect: TIntRect; lvImageAry: TButtonImageAry; begin lvRect:= parseRect(pvRectSet); gvArchiveManager.require(pvImageName, lvImageAry); result:= TFOLButton.Create(pvParent); result.ObjType:= tstUI_Button; result.Name:= pvName; result.X:= lvRect.Left; result.Y:= lvRect.Top; result.Width:= lvRect.Width; result.Height:= lvRect.Height; result.EventID:= pvMsgcode; result.Text:= pvText; result.setButtonImage(lvImageAry); FObjects.Add(pvName,result); end;
procedure TFOLArchiveManager.require(const pvName: string;
out pvOuter: TButtonImageAry);
var
lvEnum: TFOLButtonState;
lvSuffix, lvFullName: string;
begin
for lvEnum:= Low(TFOLButtonState) to High(TFOLButtonState) do
begin
pvOuter[lvEnum]:= nil;
lvSuffix:= gcButtonStateImageNameSuffix[lvEnum];
lvFullName:= pvName+lvSuffix;
pvOuter[lvEnum]:= loadImage(lvFullName, pvOuter[tbsNormal]);
end;
end;
function TFOLArchiveManager.loadImage(const pvName: string;
pvDefaultImage: TAtlasImage): TAtlasImage;
var
lvIndex: Integer;
lvStream: TStream;
begin
result:= FEngineImages.Image[pvName];
if not Assigned(result) then
begin
FGameImages.TryGetValue(pvName, lvStream);
if Assigned(lvStream) then
begin
lvIndex:= FEngineImages.AddFromStream('.png',lvStream,pvName);
result:= FEngineImages.Items[lvIndex];
end
else if Assigned(pvDefaultImage) then
result:= pvDefaultImage
else
result:= FEngineImages.Image['globa_error'];
end;
end;
3、实现了UI消息的转发,下面代码以按钮点击为例(代码比较粗糙,看看知道怎么回事就行)
{ TFOLButton }
procedure TFOLButton.render();
var
lvButtonState: TFOLButtonState;
lvHint: string;
begin
lvButtonState:= tbsNormal;
if PointInRect(Point2px(Trunc(gvEngineMouseData.X), Trunc(gvEngineMouseData.Y)),
IntRect(FWorldX, FWorldY,FWidth,FHeight)) then
begin
case gvEngineMouseData.State of
:
begin
lvButtonState:= tbsActive;
lvHint:= 'down:' + FName; //按钮图片切换到按下态,这里可以处理长按事件
end;
:
begin
lvButtonState:= tbsNormal;
gvEngineMouseData.State:= ;
gvGameMonitor.execMsgfunc(FEventID);
lvHint:= 'up:' + FName; //按钮图片切换回常态,这里可以触发点击事件并做相应处理
end;
:
begin
lvButtonState:= tbsHover;
lvHint:= 'move:' + FName; //图片切换到高亮态
end;
:
begin
lvButtonState:= tbsNormal;
lvHint:= 'wheel:' + FName; //一般根据WheelDelta处理一些缩放、列表滚动等事件
end;
end;
end;
gvEngineCanvas.UseImagePx(FButtonImageAry[lvButtonState], FloatRect4(, , FWidth, FHeight));
gvEngineCanvas.TexQuad(FloatRect4(FWorldX, FWorldY, FWidth, FHeight), IntColorWhite4, TBlendingEffect.Normal);
inherited;
end;
procedure TFOLButton.setButtonImage(pvImageAry: TButtonImageAry);
var
lvEnum: TFOLButtonState;
begin
for lvEnum:= Low(TFOLButtonState) to High(TFOLButtonState) do
FButtonImageAry[lvEnum]:= pvImageAry[lvEnum];
end;
monitor单元的相关代码:
procedure TFOLGameMonitor.execMsgfunc(const pvMsgCode: Integer);
var
lvInvokeEvent: TNotifyEvent;
lvData: TFOLInvokeScriptFuncObject;
begin
FEventListener.TryGetValue(, lvInvokeEvent);
if Assigned(lvInvokeEvent) then
begin
lvData:= TFOLInvokeScriptFuncObject.Create(gcExecLuaMsgFuncName);
lvData.pushInteger(pvMsgCode);
lvInvokeEvent(lvData);
end;
end;
小结:目前基本上就是实现如下:
1、游戏启动后,显示一个启动页面(背景、logo、进度条、进度文字)
2、连接到版本服务器自动下载最新的资源文件更新(线程中,通过信号量反馈下载进度)
3、加载配置文件、声音文件(线程中,通过信号量反馈载入进度)
4、资源载入完毕,运行app.lua,app.lua会调用客户端函数根据传入的ui名称,创建一个页面(现在是公告页面)。
5、点击公告页面上的关闭按钮,触发notice.lua中的关闭页面事件,调用客户端的关闭页面方法把此scene.visible设置为false,这样在渲染循环里面就不会去渲染这个页面,达到不显示的目的。
接下去应该是会考虑把主界面配置起来,同步完善一些ui控件。好吧,就这样吧。
【FOL】第三周的更多相关文章
- 【FOL】第九周
不知不觉又是三周过去了. 这几周忙了一下,其他时间全都在搞服务端,简直是酸爽的不行...不过还好出了些成果. 目前服务端有: 1.版本服务:游戏版本更新 2.账号服务:用户身份验证,返回各种连接(代理 ...
- 三周,用长轮询实现Chat并迁移到Azure测试
公司的OA从零开始进行开发,继简单的单点登陆.角色与权限.消息中间件之后,轮到在线即时通信的模块需要我独立去完成.这三周除了逛网店见爱*看动漫接兼职,基本上都花在这上面了.简单地说就是用MVC4基于长 ...
- Coursera系列-R Programming第三周-词法作用域
完成R Programming第三周 这周作业有点绕,更多地是通过一个缓存逆矩阵的案例,向我们示范[词法作用域 Lexical Scopping]的功效.但是作业里给出的函数有点绕口,花费了我们蛮多心 ...
- JAVA第三周作业(从键盘输入若干数求和)
JAVA第三周作业(从键盘输入若干数求和) 在新的一周,我学习了JAVA的IO编程.下面的代码实现了从键盘输入若干数求和的目标.import java.util.Scanner; public cla ...
- 20145213《Java程序设计》第三周学习总结
20145213<Java程序设计>第三周学习总结 教材学习内容总结 正所谓距离产生美,上周我还倾心于Java表面的基础语法.其简单的流程结构,屈指可数的基本类型分类,早已烂熟于心的运算符 ...
- 20145304 Java第三周学习报告
20145304 <Java程序设计>第三周学习总结 教材学习内容总结 1.定义类: 类定义时使用class关键词,建立实例要使用new关键词. 代码如下: /*定义类 书上例子 衣服的型 ...
- 20145330《Java程序设计》第三周学习总结
20145330 <Java程序设计>第三周学习总结 第三周知识的难度已经逐步上升,并且一周学习两章学习压力也逐渐加大,需要更高效率的来完成学习内容,合理安排时间. 类与对象 对象(Obj ...
- 20145337《Java程序设计》第三周学习总结
20145337 <Java程序设计>第三周学习总结 教材学习内容总结 类与对象 类与对象的关系:要产生对象必须先定义类,类是对象的设计图,对象是类的实例.我觉得在视频中对类与对象关系的描 ...
- Linux内核设计第三周——构造一个简单的Linux系统
Linux内核设计第三周 ——构造一个简单的Linux系统 一.知识点总结 计算机三个法宝: 存储程序计算机 函数调用堆栈 中断 操作系统两把宝剑: 中断上下文的切换 进程上下文的切换 linux内核 ...
- 20145218 《Java程序设计》第三周学习总结
20145218 <Java程序设计>第三周学习总结 教材学习内容总结 定义类 编写程序要产生对象就要先定义类.类是对象的设计图,对象是类的实例.类定义时使用class关键词,建立实例时, ...
随机推荐
- fir.im Weekly - iOS9 适配开发教程
期待已久的 iOS 9 发布了,很多人更新完毕得出结论:这是值得升级的版本.随之而来的是适应 iOS9 开发技术.本期 Weekly 收集了一些关于 iOS9 相关的开发资源,希望对你有帮助. iOS ...
- linux下配置mysql默认编码utf8
linux下配置mysql默认编码utf8 下面是需要在对应地方加入的配置 [client] default-character-set=utf8 [mysqld] character-set-ser ...
- Design2:数据层次结构建模之二
MSSql提供了一个新的数据类型 HierarchyID,用来处理层次结构的数据,这个数据类型是系统内置的CLR数据类型,不需要专门激活 SQL/CLR 功能即可使用.当需要表示各值之间的嵌套关系,并 ...
- URL中的特殊字符
原网址:http://pichcar.iteye.com/blog/676292 URL中的特殊字符 有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,那么就要使用他们的编码了.编 ...
- Cocos2d-x 3.2 学习笔记(四)学习打包Android平台APK!
从cocos2dx 3.2项目打包成apk安卓应用文件,搭建安卓环境的步骤有点繁琐,但搭建一次之后,以后就会非常快捷! (涉及到3.1.1版本的,请自动对应3.2版本,3.x版本的环境搭建都是一样的) ...
- MySQL数据库工具类之——DataTable批量加入MySQL数据库(Net版)
MySQL数据库工具类之——DataTable批量加入数据库(Net版),MySqlDbHelper通用类希望能对大家有用,代码如下: using MySql.Data.MySqlClient; us ...
- 原创:新手布局福音!微信小程序使用flex的一些基础样式属性
来源:新手布局福音!微信小程序使用flex的一些基础样式属性 作者:Nazi Flex布局相对于以前我们经常所用到的布局方式要好的很多,在做微信小程序的时候要既能符合微信小程序的文档开发要求,又能 ...
- Windows Azure Web Site (6) 使用FTP发布Azure Web Site
<Windows Azure Platform 系列文章目录> 笔者在之前的文章中介绍的都是使用IDE,也就是Visual Studio,将本地的aspx发布到Azure Web Site ...
- ASP.NET MVC必知必会知识点总结(二)
一.实现Controller的依赖注入: 1.自定义继承DefaultControllerFactory 类的控制器工厂类并重写GetControllerInstance方法:(如:InjectCon ...
- 理解SQL Server是如何执行查询的 (3/3)
页并发访问的保护:闩锁 在多线程并发情况下,需要防止读线程读到写线程正在写的资源,在编程中,通过使用互斥器(Mutexes), 信号量(Semaphore), 临界区(Critical Section ...