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. Qt--ui的简单使用(1)

    1  说明 本文主要介绍Qt ui界面的简单使用. 参考视频:https://www.bilibili.com/video/BV1XW411x7NU?p=22 2  工程创建 创建工程时,把创建界面给 ...

  2. java中以字符分隔的字符串与字符串数组的相互转换

    1.字符串数组拼接成一个以指定字符(包括空字符)分隔的字符串--String.join(),JDK8的新特性 String[] strArray = {"aaa","bb ...

  3. Nacos 版本不一致报错: Request nacos server failed

    在做微服务开发中,测试环境使用Nacos没有问题,但是生产环境服务启动一直报错: com.alibaba.nacos.api.exception.NacosException: Request nac ...

  4. item2 报错 a session ended very soon after starting. check that the command in profile default

    周末修改了阿里云 ecs 实例密码,再次用item2 远程连接服务器时,报一下的错误: 原因 每次使用ssh 远程新的连接,都会在 ~/.ssh/known_hosts 文件上生成 ssh 秘钥对,更 ...

  5. dubbo~全局异常拦截器的使用与设计缺陷

    异常拦截器ExceptionMapper 在JAX-RS(Java API for RESTful Web Services)中,ExceptionMapper接口用于将Java异常映射到HTTP响应 ...

  6. ETL工具-nifi干货系列 第十三讲 nifi处理器QueryDatabaseTable查询表数据实战教程

    1.处理器QueryDatabaseTable,该组件生成一个 SQL 查询,或者使用用户提供的语句,并执行它以获取所有在指定的最大值列中值大于先前所见最大值的行.查询结果将被转换为 Avro 格式, ...

  7. 在阿里云WINDOWS机器上部署的JAVA SpringBoot 时不时的无效 。

    用telnet 能通.但代码的HTTP 访问不了. 解决方法,在运行时加-Dserver.address=0.0.0.0,让它监听所有: java -Dserver.address=0.0.0.0 - ...

  8. Flashduty 案例分享 - 途游游戏

    Flashduty 作为功能完备的事件OnCall中心,可以接入云上.云下不同监控系统,统一做告警降噪分派.认领升级.排班协同,已经得到众多先进企业的认可.我们采访了一些典型客户代表,了解他们的痛点. ...

  9. 聊聊GLM-4-9B开源模型的微调loss计算

    概述 Github官方地址:GLM-4 网上已经有很多关于微调的文章,介绍各种方式下的使用,这里不会赘述.我个人比较关心的是微调时的loss计算逻辑,这点在很多的文章都不会有相关的描述,因为大多数人都 ...

  10. AI赋能ITSM:企业运维跃迁之路

    随着企业信息化建设的深入,IT运维管理作为保证企业信息系统稳定运行的重要工作,越来越受到重视. 那么,什么是IT运维呢? 简单地说,IT运维是一系列维护.管理和优化企业IT基础设施.系统和应用程序的活 ...