對比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)。接下來會詳細介紹有關鍵盤和鼠標事件。

 

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