对比python学julia(第三章:游戏编程)--(第一节)初识游戏库(2)

1.1.    窗口初始化

  游戏的窗口就是游戏画面的区域,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"。

1.2.    角色(Actor)

  在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

1.3.    对象的呈现

  游戏中的对象是使用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)。接下来会详细介绍有关键盘和鼠标事件。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章