嵌入式产品级-超小尺寸游戏机(从0到1 硬件-软件-外壳)

server/2025/2/28 10:32:55/

Ultra-small size gaming console。

超小尺寸游戏机-Pico

This embedded product is mainly based on miniaturization, followed by his game functions are also very complete, for all kinds of games can be played, and there will be relevant illustrations in the follow-up of the article.

This product is a very, very small game console, and he has all the functions inherent in the game console.

这款超小尺寸游戏机Pico,是一款结合了小型化设计和强大游戏功能的嵌入式设备。它的体积非常紧凑,适合携带,同时它依然保留了传统游戏机的各种功能。无论是经典的2D横版游戏、复古的街机游戏,还是一些现代的小游戏,Pico都能够顺利运行。

Pico的设计重点之一就是极致的便携性,尽管体积小,但依然能提供丰富的游戏体验。它通常具备类似按键、显示屏和扬声器的基本硬件配置,能够满足各种游戏操作的需求。此外,Pico内置了游戏模拟器和相关软件,使得用户能够体验不同平台上的游戏。

具体来说,这款游戏机可能搭载了流行的嵌入式开发平台,如Raspberry Pi Pico,支持多种编程语言和工具,甚至可以通过自定义代码和硬件扩展来进一步增强其功能。

  • 极致便携性:Pico的尺寸非常小巧,方便携带。无论是放口袋里还是随身携带,都不占太多空间,适合外出时随时随地享受游戏。

  • 强大兼容性:它支持多种游戏模拟器和格式,能够运行各类经典游戏,包括复古街机游戏、掌机游戏等,甚至可以自定义加载新游戏。

  • 高性价比:作为一款小型游戏机,Pico提供的功能远超其体积。你可以以较低的成本享受到多种游戏的娱乐体验,同时它还支持编程开发,适合开发者进行定制化应用。

  • 开源与可定制性:Pico基于流行的嵌入式平台(如Raspberry Pi Pico),具有开源特性,允许用户根据个人需求进行软件和硬件的修改和扩展,能够轻松实现个性化定制。

  • 简单易用:操作界面简洁,用户只需轻松连接显示设备和控制器,就可以迅速开始游戏。无论是初学者还是有经验的玩家都能很快上手。

  • 节能高效:由于体积小,功耗低,Pico非常节能,适合长时间游戏而不需要频繁充电。

  • 丰富的开发资源:由于其基于开放平台,Pico有着丰富的开发资源和社区支持,用户可以轻松找到教程、工具和讨论,快速进行功能扩展。

  • 多功能集成:除了作为游戏机,Pico还可以作为其他嵌入式项目的开发平台,具备了强大的开发潜力和应用灵活性。

下述为原理图以及PCB。

下述为相关游戏的部分案例代码。

