• 对比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)。接下来会详细介绍有关键盘和鼠标事件。

  • 相关阅读:
    ThinkPHP第八天(U函数放置在外部JS不会被解析,错误界面定制,错误信息变量)
    ThinkPHP第七天(F函数使用,项目分组配置,项目分组模板文件放置规则配置)
    thinkphp第二天
    ThinkPHP第五天(提交类型判定常量IS_POST等,错误页面种类,Model实例化方式,模板中使用函数,foreach循环,模板中.语法配置)
    高阶函数、函数嵌套和闭包
    递 归
    函数式编程
    命名空间
    函数的参数
    循环语句
  • 原文地址:https://www.cnblogs.com/zjzkiss/p/16439634.html
Copyright © 2020-2023  润新知