新聞中心

EEPW首頁 > 消費(fèi)電子 > 設(shè)計(jì)應(yīng)用 > 升級(jí)我的復(fù)古手持游戲機(jī),配備運(yùn)動(dòng)控制和液晶顯示器

升級(jí)我的復(fù)古手持游戲機(jī),配備運(yùn)動(dòng)控制和液晶顯示器

作者: 時(shí)間:2024-10-16 來源:EEPW編譯 收藏

按照我對(duì)手持游戲控制器的升級(jí),我添加了一個(gè)新的1.8英寸彩色LCD用于動(dòng)畫圖形,以及一個(gè)用于輸入的加速計(jì)模塊。

本文引用地址:http://m.butianyuan.cn/article/202410/463693.htm

在我之前的一篇文章中,我介紹了一種復(fù)古風(fēng)格的手持游戲機(jī)的開發(fā)過程,該游戲機(jī)具有本地?zé)o線多人連接功能。本文將重點(diǎn)介紹使用1.8英寸彩色LCD進(jìn)行動(dòng)畫圖形升級(jí),以及使用加速計(jì)模塊進(jìn)行輸入。

對(duì)于我們升級(jí)的硬件,我們將使用ESP8266編寫一個(gè)簡(jiǎn)單的基于Arduino的格斗游戲,在游戲中,屏幕兩側(cè)的兩名玩家相互戰(zhàn)斗,直到其中一人失去所有生命值。每個(gè)角色都將以16位顏色設(shè)置動(dòng)畫,并可通過傾斜和搖晃玩家各自的控制臺(tái)進(jìn)行控制。

在構(gòu)建這個(gè)項(xiàng)目之前,您可能想回顧一下本系列的第一部分,了解使用ESP-NOW進(jìn)行無線通信的基礎(chǔ)知識(shí),將MIDI文件轉(zhuǎn)換為背景音頻并播放,視頻游戲中的碰撞檢測(cè),以及如何將代碼上傳到ESP8266微控制器。

電路設(shè)計(jì)和PCB布局

圖1是我們復(fù)古手持設(shè)備改進(jìn)版本的Eagle接線示意圖。

帶LCD屏幕的復(fù)古游戲機(jī)電路示意圖

 

1.png

圖1.帶LCD屏幕的復(fù)古游戲機(jī)電路示意圖

升級(jí)后的控制臺(tái)的PCB設(shè)計(jì)不必改變,因?yàn)槲夜室饬舫隽藬U(kuò)展空間,包括用于更大SPI顯示器和I2C傳感器模塊的引腳頭(圖2)。然而,與我的大多數(shù)項(xiàng)目一樣,今天所涵蓋的一切都是面包板和性能板友好的。

復(fù)古游戲機(jī)的PCB布局

 2.png

圖2.復(fù)古游戲機(jī)的PCB布局

我已經(jīng)提供了Eagle原理圖和電路板文件供下載。

物料清單

下表顯示了構(gòu)建一個(gè)設(shè)備的物料清單。請(qǐng)記住,您需要兩個(gè)游戲機(jī)才能進(jìn)行無線多人游戲。

 3.png

表1.升級(jí)游戲機(jī)項(xiàng)目的物料清單(BOM)

彩色顯示和圖形庫

該顯示器為1.8英寸128x160像素TFT LCD,內(nèi)置ST7735S SPI驅(qū)動(dòng)IC。它使用一種名為RGB565的16位顏色格式,這意味著我們可以顯示高達(dá)65K的顏色。您會(huì)發(fā)現(xiàn)此顯示器的不同版本提供了不同的引腳排列,因此請(qǐng)確保正確連接。如果你正在復(fù)制我的自定義PCB,你需要修改它以支持不同的引腳。

對(duì)于這個(gè)項(xiàng)目,我們將使用Bodmer的TFT_eSPI圖形庫,該庫專門用于在ESP8266等32位微控制器上顯示動(dòng)態(tài)圖像。這些類型的圖像稱為精靈,存儲(chǔ)在處理器的RAM內(nèi)存中。它們可以以各種方式操縱,并集成在更大的2D場(chǎng)景之前或之后。精靈的一種顏色總是被指定為透明的,這樣很容易將它們疊加在其他圖像上。

帶游戲屏幕的復(fù)古游戲機(jī)視圖,包括玩家

人物

 4.png

圖3.屏幕上的玩家角色是使用精靈實(shí)現(xiàn)的

此項(xiàng)目中使用的所有精靈都是itch.io的Free Tiny Hero精靈素材的修改版本。您始終可以按照我代碼中的相同邏輯,用自己的藝術(shù)或互聯(lián)網(wǎng)上的其他圖形替換它們。

游戲場(chǎng)景

我們游戲中的場(chǎng)景分為三個(gè)部分:

背景

戰(zhàn)斗區(qū)域

HUD(平視顯示器)

對(duì)于背景,我選擇了一個(gè)漸變,從底部的白色開始,在頂部過渡到不同的次要顏色。在啟動(dòng)時(shí),次要顏色是從我認(rèn)為與頂部素材搭配得很好的幾種顏色中隨機(jī)選擇的。

