对比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程序,就可以理解对象是如何创建并呈现的了:

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

  另外一个与对象呈现相关的函数是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)。接下来会详细介绍有关键盘和鼠标事件。

 

原创文章,作者:sunnyman218,如若转载,请注明出处:https://blog.ytso.com/272802.html

(0)
上一篇 2022年7月9日
下一篇 2022年7月9日

相关推荐

发表回复

登录后才能评论