-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathse.game.script.package.ui.pas
196 lines (174 loc) · 5.31 KB
/
se.game.script.package.ui.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
{******************************************************************************}
{ }
{ SE Network Development Framework }
{ }
{ Copyright (c) 2018 looper(2031056602@qq.com) }
{ }
{ Source: https://github.com/looper/se-framework }
{ Homepage: http://www.asphyre.cn }
{ }
{******************************************************************************}
unit se.game.script.package.ui;
interface
uses
System.Classes, System.SysUtils, FMX.Forms, FMX.Controls,
VerySimple.Lua, VerySimple.Lua.Lib,
se.game.types, se.game.script.package, se.game.window, se.game.sprite, se.game.scene;
type
TUIPackage = class(TScriptPackage)
private
FWindowFactory: TWindowFactory;
FSpriteManager: TSpriteManager;
FSceneManager : TSceneManager;
private
/// <summary>
/// 注册指定精灵的点击事件
/// </summary>
procedure RegisterSpriteClickEvent(const ASpriteName: string;
const AMsgcode: Integer);
/// <summary>
/// 精灵点击事件
/// </summary>
procedure DoSpriteClick(Sender: TObject);
/// <summary>
/// FMX控件点击事件
/// </summary>
procedure DoControlClick(Sender: TObject);
public
constructor Create; override;
destructor Destroy; override;
procedure RegFunctions; override;
/// <summary>
/// 注册一个窗口实例到WindowFactory
/// </summary>
function RegWindow(const AName: string; AWindow: TWindow): Boolean; overload;
/// <summary>
/// 注册一个窗口实例到WindowFactory(通过窗口配置文件)
/// </summary>
function RegWindow(const AFileName: string): Boolean; overload;
/// <summary>
/// 窗口管理器
/// </summary>
property WindowFactory: TWindowFactory read FWindowFactory write FWindowFactory;
/// <summary>
/// 精灵管理器
/// </summary>
property SpriteManager: TSpriteManager read FSpriteManager write FSpriteManager;
/// <summary>
/// 场景管理器
/// </summary>
property SceneManager: TSceneManager read FSceneManager write FSceneManager;
published
/// <summary>
/// 注册窗口中指定控件的点击事件
/// </summary>
function registerClickEvent(L: lua_State): Integer;
/// <summary>
/// 显示窗口
/// </summary>
function showWindow(L: lua_State): Integer;
/// <summary>
/// 关闭窗口
/// </summary>
function closeWindow(L: lua_State): Integer;
/// <summary>
/// 切换场景
/// </summary>
function switchScene(L: lua_State): Integer;
end;
implementation
{ TUIPackage }
constructor TUIPackage.Create;
begin
inherited;
end;
destructor TUIPackage.Destroy;
begin
inherited;
end;
procedure TUIPackage.DoControlClick(Sender: TObject);
begin
if Sender is TControl then
Self.InvokeLuaMethod('execClick', TControl(Sender).Tag);
end;
procedure TUIPackage.DoSpriteClick(Sender: TObject);
begin
if Sender is TCustomSprite then
Self.InvokeLuaMethod('execClick', TCustomSprite(Sender).Tag);
end;
procedure TUIPackage.RegFunctions;
begin
inherited;
RegFunction('registerClickEvent','registerClickEvent');
RegFunction('showWindow','showWindow');
RegFunction('closeWindow','closeWindow');
RegFunction('switchScene','switchScene');
end;
function TUIPackage.RegWindow(const AName: string; AWindow: TWindow): Boolean;
begin
AWindow.Parent:= FWindowFactory.OwnerForm;
AWindow.OnControlClick:= DoControlClick;
Result:= FWindowFactory.RegWindow(AName, AWindow);
end;
function TUIPackage.RegWindow(const AFileName: string): Boolean;
var
LWindow: TWindow;
begin
LWindow:= TWindow.Create(nil, AFileName);
Result:= Self.RegWindow(LWindow.Name, LWindow);
end;
procedure TUIPackage.RegisterSpriteClickEvent(const ASpriteName: string;
const AMsgcode: Integer);
var
LSprite: TCustomSprite;
begin
LSprite:= FSpriteManager.Sprite[ASpriteName];
if Assigned(LSprite) then
begin
LSprite.Tag:= AMsgcode;
LSprite.OnClick:= DoSpriteClick;
end;
end;
function TUIPackage.registerClickEvent(L: lua_State): Integer;
var
LFormName, LControlName: string;
LMsgcode: Integer;
begin
LFormName:= lua_tostring(L, 2);
LControlName:= lua_tostring(L, 3);
LMsgcode:= lua_tointeger(L, 4);
//
if Assigned(FWindowFactory.OwnerForm) and
Assigned(FSpriteManager) and
LFormName.Equals(FWindowFactory.OwnerForm.Name) then
RegisterSpriteClickEvent(LControlName, LMsgcode)
else
FWindowFactory.RegisterClickEvent(LFormName, LControlName, LMsgcode);
//
Result:= 0;
end;
function TUIPackage.showWindow(L: lua_State): Integer;
var
LFormName: string;
begin
LFormName:= lua_tostring(L, 2);
FWindowFactory.Show(LFormName);
Result:= 0;
end;
function TUIPackage.closeWindow(L: lua_State): Integer;
var
LFormName: string;
begin
LFormName:= lua_tostring(L, 2);
FWindowFactory.Close(LFormName);
Result:= 0;
end;
function TUIPackage.switchScene(L: lua_State): Integer;
var
LSceneName: string;
begin
LSceneName:= lua_tostring(L, 2);
FSceneManager.Switch(LSceneName);
Result:= 0;
end;
end.