3.3.    编程实现

2.  控制摩托车和箱子

  在这个步骤中,将编程控制摩托车和箱子角色的运动,让摩托车在沙漠公路上能够加速或减速行驶,在碰到箱子时能够停止,以及显示麾托车的行驶速度和里程等。

  (1) 创建motor_move()函数,实现对摩托的行驶控制,分别使用键盘上的 4 个方向键控制摩托车向上移动、向下移动、减速和加速。

 1 function motor_move(up_max, down_min, speed, key ,dt)
2 #摩托移动'''
3 global motor_speed, motor_bottom
4 if key.UP
5
6 motor_bottom -= 50 * dt
7 #println(motor_bottom)
8 if motor_bottom <HEIGHT-up_max
9 motor_bottom = HEIGHT-up_max
10 end
11 end
12 if key.DOWN
13 motor_bottom += 50 * dt
14 if motor_bottom > down_min
15 motor_bottom = down_min
16 end
17 end
18 if key.LEFT
19 motor_speed -= 324 * dt
20 if motor_speed < 0
21 motor_speed = 0
22 end
23 end
24 if key.RIGHT
25 motor_speed += speed * dt
26 if motor_speed > 1620
27 motor_speed = 1620 #摩托车最大速度
28 end
29 end
30 end

  这个函数将会被间接调用,与时间敏感的数据和 dt 参数结合使用,从而精确控制数据的变化。例如,按下向上方向键控制麾托车往窗口上方移动时,在代码 motor_bottom -= 50 * dt 中使用了 dt 参数,假设50是 1s 内的变化量。 也就是说,按下向上方向键,变量 motor_bottom 在 lS 内能够减少50(注意坐标轴是位于窗口左上角)。 其他使用了 dt 参数的代码与之是相同的道理。

  (2) 创建motor_control()函数,用于控制麾托车角色运动。根据摩托车与箱子是否碰撞和所处位置使用不同的方式控制摩托车移动,以及显示摩托车的行驶速度和里程等。

 1 function motor_control(g::Game,dt)
2 #摩托车的控制'''
3 global motor_speed, motor_left, motor_bottom, mileag-es,isPlaying,speed_label,mileages_label
4
5 #碰撞检测和移动控制
6 if collide(motor, box)
7 #println(@sprintf("box.bottom=%2d,motor.bottom=%2d",box.bottom,motor.bottom))
8 if ( box.bottom - 24< motor.bottom < box.bottom)
9 #println("oo")
10 motor_speed = 0
11 motor_move(50, HEIGHT, motor_speed,g.keyboard, dt)
12 elseif motor.bottom <= box.bottom - 24
13 motor_move(50, box.bottom - 24, 162,g.keyboard, dt)
14 else
15 motor_move(box.bottom, HEIGHT, 162,g.keyboard, dt)
16 end
17 else
18 motor_move(50, HEIGHT, 162,g.keyboard, dt)
19 end
20 motor.bottom = motor_bottom
21 motor_left += motor_speed * dt
22 mileages = motor_left * 0.024
23 speed_label =TextActor(@sprintf("Motor: %.3f km/h",motor_speed * 0.024 * 3.6),"moonhouse")
24 speed_label.pos=(10,15)
25 mileages_label = TextActor(@sprintf("Mileages: %.3f km" ,mileages / 1000),"moonhouse")
26 mileages_label.pos=(10,35)
27 end

  关于控制摩托车运动的几种方式以及将速度和里程转换成km为单位等,请查看编程思路中的介绍 这个函数在窗口update()方法中使用。

  (3) 创建box_control()函数,用于控制箱子角色运动。当摩托车行驶里程超过100m,并且里程数是 300 的整数倍时,将让箱子从x坐标3000 处向窗口左侧移动。同时,箱子出现在麾托车y坐标附近。如果玩家不注意控制摩托车行驶,就会撞上箱子。这个函数在窗口update()方法中使用。

 1 function box_control(dt)
2 #'''箱子的控制'''
3 global mileages, motor_speed
4 if mileages > 100 && floor(Int,mileages) % 300 == 0
5 println(floor(Int,mileages))
6 #放置箱子
7 box.left = 3000
8 box.bottom = motor.bottom + 6
9 #播放警报声
10 play_music(alert_sound,3)
11 else
12 #移动箱子
13 box.left -= motor_speed * dt
14 end
15 end

  (4) 窗口update()方法

