• 对比python学julia(第三章:游戏编程)(第二节)公主迎圣诞(4)


    4.  碰撞检测 、得分及生命

      在第 4 个阶段,利用GameZero的碰撞检测功能,使公主角色能够接到雪花 、礼物或剪刀。 在“sdgz”项目目录中 ,把 version3.jl录复制一份并命名为version4.jl,在第 3 个版本的基础上编写第 4 个版本的代码。

      1)  碰撞检测

      检测公主角色与下落物体是否碰撞。在GameZero里碰撞检测很简单,只需调用碰撞检测函数即可,碰撞检测函数在本节的“编程思路”中有具体详解。

    collide(princess, falling_obj)

      2)  显示得分和爱心宝石

      切换到源文件“version4.jl”的编辑窗口中,准备编写代码。

      创建一个显示爱心宝石的角色,放在窗口的左上角位置(50,100)。

      heart = Actor(heart1_img)

      heart.pos=(50, 100)

      创建一个文本标签用来显示得分情况,文本的字体颜色为黑色,字体为“moonhouse”,位置为(300,12)。

      score_label = TextActor("Hello World", "moonhouse";color=Int[0,0,0,0])

      score_label.pos=(300,12)

      在窗口的draw()方法中添加显示文本标签和爱心宝石图像的代码。  

    elseif game_state == 1
         …
         draw(score_label)
         if 1 <= heart_num <= 3
             draw(heart)
         end
    else game_state == 2
         …
         draw(score_label)

      注意:变量 heart_num 需要用 global关键字来声明为全局变量。

      3)  更新得分和爱心宝

      在 falling_control(dt) 函数中应用碰撞检测功能 ,并更新得分和爱心宝石的变化情况,具体步骤如下:

      (1)  通过碰撞检测函数检测公主与下落物体是否碰撞,如果公主碰到雪花加10 分,碰到礼物加 50 分,碰到剪刀则扣掉一颗爱心宝石。碰撞之后还要播放一个 pop 音效,以及切换下落物体的造型。

     1 if collide(princess.position, falling_obj)
     2         if falling_obj.type == 1
     3             score += 10
     4         elseif falling_obj.type == 2
     5             score += 50
     6         elseif falling_obj.type == 3
     7             heart_num -= 1
     8         end
     9 
    10         #音效
    11         play_sound(pop_sound)
    12         
    13         #切换下落物体造型
    14         change(falling_obj)
    15 end

      注意: 变量 heart_num 和 score 需要用 global 关键字声明为全局 变量。

      (2)  将玩家得分更新到文本标签中

      由于TextActor不能动态更换文字,只能重新定义一个新的TextActor对象,不断更替旧对象,来达到更新得分的效果:

      #更新得分

      score_label = TextActor(string(score),"moonhouse";color=Int[0,0,0,0])

      score_label.pos=(300,12)  

      注意在draw()事件函数中一定要clear()。

      (3) 根据变量 heart_num的值更新爱心宝石图像,或者heart_num 小于 0 时就让游戏进人结束状态。

    #更新生命爱心
        if heart_num < 0
            game_state = 2
        elseif heart_num == 1
            heart.image = heart1_img
        elseif heart_num == 2
            heart.image = heart2_img
        elseif heart_num == 3
            heart.image = heart3_img
        end

      4)  按回车键开始游戏时,让程序使用预设值

      在窗口的 on_key_down()方法中加入下面的代码,将 score 设为 0、heart_num 设为 3。

      if game_state != 1
    
             …
    
              score = 0
    
              heart_num = 3
    
         end

      注意: 变量 heart_num 和 score 需要用 global 关键字来声明为全局 变量。

      5)  从窗口的 on_key_down()方法中删除如下测试代码:

      #用于测试游戏结束的情况

          if k == Keys.SPACE

              game_state = 2

          end

         至此,第 4 个版本的程序编写完成。运行程序,然后对下面的功能进行测试。

      ①玩家控制公主精灵左右移动,如果接到雪花和礼物就能获取得分,如果碰到 剪刀就会扣掉爱心宝石。②当爱心宝石被用光,再碰到剪刀,就会进人游戏结束状态。

        如果程序未能实现上述功能,请认真检查自己编写的代码,或者对照本文资源包中提供的源代码进行检查。

    5.   其他控制

      在第 5 个阶段,为游戏增加倒计时和循环播放背景音乐的功能。在“sdgz”项目目录中,把 version4.jl文件制一份并命名为version5.jl,在第4个版本的基础上编写第5个版本的代码。

      1)   实现倒计时功功能

      切换到源文件“version5.jl”的编辑窗口,准备编写代码。

      创建一个文本标签用于显示倒计时时间,文本的字体颜色为黑色,字体为“moonhouse”,位置为(430,12)。

      timer_label=TextActor("00:00", "moonhouse";color=Int[0,0,0,255])

      timer_label.pos=(430,12)

         在窗口的draw()方法中添加绘制文本标签 timer_label 的代码,在游戏处于进行状态和结束状态时都显示倒计时的文本标签。 

    elseif game_state == 1
         …
         draw(timer_label)
    else game_state == 2
         …
         draw(timer_label)
    end

      在窗口的on_key_down()方法中设定变量 timer_value 初始值为 300。    

    if game_state != 1
        …
         timer_value=300
    
     end

      注意: 变量 timer_value 需要用 global关键字来声明为全局变量。

         为了使变量 timer_value 的值不断减少,添加函数others_control(dt),代码如下:

     1 function others_control(dt)
     2     #其他控制:倒计时、循环播放背景音乐'''
     3     global game_state, timer_value,timer_label,isPlaying
     4 
     5     #倒计时
     6     if game_state == 1
     7         timer_value -= 1 * dt
     8         if timer_value <= 0
     9             timer_value = 0
    10             game_state = 2
    11         end
    12         timer_label=TextActor(@sprintf("%02d:%02d", div(timer_value,60), timer_value % 60),"moonhouse";font_size=16,color=Int[0,0,0,255])
    13         timer_label.pos=(420,15)
    14     end
    15     #循环播放背景音乐
    16     if game_state == 1
    17         if !isPlaying
    18             play_music(music)
    19             isPlaying=true
    20         end
    21     end
    22     
    23 end

      注意代码中使用了@sprintf标签,它是用来实现参数字符串的效果。所以,需要引入Printf库,在代码中加入:using Printf。

         当游戏处于进行状态时,以秒为单位进行倒计时,变量 timer_value 的值每秒减少量为 1 *dt。 当变量 timer_value 的值小于等于 0 时 ,则游戏结束。

         上面代码中还增加了循环播放背景音乐的代码,注意isPlaying变量,用来判断音乐是否已在播放。初始值是false。

         在update()方法中调用,并传入时间参数。

    function update(g::Game,dt)
        …
        others_control(dt)
    end

      至此,第5个版本的程序编写完成。运行程序,然后对倒计时和循环播放背景音乐的功能进行测试。

      经过 5 个版本的迭代,一个简单的“公主迎圣诞”小游戏终于完成了。

      最终代码放出:https://files.cnblogs.com/files/zjzkiss/sdgz_v3.rar

  • 相关阅读:
    MYSQL关键字的使用
    SESSION的使用
    COOKIE的使用
    ES6中的let与const---let与var的区别---详解
    JavaScript中四种数据类型检测的方法
    java数据类型
    讲Windows7的电脑搭建成服务器的教程
    ISS服务器
    用java编写一个万年历程序
    if 条件语句的用法
  • 原文地址:https://www.cnblogs.com/zjzkiss/p/16524517.html
Copyright © 2020-2023  润新知