设为首页 加入收藏

TOP

【FOL】第三周(一)
2017-10-10 12:06:05 】 浏览:7383
Tags:FOL 第三

这周还是在改自己的这个框架,被多线程折腾了两天,最终无奈放弃在游戏启动时调用引擎进行图片相关资源的初始化,当然进展还是不错的。

嗯,下面还是以流水的方式继续记录一下本周完成的工作:

1、调通了客户端与lua的相互调用,用的是verysimple这个第三方库(跨平台的库)。这边遇到一个坑,特此记录。

    我用的版本lua5.3,似乎官方已经取消了module函数,反正我在lua文件里面直接写“module(模块名,package.seeall)”,require这个lua文件的时候会报错。网上查了不少资料,据说module方法效率慢,而且极易污染全局空间,官方并不提倡使用。看来真有可能新版本把这个方法给丢弃了。反正我是没办法再去花时间找原因了(已经浪费了大半天时间,而且有个前辈劝我说不要用这个方法)。后来实现的代码如下,在此特别感谢 "广州-随云" 的无私帮助。

local module_notice = {}

function module_notice:open()
    client.monitor:register(1100,module_notice.OnClose);
    createScene("notice");
end

function module_notice:OnClose()
    closeScene("notice");
    client.monitor:unRegister(1100,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;
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇【转】编译Lua5.3.0的iOS静态库 下一篇Delphi IDHTTP控件:GET/POST 请求

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目