Module: RunaGame — RunaGame

Module: RunaGame

Extended by:
Delegation
Defined in:
state.rb,
rpc.rb,
wait.rb,
cache.rb,
audio.rb,
event.rb,
Image.rb,
Helper.rb,
module.rb,
sprite.rb,
kboard.rb,
Controls.rb,
RunaGame.rb,
animation.rb,
transition.rb,
rpg/interpreter.rb

Overview

RunaGame游戏库是Runa引擎的脚本运行库,为后续的脚本和游戏开发提供的一个框架

游戏引擎处理的对象是具体的底层资源,例如:纹理、声音、脚本

而游戏开发者想要编辑的是游戏的对象,例如:角色,地图,剧情,事件

RunaGame就是把这两种对象对接起来的中间层。

RunaGame 的主要结构

  • 糖(Helper interface)

简单地封装常用的引擎底层功能,让它们更加便于访问。这一部分主要在Helper.rb

  • 核心对象封装

对引擎的底层对象(如纹理)进行一个封装,使.Net与Ruby对象分开(解耦)。把与.Net对象的互操作尽量限制在这些核心对象里,便于处理兼容性。lib主目录下的脚本处理这一部分内容

  • 游戏MVC框架

一个类MVC的框架,用来管理各类游戏数据。

RunaGame MVC 简介

游戏的对象和Web应用的对象一样,需要进行以下处理:

  • 需要(在数据库中)保存不变的数据和运行数据,以便以后载入(Model)

  • 需要保存运行中的状态(Controller)

  • 需要显示出来(View)

因此,需要一种框架来规划这些行为。RunaGame MVC就是这样的框架,它主要包括三个部分:

RunaDB : 数据模型层 Model

  • 定义了游戏的数据格式,序列化和反序列化(保存和载入)。提供了一系列对象与游戏数据对应 (kind of DRM)。

  • Model层的对象不会改变,需要保存成文件。

  • 源码前缀为db_*

RunaGame : 控制器 Controller

  • 核心对象封装、游戏对象的定义和功能实现

  • Controller层的对象会改变,需要保存成文件。

  • 源码无前缀

Sprite_* : 表示层 View

  • 基于RunaGame::Sprite的一系列对象,用来显示游戏对象

  • View层的对象会改变,不能保存

  • 源码前缀为sprite_*

命名规范:

.Net objects and methods: Game, FindControl, List

ruby objects and methods: objekt, Klass, method, long_method, CONSTANT

权利声明

author: viktor (xulai1001@sina.cn)


RunaGame Runa引擎游戏脚本库 Authors: 罗曼(viktor, xulai1001@sina.cn) 基于LonghornShen的Runa引擎和群青Alo的Runa脚本开发

采用 知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆 许可协议进行许可。 creativecommons.org/licenses/by-nc-sa/3.0/cn/#


Defined Under Namespace

Modules: Audio, Cache, Delegation, EventHandler, Hashy, KBoard, Lift, Page, Positioning, RPC, State, TileAnimation, Transition Classes: EventContext, Image, Image_TileAnim, ListBox, Sprite, Sprite_TileAnim, TextBox, TextList, Video

Class Attribute Summary <small>(collapse)</small>

Instance Attribute Summary <small>(collapse)</small>

Class Method Summary <small>(collapse)</small>

Methods included from Delegation

delegate

Class Attribute Details

 

+ (<tt>Object</tt>) CurrentPage

当前页面 注意:该变量在Page.OnNavigatedTo方法中才设置

在此之后才能使用
78
79
80
# File 'Helper.rb', line 78

def CurrentPage
  @CurrentPage
end
 

+ (<tt>Object</tt>) map

当前地图

81
82
83
# File 'Helper.rb', line 81

def map
  @map
end
 

+ (<tt>Object</tt>) path

当前游戏主目录 游戏运行时的工作目录为Runa目录,与这个不同

73
74
75
# File 'Helper.rb', line 73

def path
  @path
end

Instance Attribute Details

 

- (<tt>Object</tt>) waitq (readonly)

Returns the value of attribute waitq

19
20
21
# File 'wait.rb', line 19

def waitq
  @waitq
end

Class Method Details

