游戏的窗口就是游戏画面的区域,Game Zero的窗口对象被封装了,只能通过定义三个全局变量来初始化:高度、宽度、背景。
WIDTH = 600
HEIGHT = 600
BACKGROUND=colorant"black"
当然这三个变量也是可选的,如果没有定义,窗口默认大小400X400,背景为白色。要注意的是HEIGHT和WIDTH都必须为整数,BACKGROUND为一个Colorant object,它来自于Colors库,这就是1.2节中提到的,需要安装Colors库。笔者注意到在最新的Game Zero源码中,BACKGROUND还可定义背景为一张图片:BACKGROUND = "moon.jpg"。
在GameZero的世界里,屏幕上可见的游戏对象通常被定义为角色,你可以操纵角色,移动位置、更换角色图像、检测碰撞。角色是通过给定一个图片元素来创建的:a=Actor(image::String),例如:
a=Actor(“kitten.jpg”)
a.pos=(20,20)
以上两行代码定义了一个角色a,并且将其绘制在窗口的(20,20)处,即坐标x=20,y=20,注意GameZero的坐标原点在窗口左上角。Actor提供pos(position)属性设置它的位置,image属性设置它的图片,例如a.image=”xx.png”.
上节的TextActor是一种特殊的角色。另外GameZero还提供Rects(矩形)、Circles(圆)、Triangle(三角形)和 Lines(线条)四种对象,不过我们仍然可以将它们视为特殊角色:
r = Rect(xpos, ypos, width, height)
c = Circle(xpos, ypos, radius)
l = Line(xpos1, ypos1, xpos2, ypos2)
t = Triangle(xpos1, ypos1, xpos2, ypos2, xpos3, ypos3)
我们可以通过改变角色位置的相关属性值,来移动角色。下表是与位置相关的属性(把角色想象为一个矩形):
属性名称 |
类型 |
说明 |
范例 |
pos(position) |
Tuple(元组) |
由一对x,y坐标确定的位置 |
a.pos=(20,20) |
x |
Int |
左上角锚定的x坐标值 |
|
y |
Int |
左上角锚定的y坐标值 |
|
top |
Int |
上边,相当于y a.top=a.y |
if ball.top < 0 ball.top = ball.top * -1 |
left |
Int |
左边,相当于x a.left=a.x |
if ball.left < 0 ball.left = -ball.left |
bottom |
Int |
下边,角色底部距离窗口上边的y坐标值 |
|
right |
Int |
右边,角色右侧距离窗口左边的x坐标值 |
if ball.right > WIDTH ball.right += -(2 * (ball.right - WIDTH)) |
topleft |
Tuple(元组) |
左上角,与pos相同 |
a.topleft=0,20 |
topright |
Tuple(元组) |
右上角 |
|
bottomleft |
Tuple(元组) |
左下角 |
|
bottomright |
Tuple(元组) |
右下角 |
|
angle |
Float64 |
角度,单位是度 |
a.angle=30 |
游戏中的对象是使用draw(a::Actor)函数绘制到窗口上的,但是draw函数必须在游戏的draw循环函数内使用,draw循环函数就是相当于Python游戏库Pyglet 的on_draw事件循环。
draw循环方法可以定义为接受零个或一个参数。如果存在,则单个参数是游戏对象。例如:
function draw() .... end
或
function draw(g::Game) .... end
我们再来看看之前的Hello World程序,就可以理解对象是如何创建并呈现的了:
另外一个与对象呈现相关的函数是update循环函数,其实也可以理解为update事件。update循环函数用于更改游戏状态和Actor的属性,与draw配合渲染屏幕上的对象。Update函数可以定义为接受零个、一个或两个参数。第一个参数是游戏对象,第二个参数是前一帧画面的时间步长。
function update() .... end
function update(g::Game) .... end
function update(g::Game, dt) .... end
我们将hello world程序稍作修改:
1 txt = TextActor("Hello World","chiller",font_size=24, col-or=Int[0,0,0,255])# 2 txt.pos = (120,180) 3 4 #框架调用draw函数。我们在这里所做的就是画角色 5 function draw(g::Game) 6 clear() 7 draw(txt) 8 end 9 10 #update函数每帧调用一次,在此函数中,通过速率改变角色的位置 11 function update(g::Game,dt) 12 txt.x -= 400 * dt 13 if txt.left < 0 14 txt.left = -txt.left 15 end 16 end
上面的代码运行后,你可以看到角色向左移动,当碰到窗口左侧边缘的时候,被弹回来的效果。
这里稍作一提的是,通过update函数的Game参数,还可以获得键盘输入(g.keyboard)。接下来会详细介绍有关键盘和鼠标事件。