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

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

  1. python学习心得第三章

    python学习心得第三章 1.三元运算 变量=值1 if 条件 else 值2 由图如果条件成立则赋值1给变量,如果条件不成立则赋值2给变量. 2.数据类型 集合:set() class set(o ...

  2. Objective-C 基础教程第三章,面向对象编程基础知

    目录 Objective-C 基础教程第三章,面向对象编程基础知 0x00 前言 0x01 间接(indirection) 0x02 面向对象编程中使用间接 面向过程编程 面向对象编程 0x03 OC ...

  3. 跟着高淇学Python——第一到第三章总结

    2019/10/26 第一章:Python介绍 Python是一种解释型,面向对象的语言.特点是: 可读性强 简洁,简洁 面向对象 免费开源 可移植性和跨平台性 丰富的库 可扩展性 应用范围:1.人工 ...

  4. 路飞学城-Python爬虫集训-第三章

    这个爬虫集训课第三章的作业讲得是Scrapy 课程主要是使用Scrapy + Redis实现分布式爬虫 惯例贴一下作业: Python爬虫可以使用Requests库来进行简单爬虫的编写,但是Reque ...

  5. python学习笔记——第三章 串

    第三章 字符串学习 1.字符串不灵活, 它不能被分割符值 >>> format = "hello, %s. %s enough for ya?" >> ...

  6. 《零压力学Python》 之 第三章知识点归纳

    第三章(第一个程序)知识点归纳 编程犹如写剧本.Python函数与剧本差别不大,你可以反复调用函数,而它每次都执行预定的“脚本”(脚本也可以指整个程序). 在Python IDLE中,真正的编程是从编 ...

  7. VSTO开发指南(VB2013版) 第三章 Excel编程

    通过前两章的内容,有了一定的基础,但进入第三章,实例的步骤非常多,并且随着VS版本的升级,部分功能菜单界面发生了很大变化,所以,第三章的案例我将逐步编写! 实例3.1的目标就是给Excel写一个加载宏 ...

  8. Python开发【第三章】:Python的文件操作

    一.文件操作模式概述 1.打开文件的模式: r, 只读模式[默认] w,只写模式[不可读:不存在则创建:存在则删除内容:] a, 追加模式[不可读:不存在则创建:存在则只追加内容:] 2." ...

  9. Python开发【第三章】:文件操作

    一.文件操作模式概述 1.打开文件的模式: r, 只读模式[默认] w,只写模式[不可读:不存在则创建:存在则删除内容:] a, 追加模式[不可读:不存在则创建:存在则只追加内容:] 2." ...

  10. python基础教程-第三章-使用字符串

    本章将会介绍如何使用字符串何世华其他的值(如打印特殊格式的字符串),并简单了解下利用字符串的分割.联接.搜索等方法能做些什么 3.1 基本字符串操作 所有标准的序列操作(索引.分片.乘法.判断成员资格 ...

随机推荐

  1. 7.28考试总结(NOIP模拟26)[神炎皇·降雷皇·幻魔皇]

    或许只需一滴露水,便能守护这绽放的花朵. 前言 疯狂挂分,本来T2是想用树状数组优化一下的不知道为啥后来看了一下就少看了一层循环, 然后就想,我都 n 的复杂度了,足以搞过第一问了,还优化啥呀.... ...

  2. react props进阶 children属性

    children属性,表示组件标签的子节点,当组件标签有子节点时,props就会有该属性,与与普通的props一样,其值可以使任意类型. # 父组件 class App extends React.C ...

  3. 剑指Offer-64.滑动窗口的最大值(C++/Java)

    题目: 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6, ...

  4. work03

    第一题: 1.定义一个包含十个元素的数组.数组元素自己给出 2.遍历打印出数组元素 3.求出数组当中的最小值打印出来 4.求出数组当中的最大值打印出来 5,求数组当中 第二大 值 第二题: 1.定义一 ...

  5. ssm框架使springmvc放行资源(java配置类)

    在springmvc中,如果配置了拦截所有请求交给springmvc处理,会出现一些静态web资源加载不出来的情况,或者想放行指定web资源可以通过修改通过修改配置达到相应目的,这里使用覆写WebMv ...

  6. Nuxt3页面开发实战探索

    title: Nuxt3页面开发实战探索 date: 2024/6/19 updated: 2024/6/19 author: cmdragon excerpt: 摘要:这篇文章是关于Nuxt3页面开 ...

  7. Java面试知识点(六)hashmap深度理解

    1.hashmap 的数据结构 要知道 hashmap 是什么,首先要搞清楚它的数据结构,在 java 编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用 ...

  8. 关于ZYNQ-7000中断调试一点感想

    背景 在ZYNQ 平台下,需要对各种需要的底层接口进行初始化. 我依次调试了很多驱动,从最简单的网口到USB:再到读写PL端的寄存器(通过AXI总线,内存映射读写物理地址实现),到中断的时候一直卡着不 ...

  9. 【Python】用Python把从mysql统计的结果数据转成表格形式的图片并推送到钉钉群

    ** python把数据转为图片 / python推送图片到钉钉群 ** 需求:通过python访问mysql数据库,统计业务相关数据.把统计的结果数据生成表格形式的图片并发送到钉钉群里. 一:Cen ...

  10. P9212 题解

    显然,我们维护的答案具有 可差分 性,所以转换为 \([1,r]\) 上的查询. 首先,对于 \(x,y,a_i\) 先对 \(m\) 取模不影响结果. 下面为了方便令 \(v = a_i\). 如果 ...