对比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

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

(0)
上一篇 2022年7月27日 14:12
下一篇 2022年7月27日 15:04

相关推荐

发表回复

登录后才能评论