import PICOplaygame 
import time 
import random 
import gc from machine 
import freq
freq(125_000_000)
gc.enable() # This line helps make sure we don't run out of memory
# Sensitive game parameters
XVel = 0.05 YVel = 0 Distance = 0 YPos = 0 Gravity = 0.15 MaxFPS = 60 Points = 0 GameRunning = True CactusPos = random.randint(72, 300) CloudPos = random.randint(60, 200) JumpSoundTimer = 0
# Sprite data
PlayerSpr = bytearray([0x04 ^ 0xFF, 0x08 ^ 0xFF, 0xC8 ^ 0xFF, 0xBC ^ 0xFF, 0x1C ^ 0xFF, 0x0E ^ 0xFF, 0x1A ^ 0xFF, 0x2C ^ 0xFF]) PlayerRunFrame1 = bytearray([0xFF, 0xFF, 0xFF, 0xFD, 0xF9, 0xBB, 0xBB, 0xD3, 0xE1, 0xF1, 0xC1, 0xB3, 0x61, 0xD5, 0xF3, 0xFF]) PlayerRunFrame2 = bytearray([0xFF, 0xFF, 0xF7, 0xFB, 0xFB, 0xFB, 0x3B, 0x93, 0xE3, 0x71, 0x03, 0xE7, 0xC3, 0xAB, 0xE7, 0xFF]) CactusSpr1 = bytearray([0x00 ^ 0xFF, 0xFC ^ 0xFF, 0x86 ^ 0xFF, 0x92 ^ 0xFF, 0xC2 ^ 0xFF, 0xFC ^ 0xFF, 0x00 ^ 0xFF, 0x00 ^ 0xFF]) CactusSpr2 = bytearray([0x00 ^ 0xFF, 0x1E ^ 0xFF, 0x10 ^ 0xFF, 0xFE ^ 0xFF, 0xE4 ^ 0xFF, 0x20 ^ 0xFF, 0x78 ^ 0xFF, 0x00 ^ 0xFF]) CloudSpr = bytearray([0x9F, 0x4F, 0x63, 0x59, 0xBD, 0x73, 0x73, 0x65, 0x5C, 0x7E, 0x7E, 0x51, 0x57, 0x4F, 0x1F, 0xBF])
CactusSpr = CactusSpr1
PICOplaygame.display.fill(0) PICOplaygame.display.drawText("Tinysaur", 12, 0, 1) PICOplaygame.display.drawText("  Run", 15, 9, 1) PICOplaygame.display.update()
PICOplaygame.display.setFPS(60)
PICOplaygame.saveData.setName("SaurRun")
while(PICOplaygame.buttonA.pressed() == True or PICOplaygame.buttonB.pressed() == True): if(time.ticks_ms() % 1000 < 500): PICOplaygame.display.drawFilledRectangle(0, 32, 72, 8, 0)PICOplaygame.display.drawText("Press A/B", 9, 32, 1) else: PICOplaygame.display.drawFilledRectangle(0, 32, 72, 8, 1)PICOplaygame.display.drawText("Press A/B", 9, 32, 0) PICOplaygame.display.update()pass while(PICOplaygame.buttonA.pressed() == False and PICOplaygame.buttonB.pressed() == False): if(time.ticks_ms() % 1000 < 500): PICOplaygame.display.drawFilledRectangle(0, 32, 72, 8, 0)PICOplaygame.display.drawText("Press A/B", 9, 32, 1) else: PICOplaygame.display.drawFilledRectangle(0, 32, 72, 8, 1)PICOplaygame.display.drawText("Press A/B", 9, 32, 0) PICOplaygame.display.update()pass while(PICOplaygame.buttonA.pressed() == True or PICOplaygame.buttonB.pressed() == True): if(time.ticks_ms() % 1000 < 500): PICOplaygame.display.drawFilledRectangle(0, 32, 72, 8, 0)PICOplaygame.display.drawText("Press A/B", 9, 32, 1) else: PICOplaygame.display.drawFilledRectangle(0, 32, 72, 8, 1)PICOplaygame.display.drawText("Press A/B", 9, 32, 0) PICOplaygame.display.update()pass
while(GameRunning): t0 = time.ticks_us() # Check the time# Is the player on the ground and trying to jump?if(JumpSoundTimer < 0): JumpSoundTimer = 0 if((PICOplaygame.buttonA.pressed() == True or PICOplaygame.buttonB.pressed() == True) and YPos == 0.0): # Jump!JumpSoundTimer = 200YVel = -2.5# Handle "dynamics"YPos += YVelYVel += GravityDistance += XVelJumpSoundTimer -= 15if(JumpSoundTimer > 0): PICOplaygame.audio.set(500-JumpSoundTimer) else: PICOplaygame.audio.stop()# Accelerate the player just a little bitXVel += 0.000025# Make sure we haven't fallen below the groundWif(YPos > 0): YPos = 0.0YVel = 0.0# Has the player hit a cactus?if(CactusPos < 8 and CactusPos > -8 and YPos > -8): # Stop the game and give a promptGameRunning = FalsePICOplaygame.display.fill(1)PICOplaygame.audio.stop()PICOplaygame.display.drawText("Oh no!", 18, 1, 0)PICOplaygame.display.drawText(str(int(Distance))+"m", 26, 9, 0) high = -1if(PICOplaygame.saveData.hasItem("highscore")): high = int(PICOplaygame.saveData.getItem("highscore"))PICOplaygame.display.drawText("High: " + str(high)+"m", 8, 17, 0) if(Distance > high): PICOplaygame.saveData.setItem("highscore", Distance)PICOplaygame.saveData.save() PICOplaygame.display.drawText("Again?", 19, 25, 0)PICOplaygame.display.drawText("A:N B:Y", 16, 33, 0)PICOplaygame.display.update()PICOplaygame.audio.playBlocking(300, 250)PICOplaygame.audio.play(260, 250)while(PICOplaygame.inputPressed() == False): pass # Wait for the user to give us somethingwhile(GameRunning == False): if(PICOplaygame.buttonB.pressed() == True == 1): # Restart the gameXVel = 0.05YVel = 0Distance = 0YPos = 0Points = 0GameRunning = TrueCactusPos = random.randint(72, 300)CloudPos = random.randint(60, 200)elif(PICOplaygame.buttonA.pressed() == True): # QuitPICOplaygame.reset() # Exit game to main menu# Is the cactus out of view?if(CactusPos < -24): # "spawn" another one (Set its position some distance ahead and change the sprite) Points += 10PICOplaygame.audio.play(440, 300)CactusPos = random.randint(72, 500)if(random.randint(0, 1) == 0): CactusSpr = CactusSpr1 else: CactusSpr = CactusSpr2# Is the cloud out of view?if(CloudPos < -32): # "spawn" another oneCloudPos = random.randint(40, 200)# More dynaaaaaaaaaaaamicsCactusPos -= XVel * 16CloudPos -= XVel * 2# Draw game statePICOplaygame.display.fill(1)PICOplaygame.display.blit(CactusSpr, int(16 + CactusPos), 24, 8, 8, 1, 0, 0) PICOplaygame.display.blit(CloudSpr, int(16 + CloudPos), 8, 16, 8, 1, 0, 0)if(t0 % 250000 < 125000 or YPos != 0.0): # Player is in first frame of run animationPICOplaygame.display.blit(PlayerRunFrame1, 8, int(23 + YPos), 16, 8, 1, 0, 0) else: # Player is in second frame of run animationPICOplaygame.display.blit(PlayerRunFrame2, 8, int(24 + YPos), 16, 8, 1, 0, 0)PICOplaygame.display.drawFilledRectangle(0, 31, PICOplaygame.display.width, 9, 0) # Ground PICOplaygame.display.drawText(str(int(Points)), 0, 0, 0) # Current points PICOplaygame.display.drawText("pts", len(str(int(Points))) * 8, 0, 0) PICOplaygame.display.drawText(str(int(Distance)), 0, 32, 1) # Current distance PICOplaygame.display.drawText("m", len(str(int(Distance))) * 8, 32, 1) PICOplaygame.display.update()# Spin wheels until we've used up one frame's worth of timewhile(time.ticks_us() - t0 < 1000000.0 / MaxFPS): pass 

