ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-07-27 14:03:42  阅读:262  来源: 互联网

标签:heart score python timer label -- game num julia


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

标签:heart,score,python,timer,label,--,game,num,julia
来源: https://www.cnblogs.com/zjzkiss/p/16524517.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有