1 function update(g, dt)
2 bgA.pos=(0 - floor(Int,motor_left) % 600, 0)
3 bgB.pos=(600 - floor(Int,motor_left) % 600, 0)
4 motor_control(g,dt)
5 box_control(dt)
6 end

  至此,第2个步骤的工作就完成了。运行程序,就可以使用键盘上的4个方向键控制摩托车上下移动、加速或减速,当摩托车碰到箱子时,就会停止前进。同时,在摩托车向前行驶时,窗口左上方的速度和里程数会不断变化。

3.   添加游戏音效

  在这个步骤中,将编程实现让麾托车行驶时发出轰鸣的引擎声,以及在靠近箱子时响起警报声,提醒玩家注意躲避。

  (1)  在motor_contro()函数中增加播放摩托车音效的代码。当摩托车行驶速度大于0 时,就播放轰鸣的引擎声音效,当行驶速度等于 0 时,则停止声音。

function motor_control(g::Game,dt)
#摩托车的控制'''
……
if motor_speed > 0
if !isPlaying play_music(motor_sound)
isPlaying=true
end
elseif motor_speed == 0
if isPlaying==true
isPlaying=false end end end

  (2)  在 box_control()函数中增加播放警报声的代码。当摩托车的行驶里程大于100m,并且是 300 的整数倍时,就播放警报声音效。

 1 function box_control(dt)
2 #'''箱子的控制'''
3 global mileages, motor_speed
4 if mileages > 100 && floor(Int,mileages) % 300 == 0
5 println(floor(Int,mileages))
6 #放置箱子
7 box.left = 3000
8 box.bottom = motor.bottom + 6
9 #播放警报声
10 play_music(alert_sound,3)
11 else
12 #移动箱子
13 box.left -= motor_speed * dt
14 end
15 end

  至此,这个“疯狂摩托”游戏程序编写完毕。运行程序,玩家就可以听到摩托车在行驶中发出轰鸣的引擎声,还可以在听到警报声后及时躲避前方出现的箱子。 否则,摩托车在高速行驶时,玩家会很难躲避箱子。

  代码下载:https://files.cnblogs.com/files/zjzkiss/fkmt_v2.rar

对比python学julia(第三章:游戏编程)--(第三节)疯狂摩托(3)的更多相关文章

  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. 一周万星的文本转语音开源项目「GitHub 热点速览」

    上周的热门开源项目让我想起了「图灵测试」,测试者在不知道对面是机器还是人类的前提下随意提问,最后根据对方回复的内容,判断与他们交谈的是人还是计算机.如果无法分辨出回答者是机器还是人类,则说明机器已通过 ...

  2. react css-in-js

    CSS-in-JS是一种技术,而不是一个具体的库实现.简单来说CSS-in-JS就是将应用的CSS样式写在JavaScript文件里面,而不是独立为一些css,scss或less之类的文件,这样你就可 ...

  3. if语句嵌套

       // if语句的嵌套         // 在if语句的{}中,执行程序中,再次有if语句         /*         if(){             if(){          ...

  4. P7322

    P7322 好神仙! \(\color{#5bc9}\text{提醒,本文有大量没有推到过程的式子,所以读者可以自己遮住先推一下}\) Inscription: 有一个长度为 \(k\) 的窗口,在一 ...

  5. 【 INFINI Workshop 上海站】7 月 27 日一起动手实验玩转 Easysearch

    [ INFINI Workshop 上海站]7 月 27 日下午 和 INFINI Labs 的技术专家面对面,第一时间了解极限实验室的发布最新产品和功能特性,通过动手实战,快速掌握最前沿的搜索技术, ...

  6. redis实战技巧

    1.分析key大小 [root@db-51 ~]#redis-cli -h 10.0.0.51 -p 6380 --bigkeys # Scanning the entire keyspace to ...

  7. Next.js 13 如何使用loading.js

    要在next.js 13中使用loading.js,我们需要先在对应的文件目录下创建loading.js文件 文件结构如下: app test1 loading.tsx page.tsx 如上面的目录 ...

  8. MyBatis 关于查询语句上配置的详细内容

    1. MyBatis 关于查询语句上配置的详细内容 @ 目录 1. MyBatis 关于查询语句上配置的详细内容 2. 准备工作 3. SQL查询结果,返回为POJO实体类型 4. SQL查询结果,返 ...

  9. LocalDateTime日期相互转换字符串

    /** LocalDateTime日期相互转换字符串 * 默认的时间日期样式 */ public static final String YYYYMMDDHHMMSSS_PATTERN = " ...

  10. Bloom Filter布隆过滤器

    简介 本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地插入和查询,可以用来告诉你 "某样东西一定不存在或者可 ...