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