2024MoonBit全球编程创新挑战赛参赛作品“飞翔的小鸟”技术开发指南

本文转载自 CSDN:https://blog.csdn.net/m0_61243965/article/details/143510089作者:言程序plus

实战开发基于moonbit和wasm4的飞翔的小鸟游戏

游戏中,玩家需要通过上下左右按键控制Bird,在不断移动的障碍pipe之间穿梭,通过点击上\下键控制小鸟的上升或者下降,成功避开障碍物可计1分,以此来挑战更高的分数.

1、定义游戏中的对象

这里以玩家控制的主角flybird和pipe 为例,使用moonbit的语法定义类型和实例化对象,语法简洁且实用.

struct BirdModel {    //bird mut x : Int   //mut 标识之后表示 此属性可以修改mut y : Intwidth : Intheight : Intmut birdVelocity : Int  //y轴向下方向速度
}
struct PipesItem {    // 障碍mut x : Inttop : Intbottom : Intwidth : Int
}let bird : BirdModel = { //bird初始化x: 10,y: 0,width: 15,height: 15,birdVelocity: 1 / 2,
}let pipes : Array[PipesItem] = [{ x: 160, top: 60, bottom: 40, width: 15 }] // 障碍初始化

2、将定义的游戏角色bird和pipe绘制在画布上

绘制游戏角色到画布上,这里就我们用到了wasm4的语法,同样也和简单,这里是一个具体示例:

//绘制bird
pub fn drawBird() -> Unit {@wasm4.set_draw_colors(4)let blit_flag : @wasm4.BlitFlag = {one_bit_per_pixel: true,flip_x: false,flip_y:false,rotate:false,}@wasm4.blit(@wasm4.sprite(b"\xff\xff\x7f\x87\x3f\x00\x3f\x30\x0f\x33\x03\x03\x00\x03\x80\x03\x80\x07\x80\x07\x80\x0f\xc0\x1f\xe0\x3f\x00\x3f\x80\xff\xff\xff"),bird.x,bird.y,16,16,blit_flag,)
}// 绘制障碍物
//这里我们用到了moonbit的循环语法,语法简洁且实际体验起来循环生成速度也很快 示例//绘制障碍物
pub fn drawPipes() -> Unit {for pipe in pipes {//上方柱子@wasm4.set_draw_colors(3)@wasm4.rect(pipe.x, 0, pipe.width, pipe.top)// 底部柱子// @wasm4.set_draw_colors(0x2U, index=1)@wasm4.set_draw_colors(3)@wasm4.rect(pipe.x, screen_size - pipe.bottom, pipe.width, pipe.bottom)}
}

3、为元素上色

在刚刚上一步绘制游戏角色的时候,我们用到了颜色,正常在前端开发中,元素的背景色可以随便设置,但在wasm-4 的调色板寄存器一次只能存储 4 种颜色, 但可以通过随时更改这一寄存器来引入新的颜色。我们使用 set_palette 来配置调色板,但在这个实现中就使用默认颜色配置。默认的配色看起来像 gameboy 的:

在这里插入图片描述

所以我们设计好游戏的主题颜色,初始化的时候,设置画布的四种颜色

pub fn start() -> Unit {@wasm4.set_palette(1, @wasm4.rgb(0x6FC5CC)) //背景   天空色@wasm4.set_palette(2, @wasm4.rgb(0xffc000)) // 小鸟  @wasm4.set_palette(3, @wasm4.rgb(0x64B625)) // 柱子  绿色@wasm4.set_palette(4, @wasm4.rgb(0xE0F8CF)) //默认背景色}然后游戏角色或者障碍物需要上色的时候,直接调用即可,示例:@wasm4.set_draw_colors(4)@wasm4.rect(bird.x, bird.y, 20, 20)  // 绘制一个正方形

4、获取用户输入,移动bird
wasm4可以获取到玩家输入可以有多种设备,如键盘,鼠标,游戏手柄等。用到的是@wasm4.get_gamepad()方法,我们点进源码里面是这样封装的

/// Gets the state of the gamepads.
/// @param index the index of the gamepad to get, from 1 to 4 (inclusive)  
/// @return the state of the gamepadspub fn get_gamepad(~index : UInt = 1) -> GamePad {if index.reinterpret_as_int() > 4 {trace("Gamepad index out of range")panic()}let state = load_byte(address_GAMEPADS + index.reinterpret_as_int() - 1).to_int()GamePad::{button_1: (state & 1) == 1,button_2: (state & 2) == 2,button_left: (state & 16) == 16,button_right: (state & 32) == 32,button_up: (state & 64) == 64,button_down: (state & 128) == 128,}
}

所以我们控制游戏角色运动的方法示例如下:

//控制bird,如果是用户按了键盘右键,bird的x轴坐标加1if @wasm4.get_gamepad(index=1).button_right  {bird.x += 1}

5 游戏碰撞逻辑处理

在上面的文章中博主已经实现了各种游戏角色绘制到画布上,同时也可以控制bird进行运动,下面给大家分享一下,游戏的碰撞逻辑:bird的坐标区域和游戏中全部障碍物的坐标区域发生了重合,即通过坐标之间的对比,来判断是否发生了碰撞和游戏失败.

体现到编码中即为:

// 检查碰撞
pub fn checkCollisions() -> Unit {for pipe in pipes {// Check if the bird is within the horizontal bounds of the pipe  if bird.x < pipe.x + pipe.width && bird.x + bird.width > pipe.x {// Check if the bird is within the vertical bounds of the top or bottom part of the pipe  if bird.y < pipe.top || bird.y + bird.width > screen_size - pipe.bottom {gameState.gameTitle = "gameover"gameState.isGameOver = true@wasm4.set_draw_colors(0x4U, index=4)@wasm4.text("Game Over!", 80, 80)}}}
}

当然为了使游戏更丰富一些,我们还可以使用wasm4中的tone方法,给碰撞之后的判断里面加一些提示音

 源码:fn tone(frequency : (UInt, UInt),duration : ADSR,volume : ADSRVolume,flags : ToneFlag
)
- frequency:频率,即用频率度量的音调
- Duration:时长,是用 envelope 记录的。 envelope 用于记录一个声音随着时间的变化, 此处的 ADSR 指定了 envelope 的四个参数 attack, decay, sustain and release。
- volume:字面义,音量大小
- flags:包括 channel, duty cycle 和 panning。使用默认值即可。示例:pub fn checkCollisions() -> Unit {for pipe in pipes {// Check if the bird is within the horizontal bounds of the pipe  if bird.x < pipe.x + pipe.width && bird.x + bird.width > pipe.x {// Check if the bird is within the vertical bounds of the top or bottom part of the pipe  if bird.y < pipe.top || bird.y + bird.width > screen_size - pipe.bottom {@wasm4.tone((2000, 0),@wasm4.ADSR::new(5),@wasm4.ADSRVolume::new(100),@wasm4.ToneFlag::new(),)gameState.gameTitle = "gameover"gameState.isGameOver = true@wasm4.set_draw_colors(0x4U, index=4)@wasm4.text("Game Over!", 80, 80)}}}
}

到这里我们的游戏就大致完成了。
在这里插入图片描述

四、作者总结

在开发过程中,我充分学习了Moonbit编程语法中的判断、循环、逻辑运算 、数据类型、函数对象 等语法知识点,不仅新学习了一门编程语言,也深深感受到Moonbit编程语言简单且实用的数据导向语言设计理解。在后续会持续关注Moonbit技术生态的发展,也争取能为Moonbit技术生态的发展壮大贡献自己的一点力量.

同时我也参加了本次比赛,为了能让这款游戏更好地呈现给玩家,我按照MoonBit大赛的作品规范,在GitHub上创建了公开可见的仓库,提供了游戏描述、玩法介绍和运行视频链接,让更多的人能够了解并体验这款游戏。MoonBit编程创新挑战赛不仅让我有机会展示自己的作品,更让我在与其他开发者的交流中收获颇丰。分享经验、探讨技术,共同推动着编程技术的发展和创新。我相信,通过这场赛事,我不仅提升了自己的编程能力,也结识了一群志同道合的朋友。

如果你也热爱编程,渴望挑战自我,不妨加入MoonBit全球编程创新挑战赛的行列,让我们一起在编程的世界里翱翔,创造属于自己的辉煌!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/8446.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

认证授权基础概念详解

目录 认证 (Authentication) 和授权 (Authorization)的区别是什么&#xff1f; RBAC 模型了解吗&#xff1f; 什么是 Cookie ? Cookie 的作用是什么? 如何在项目中使用 Cookie 呢&#xff1f; 如何在 Spring Boot 中创建和读取 Cookie 创建 Cookie Cookie 到期日期 安全…

彻底解决idea不识别java项目

需求背景 下载了一个java swing的项目,通过idea导入后,项目无法识别。打开java文件,也不会报错,也不编译。 无法识别效果图 可以看到左侧的菜单,项目是没有被识别。 打开java文件,可以看到没有识别,java的图标也没有出现。 解决方法 1、打开Project Structure 2、修改…

R6:LSTM实现糖尿病探索与预测

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、实验目的&#xff1a; 学习使用LSTM对糖尿病进行探索预测 二、实验环境&#xff1a; 语言环境&#xff1a;python 3.8编译器&#xff1a;Jupyter notebook…

笔试题11 -- 装箱问题(01背包)

装箱问题&#xff08;01背包&#xff09; 文章目录 装箱问题&#xff08;01背包&#xff09;一、原题复现二、思路剖析三、示例代码 题目链接&#xff1a;NOIP2001装箱问题 一、原题复现 题目描述 有一个箱子容量为V&#xff08;正整数&#xff0c;0 ≤ V ≤ 20000&#xff09;…

【D3.js in Action 3 精译_038】4.2 D3 折线图的绘制方法及曲线插值处理

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一部分 D3.js 基础知识 第一章 D3.js 简介&#xff08;已完结&#xff09; 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践&#xff08;上&#xff09;1.3 数据可…

测试-正交表与工具pairs的介绍使用(1)

目录 正交表 生成正交表 步骤 实操 注意事项 编写测试用例 根据正交表编写测试用例 补充遗漏的重要测试用例 正交表 关于长篇大论也不多介绍了&#xff0c;我们只需要知道正交法的⽬的是为了减少⽤例数⽬&#xff0c;⽤尽量少的⽤例覆盖输⼊的两两组合 正交表的构成&…

抗晃电马达保护器在工业厂房中的应用

安科瑞刘鸿鹏 摘要 随着工业自动化水平的提高&#xff0c;生产线上电动机作为关键设备的使用频率不断增加。然而&#xff0c;工厂生产环境中的电力波动&#xff0c;尤其是晃电现象&#xff0c;会对电动机的正常运转造成干扰&#xff0c;甚至导致设备停机和生产中断。抗晃电型…

linux之调度管理(2)-调度器 如何触发运行

一、调度器是如何在程序稳定运行的情况下进行进程调度的 1.1 系统定时器 因为我们主要讲解的是调度器&#xff0c;而会涉及到一些系统定时器的知识&#xff0c;这里我们简单讲解一下内核中定时器是如何组织&#xff0c;又是如何通过通过定时器实现了调度器的间隔调度。首先我们…

RHCE循环执行的例行性任务--crontab(周期性)

1.每分钟执行命令 2.每小时执行 3.每天凌晨3点半和12点半执行脚本 4.每隔6小时&#xff0c;相当于6,12,18,24点半执行脚本 5.30半点&#xff0c;8-18/2表示早上8点到下午18点之间每隔2小时执行脚本代表 6.每天晚上9点30重启nginx 7.每月1号和10号4点45执行脚本 8. 每周六和周日…

ETLCloud异常问题分析ai功能

在数据处理和集成的过程中&#xff0c;异常问题的发生往往会对业务运营造成显著影响。为了提高ETL&#xff08;提取、转换、加载&#xff09;流程的稳定性与效率&#xff0c;ETLCloud推出了智能异常问题分析AI功能。这一创新工具旨在实时监测数据流动中的潜在异常&#xff0c;自…

Java项目实战II基于Spring Boot的个人云盘管理系统设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 基于Spring Boot的个人云盘管理系统设计…

还在为慢速数据传输苦恼?Linux 零拷贝技术来帮你!

前言 程序员的终极追求是什么&#xff1f;当系统流量大增&#xff0c;用户体验却丝滑依旧&#xff1f;没错&#xff01;然而&#xff0c;在大量文件传输、数据传递的场景中&#xff0c;传统的“数据搬运”却拖慢了性能。为了解决这一痛点&#xff0c;Linux 推出了 零拷贝 技术&…

密码学是如何保护数据传输的安全性?

密码学通过一系列算法和协议来保护数据传输的安全性。 一、加密技术 对称加密算法 原理&#xff1a;使用相同的密钥进行加密和解密。应用&#xff1a;在数据传输过程中&#xff0c;发送方和接收方共享一个密钥&#xff0c;数据在传输前被加密&#xff0c;接收方使用相同的密钥…

python怎么打开py文件

1、首先在资源管理器里复制一下py文件存放的路径&#xff0c;按下windows键&#xff0b;r&#xff0c;在运行里输入cmd&#xff0c;回车打开命令行&#xff1a; 2、在命令行里&#xff0c;先切换到py文件的路径下面&#xff0c;接着输入“python 文件名.py ”运行python文件&a…

云计算——ACA学习 云计算核心技术

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​ 写在前面 本系列将会持续更新云计算阿里云ACA的学习&#xff0c;了解云计算及网络安全相关…

企业办公管理软件排名 | 九款企业管理软件助你制胜职场!(好用+实用+全面)

在寻找合适的企业办公管理软件时&#xff0c;你是否感到困惑不已&#xff0c;不知道从众多选项中选择哪一个&#xff1f; 一款好的管理软件不仅能简化工作流程&#xff0c;还能增强数据安全性&#xff0c;优化决策支持。 以下是九款备受推崇的企业管理软件&#xff0c;它们将助…

DNS服务器

DNS服务器 1、简介 DNS域名解析服务器&#xff0c;它作为将域名和IP地址相互映射的一个分布式数据库&#xff0c;端口号为53&#xff0c;通常使用UDP协议&#xff0c;但是在没有查询到完整的信息时&#xff0c;会以TCP这个协议来重新查询&#xff0c;所以在启动NDS服务器时&a…

顾荣辉在新加坡金融科技节发表主旨演讲:安全不仅是竞争优势,更是共同责任

在全球数字化和去中心化进程中&#xff0c;Web3的作用日益凸显&#xff0c;安全问题也日益成为行业的焦点。在这一背景下&#xff0c;顾荣辉教授于新加坡金融科技节&#xff08;SFF&#xff09;上发表主旨演讲《超越代码&#xff0c;引领信任》。顾教授在演讲中深入阐述了安全在…

Leetcode328奇偶链表,Leetcode21合并两个有序链表,Leetcode206反转链表 三者综合题

题目描述 思路分析 这题的思路就和我们的标题所述一样&#xff0c;可以看作是这3个题的合并&#xff0c;但是稍微还有一点点区别 比如&#xff1a;奇偶链表这道题主要是偶数链在了奇数后面&#xff0c;字节这个的话是奇偶链表分离了 所以字节这题的大概思路就是&#xff1a; …

「Mac玩转仓颉内测版1」入门篇1 - Cangjie环境的搭建

本篇详细介绍在Mac系统上快速搭建Cangjie开发环境的步骤&#xff0c;涵盖VSCode的下载与安装、Cangjie插件的离线安装、工具链的配置及验证。通过这些步骤&#xff0c;确保开发环境配置完成&#xff0c;为Cangjie项目开发提供稳定的基础支持。 关键词 Cangjie开发环境搭建VSC…