我們的戰(zhàn)斗區(qū)域,或顯示器的中間,是玩家將戰(zhàn)斗的地方。一個(gè)玩家將在左側(cè)生成,而另一個(gè)玩家會(huì)在右側(cè)生成??偣灿腥齻€(gè)角色,而且,每當(dāng)游戲開始時(shí),它都會(huì)隨機(jī)分配給每個(gè)玩家一個(gè)角色,而不會(huì)重復(fù)。

HUD位于顯示器的頂部和底部,使用綠色狀態(tài)欄顯示每個(gè)玩家的健康點(diǎn)(HP),該狀態(tài)欄隨著玩家失去HP而遞減。在狀態(tài)欄旁邊,有描繪玩家角色和標(biāo)識(shí)符(玩家1或玩家2)的框架圖像。

為精靈制作動(dòng)畫

為了達(dá)到運(yùn)動(dòng)的效果,每當(dāng)玩家執(zhí)行一個(gè)動(dòng)作時(shí),我們都會(huì)快速滾動(dòng)與該特定動(dòng)作相關(guān)的一系列圖像,而不是顯示靜止圖像,給人一種我們的角色在屏幕上流暢動(dòng)態(tài)移動(dòng)的錯(cuò)覺,類似于卡通或傳統(tǒng)視頻游戲的工作方式。

這些圖像是我使用Rinky Dink Electronics的image-to-RGB565工具轉(zhuǎn)換為Arduino代碼的精靈資產(chǎn),以指針數(shù)組的形式組織,使其在渲染動(dòng)作時(shí)易于迭代。

在這個(gè)游戲中,動(dòng)作被定義為空轉(zhuǎn)(原地停留和呼吸)、行走(步態(tài)模式)和拳擊(向?qū)κ峙e起手臂)。每個(gè)動(dòng)作只有幾個(gè)圖像,這些圖像會(huì)根據(jù)游戲計(jì)數(shù)器變量激活,該變量在Arduino循環(huán)時(shí)遞增。

使用加速度計(jì)進(jìn)行運(yùn)動(dòng)傳感

最后,我們需要給用戶一種控制他們性格的方法。我們將使用MPU6050加速計(jì)/陀螺儀模塊,以及Refetick的MPU6050_light.h庫。該庫通過MPU6050芯片提供了一種輕量級(jí)、快速、簡(jiǎn)單的通信方法。

在這個(gè)項(xiàng)目中,我將傳感器垂直連接到PCB上,使我們能夠使用X軸傾斜角度讀數(shù),在整個(gè)控制臺(tái)向任一方向傾斜時(shí)向左或向右移動(dòng)角色。此外,與我的電子墨水蝕刻草圖項(xiàng)目類似,我使用了所有三個(gè)軸的加速度讀數(shù),實(shí)現(xiàn)了震動(dòng)檢測(cè),每當(dāng)用戶搖動(dòng)控制臺(tái)時(shí),都會(huì)觸發(fā)一個(gè)沖壓動(dòng)作。

傾斜和抖動(dòng)范圍可能因您的特定MPU6050模塊及其位置而異。請(qǐng)記住,在確定哪種靈敏度最適合您的設(shè)置之前,您必須修改不同的值。

上傳代碼

現(xiàn)在我們了解了這個(gè)項(xiàng)目背后的邏輯,我們需要將代碼上傳到我們的ESP8266微控制器。和上次一樣,我將使用Lolin D1 Mini板,它有一個(gè)方便的USB到串行編程器。

在開始上傳之前,您需要使用所有相關(guān)的板和庫設(shè)置Arduino環(huán)境。我們將對(duì)主機(jī)和客戶端使用相同的草圖,只使用兩行代碼來區(qū)分它們。一行是一個(gè)名為isHost的布爾變量(1代表主機(jī),0代表客戶端):

 5.png

第二行是接收節(jié)點(diǎn)的相應(yīng)MAC地址的數(shù)組: 

 6.png

主程序、音頻和MAC查找器的代碼可從GitHub下載。

輪到你了

除了本文及其前一個(gè)迭代中涵蓋的功能外,我還包括了一個(gè)我們的控制臺(tái)啟動(dòng)的基本“連接”屏幕,以及一些用于阻塞和躲避等操作的精靈,您可以在項(xiàng)目的版本中實(shí)現(xiàn)。

你將如何擴(kuò)展這個(gè)項(xiàng)目?你還會(huì)包括哪些其他硬件?你想制作什么類型的游戲?

在我之前的文章中,一位用戶建議切換到ESP32,它提供了更多的GPIO引腳,可能消除了對(duì)I/O擴(kuò)展器的需求,I/O擴(kuò)展器以前用作8位觸覺開關(guān)端口。您還可以添加一個(gè)MP3播放器IC,用于播放更長(zhǎng)、更復(fù)雜的背景游戲音樂片段。

得益于ESP硬件,您甚至可以擴(kuò)展此項(xiàng)目以連接到全球互聯(lián)網(wǎng),并與更多玩家互動(dòng),而不是ESP-NOW協(xié)議的本地化功能。




評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