下述内容就是功能演示了。


http://www.ppmy.cn/server/171269.html

相关文章

如何确保海外线路的通话质量

2024年最吓人的一句话&#xff0c;“不出海必出局“&#xff01;确实国内语音的环境太卷了&#xff0c;大家都开始关注语音线路怎么出海了。 对于出海&#xff0c;OKCC还是跟国内一样&#xff0c;只提供系统&#xff0c;不做运营&#xff0c;不做线路资源。 但是线路又是必不…

CSS隐藏元素的方式

方式一&#xff1a; visibility 属性 visibility 属性默认值是 show &#xff0c;如果设置为 hidden &#xff0c;元素会隐藏。 元素看不见了&#xff0c;还占有原来的位置&#xff08;元素的大小依然保持&#xff09;。 方式二&#xff1a; display 属性 设置 dis…

AndroidStudio下载旧版本方法

首先&#xff0c;打开Android Studio的官网&#xff1a;https://developer.android.com/studio。 然后&#xff0c;点击【Read release notes】。 然后需要将语言切换成英文&#xff0c;否则会刷不出来。 然后就可以看下各个历史版本了。 直接点链接好像也行&#xff1a;h…

Windows逆向工程入门之数据结构使用

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 第一章&#xff1a;MASM数据定义体系精要 1.1 基础数据类型全景 1.1.1 整型数据规范 1.1.2 浮点数据编码 1.2 复合数据结构 1.2.1 多维数组定义 1.2.2 复杂结构体 第二章&#xf…

VidSketch:具有扩散控制的手绘草图驱动视频生成

浙大提出的VidSketch是第一个能够仅通过任意数量的手绘草图和简单的文本提示来生成高质量视频动画的应用程序。该方法训练是在单个 RTX4090 GPU 上进行的&#xff0c;针对每个动作类别使用一个小型、高质量的数据集。VidSketch方法使所有用户都能使用简洁的文本提示和直观的手绘…

计算机毕设-基于springboot的融合多源高校画像数据与协同过滤算法的高考择校推荐系统的设计与实现(附源码+lw+ppt+开题报告)

博主介绍&#xff1a;✌多个项目实战经验、多个大型网购商城开发经验、在某机构指导学员上千名、专注于本行业领域✌ 技术范围&#xff1a;Java实战项目、Python实战项目、微信小程序/安卓实战项目、爬虫大数据实战项目、Nodejs实战项目、PHP实战项目、.NET实战项目、Golang实战…

国内访问Github的四种方法(2025版)

声明&#xff1a;以下内容&#xff0c;仅供学习使用&#xff0c;不得他用。如有他用&#xff0c;与本文作者无关。 国内访问GitHub及下载文件的解决方案整理如下&#xff0c;结合最新技术方案和实测有效方法&#xff1a; 一、网络层解决方案 Hosts文件修改法 通过DNS查询工具…

关于Postman自动获取token

在使用postman测试联调接口时&#xff0c;可能每个接口都需要使用此接口生成的令牌做Authorization的Bearer Token验证&#xff0c;最直接的办法可能会是一步一步的点击&#xff0c;如下图&#xff1a; 在Authorization中去选择Bearer Token&#xff0c;然后将获取到的token粘贴…