+ (<tt>Object</tt>) abs_path(local)

FIXME: 取绝对路径

94
95
96
# File 'Helper.rb', line 94

def abs_path(local)
	local[Dir.getwd] ? local : File.join(@path, local)
end

+ (<tt>Object</tt>) Game

全局GameRender对象

64
65
66
67
68
69
# File 'Helper.rb', line 64

def Game
	@Game || begin
		msg_p "RunaGame not initialized. call RunaGame.setenv before use"
		nil
	end
end

+ (<tt>Object</tt>) getopt(key, klass)

109
110
111
# File 'Helper.rb', line 109

def getopt(key, klass)
	@Game.method(:GlobalGet).of(klass).call key.to_s
end

+ (<tt>Object</tt>) local_path(a)

FIXME: 取相对路径

99
100
101
# File 'Helper.rb', line 99

def local_path(a)
	a.gsub(@path+"/"){""}
end

+ (<tt>Object</tt>) log(*args)

记录到RunaGame.log July 6: 相当于直接p

115
116
117
# File 'Helper.rb', line 115

def log(*args)
	File.open(abs_path("RunaGame.log"), "a") {|f| f.puts args.join(" ")}
end

+ (<tt>Object</tt>) msg_p(*args) Also known as: p

弹框输出, 使用RunaGame.p

46
47
48
# File 'Helper.rb', line 46

def msg_p(*args)
	System::Windows::Forms::MessageBox.Show args.join($/)
end
119
120
121
122
123
124
125
126
127
128
129
130
131
# File 'Helper.rb', line 119

def Navigation(pagename)
	page = pagename
	if pagename.is_a?(String)
		page = self.Pages[pagename]
	end
	RunaGame::Cache.purge
	if page
		puts "Navigation -> #{pagename}"
		@Game.RootFrame.Navigation(page)
	else
		raise "Page #{pagename} is #{page.inspect}"
	end
end

打印错误并退出

52
53
54
55
56
57
58
59
# File 'Helper.rb', line 52

def print_exc(*args)
	str = ["Exception!", $!, "Debug info:", args.join($/)]
	msg_p *str
	str += ["\nTraceback:"] + caller
	log str.join($/)
#	log WMI.GetHardwareInfoString
	@Game.exit
end

+ (<tt>Object</tt>) setenv(game)

配置RunaGame库的运行环境 要使用RunaGame库,需要在GameLoop.Initialize中调用这个方法

85
86
87
88
89
90
91
# File 'Helper.rb', line 85

def setenv(game)
	@Game = game
	@path = Dir.getwd + "/DownloadedGames/" + @Game.GameContentRoot
	# initialize RunaGame local load path
	$: << @path << "#{@path}/lib"
#			RunaGame.msg_p "Ruby version:", RUBY_VERSION, "\nLoad path: ", $:, "\nGame root:", RunaGame.path
end

+ (<tt>Object</tt>) setopt(key, value)

读取/设置全局配置(操作引擎内部的一个Dictionary)

104
105
106
107
# File 'Helper.rb', line 104

def setopt(key, value)
	log "global option: #{key} => #{value}"
	@Game.GlobalSetValue key.to_s, value
end

+ (<tt>Object</tt>) state

54
# File 'state.rb', line 54

def self.state; RunaGame::State; end

+ (<tt>Object</tt>) switch

55
# File 'state.rb', line 55

def self.switch; RunaGame::State[:switch]; end

+ (<tt>Object</tt>) update_wait

29
30
31
32
33
34
35
36
37
38
39
# File 'wait.rb', line 29

def self.update_wait
	@waitq ||= []
	@waitq.each {|w| w[0]-=1}
	@waitq.delete_if {|w|
		if w[0]<=0
#				puts "wait: call"
			w[1].call
			true
		end
	}
end

+ (<tt>Object</tt>) wait(frame)

加入延时事件

22
23
24
25
26
# File 'wait.rb', line 22

def self.wait(frame)
	@waitq ||= []
#		puts "wait: add wait event #{frame} frames"
	@waitq << [frame, Proc.new]
end

Last edited Sep 12, 2013 at 12:08 PM by LonghronShen, version 4

Comments

No comments yet.