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.rhkb.cn/news/466827.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浅谈Agent

目录 什么是大模型 Agent &#xff1f; 大模型Agent 有哪些部分组成? 规划&#xff08;Planning&#xff09; Planning类型 不依赖反馈的计划 基于反馈的计划 拆解子目标和任务分解方法 COT TOT GOT LLMP 反思和完善 ReAct(融合推理与执行的能力) Reflexion(动态…

文本转SQL(Text-to-SQL),场景介绍与 Spring AI 实现

在众多的 AI 大模型的应用场景中&#xff0c;Text-to-SQL&#xff0c;也就是文本转 SQL&#xff0c;是其中实用性很高的一个。Text-to-SQL 充分利用了大模型的优势&#xff0c;把用户提供的自然语言描述转换成 SQL 语句&#xff0c;还可以执行生成的 SQL 语句&#xff0c;再把查…

DICOM标准:深入详解DICOM医学影像中的传输语法

引言 DICOM&#xff08;数字成像和通信医学&#xff09;标准在医学影像数据交换中扮演着至关重要的角色。其中&#xff0c;*传输语法&#xff08;Transfer Syntax&#xff09;是DICOM标准中定义数据编码和传输方式的核心部分。理解传输语法对于确保不同设备和系统之间的互操作性…

如何提高谷歌收录速度?

相信很多做外贸推广的朋友都遇到过这种情况&#xff1a;网站上线了&#xff0c;但新页面迟迟不被谷歌收录。即使你的内容很优秀&#xff0c;设计也很精美&#xff0c;如果谷歌爬虫抓不到页面&#xff0c;一切努力就白费了。这时候&#xff0c;GSI谷歌快速收录服务就成了“救命稻…

Spring面向切面编程

目录 1.AOP概述及Spring AOP实现原理 AOP概述 AOP的应用场景 AOP的作用 Spring AOP概述 Spring AOP的实现原理 Spring AOP中Advice的分类 2. 通过xml配置实现AOP 实现步骤&#xff1a; 新增模块&#xff1a; 导入相关依赖&#xff1a; 新增实体类User 新增业务类UserS…

Notepad++ 更改字体大小和颜色

前言 在长时间编程或文本编辑过程中&#xff0c;合适的字体大小和颜色可以显著提高工作效率和减少眼睛疲劳。Notepad 提供了丰富的自定义选项&#xff0c;让你可以根据个人喜好调整编辑器的外观。 步骤详解 1. 更改字体大小 打开 Notepad 启动 Notepad 编辑器。 进入设置菜…

香港航空 阿里滑块 acw_sc__v3 分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 有相关问题请第一时间头像私信联系我删…

Unet++改进3:添加NAMAttention注意力机制

本文内容:添加NAMAttention注意力机制 目录 论文简介 1.步骤一 2.步骤二 3.步骤三 4.步骤四 论文简介 识别不太显著的特征是模型压缩的关键。然而,它在革命性的注意机制中尚未得到研究。在这项工作中,我们提出了一种新的基于归一化的注意力模块(NAM),它抑制了较不显著…

WPF+MVVM案例实战(二十二)- 制作一个侧边弹窗栏(CD类)

文章目录 1、案例效果1、侧边栏分类2、CD类侧边弹窗实现1、样式代码实现2、功能代码实现3 运行效果4、源代码获取1、案例效果 1、侧边栏分类 A类 :左侧弹出侧边栏B类 :右侧弹出侧边栏C类 :顶部弹出侧边栏D类 :底部弹出侧边栏2、CD类侧边弹窗实现 1、样式代码实现 在原有的…

汽车广告常见特效处理有哪些?

​汽车广告作为展示汽车性能和外观的重要媒介&#xff0c;常常需要借助特效来增强视觉效果&#xff0c;吸引观众的注意力。以下是一篇关于汽车广告中常见特效处理的文章。 在竞争激烈的汽车市场中&#xff0c;广告不仅是推广产品的工具&#xff0c;更是艺术和科技的结合。特效技…

【CUDA】线程配置

一、 线程层次结构 1.1 认识 GPU 可并行执行工作 Thread&#xff1a;所有线程执行相同的核函数&#xff0c;并行执行 Thread Block&#xff1a;执行在一个Streaming Multiprocessor (SM)&#xff0c;同一个Block中的线程可以协作 线程的集合称为块&#xff0c;块的数量很多…

爬虫-------字体反爬

目录 一、了解什么是字体加密 二. 定位字体位置 三. python处理字体 1. 工具库 2. 字体读取 3. 处理字体 案例1&#xff1a;起点 案例2&#xff1a;字符偏移&#xff1a; 5请求数据 - 发现偏移量 5.4 多套字体替换 套用模板 版本1 版本2 四.项目实战 1. 采集目…

transformer模型写诗词

项目源码获取方式见文章末尾&#xff01; 600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【基于CNN-RNN的影像报告生成】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实现…

【计算机网络】章节 知识点总结

一、计算机网络概述 1. 计算机网络向用户提供的两个最重要的功能&#xff1a;连通性、共享 2. 因特网发展的三个阶段&#xff1a; 第一阶段&#xff1a;从单个网络 ARPANET 向互联网发展的过程。1983 年 TCP/IP 协议成为 ARPANET 上的标准协议。第二阶段&#xff1a;建成三级…

【微服务】不同微服务之间用户信息的获取和传递方案

如何才能在每个微服务中都拿到用户信息&#xff1f;如何在微服务之间传递用户信息&#xff1f; 文章目录 概述利用微服务网关做登录校验网关转微服务获取用户信息openFeign传递微服务之间的用户信息 概述 要在每个微服务中获取用户信息&#xff0c;可以采用以下几种方法&#…

【p2p、分布式,区块链笔记 Torrent】WebTorrent 的lt_donthave插件

扩展实现 https://github.com/webtorrent/lt_donthave/blob/master/index.js /*! lt_donthave. MIT License. WebTorrent LLC <https://webtorrent.io/opensource> */// 导入所需模块 import arrayRemove from unordered-array-remove // 用于从数组中删除元素的函数 i…

兰空图床配置域名访问

图床已经创建完毕并且可以访问了&#xff0c;但是使用IP地址多少还是差点意思&#xff0c;而且不方便记忆&#xff0c;而NAT模式又没法直接像普通服务器一样DNS解析完就可以访问。 尝试了很多办法&#xff0c;nginx配置了半天也没配好&#xff0c;索性直接重定向&#xff0c;反…

Sophos | 网络安全

在 SophosLabs 和 SophosAI 的威胁情报、人工智能和机器学习的支持下&#xff0c;Sophos 提供广泛的高级产品和服务组合&#xff0c;以保护用户、网络和端点免受勒索软件、恶意软件、漏洞利用、网络钓鱼和各种其他网络攻击。Sophos 提供单一的集成式基于云的管理控制台 Sophos …

STM32外设之SPI的介绍

### STM32外设之SPI的介绍 SPI&#xff08;Serial Peripheral Interface&#xff09;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;主要用于EEPROM、FLASH、实时时钟、AD转换器等外设的通信。SPI通信只需要四根线&#xff0c;节约了芯片的管脚&#x…

基于 Transformer 的语言模型

基于 Transformer 的语言模型 Transformer 是一类基于注意力机制&#xff08;Attention&#xff09;的模块化构建的神经网络结构。给定一个序列&#xff0c;Transformer 将一定数量的历史状态和当前状态同时输入&#xff0c;然后进行加权相加。对历史状态和当前状态进行“通盘…