制作一款打飛機游戲26:精靈編輯器

雖然我們基本上已經重建了Axel編輯器,但我不想直接使用它。我想創建一個真正適合我們當前目的的編輯器,那就是編輯精靈(sprites)。這將是今天的一個大目標——創建一個基于模板的編輯器,用它作為我們實際編輯器的起點。

細節調整

在開始之前,有一些小細節我想修復。比如,滾動功能現在不太靈敏,尤其是在屏幕左側邊緣。我們需要讓滾動對左側邊緣更敏感一些。通過調整滾動X的值,我們現在已經解決了這個問題,使得滾動更加順暢。

消息系統優化

另一個我不喜歡的地方是,當我們導出時,它只使用一個調試系統來顯示消息。我希望有一個內置的更正式的消息系統,消息可以格式化并在一段時間后自動消失。因此,我決定添加一個MSG對象來處理這些消息,并在屏幕上顯示它們,每條消息顯示兩秒鐘后自動消失。

編輯器界面優化

我注意到,當列表項很多時,滾動到底部會變得非常繁瑣。因此,我決定添加鼠標滾輪滾動功能,這樣可以更快速地滾動列表。通過調整狀態變量m_scroll,我們已經實現了這一功能。

創建精靈編輯器

現在,我想基于之前的編輯器模板,創建一個專門用于編輯精靈的編輯器。我將其命名為“Sprite Edit”。在這個編輯器中,我將保留表格視圖,但同時創建一個新的視圖來編輯精靈。這個新視圖將被稱為“列表視圖”。

列表視圖實現

在列表視圖中,我將顯示所有精靈的列表,每個精靈占據一行。用戶可以通過滾動快速瀏覽所有精靈,并通過選擇某個精靈來編輯它。我已經實現了刷新列表和繪制列表的功能,現在用戶可以看到一個簡潔的精靈列表。

顯示精靈預覽

為了讓用戶能夠直觀地看到他們正在編輯的精靈,我決定在列表視圖中添加精靈預覽功能。當用戶選擇某個精靈時,程序將在屏幕上繪制該精靈的預覽圖。為了實現這一點,我使用了mspr函數來從精靈表中獲取精靈數據,并在屏幕上繪制它們。

中心點標記

為了讓用戶更清楚地了解精靈的中心點位置,我決定在精靈預覽圖上添加中心點標記。我使用了一個小紅點來表示精靈的中心點,并通過閃爍來引起用戶的注意。此外,我還繪制了從屏幕中心到精靈中心點的虛線,以幫助用戶更準確地定位精靈。

新增精靈功能

接下來,我實現了新增精靈的功能。用戶可以通過點擊底部的“+”按鈕來創建一個新的精靈條目。為了確保新創建的精靈條目是有效的,我添加了足夠的默認數據(如位置、寬度、高度和偏移量)。

編輯精靈模式

最后,我創建了一個編輯精靈的模式。在這個模式下,用戶可以選擇一個精靈并進入編輯狀態。我將編輯精靈的UI設計為一個包含多個編輯框和按鈕的菜單,用戶可以通過這些控件來修改精靈的屬性。

pico-8 cartridge // http://www.pico-8.com
version 41
__lua__
function _init()--- customize here ---#include shmup_myspr.txtfile="shmup_myspr.txt"arrname="myspr"data=myspr----------------------debug={}msg={}_drw=draw_list_upd=update_listmenuitem(1,"export",export)reload(0x0,0x0,0x2000,"cowshmup.p8")curx=1cury=1scrolly=0scrollx=0poke(0x5f2d, 1)
endfunction _draw()_drw()if #msg>0 thenbgprint(msg[1].txt,64-#msg[1].txt*2,80,14)msg[1].t-=1if msg[1].t<=0 thendeli(msg,1)end  end-- debug --cursor(4,4)color(8)for txt in all(debug) doprint(txt)end
endfunction _update60()dokeys()mscroll=stat(36)_upd()
endfunction dokeys()if stat(30) thenkey=stat(31)if key=="p" thenpoke(0x5f30,1)endelsekey=nilendend
-->8
--draw
function draw_edit()fillp(0b11001100001100111100110000110011)rectfill(0,0,127,127,33)fillp(?)line(63,0,63,127,13)line(0,63,127,63,13)fillp()draw_menu()if selspr thenmspr(selspr,63,63)endif (time()*2)%1<0.5 thenpset(63,63,rnd({8,13,7,15}))end
endfunction draw_list()fillp(0b11001100001100111100110000110011)rectfill(0,0,127,127,33)fillp(?)line(63,0,63,127,13)line(0,63,127,63,13)fillp()draw_menu()local mymnu=menu[cury][curx]if mymnu.cmdy thenmspr(mymnu.cmdy,63,63)endif (time()*2)%1<0.5 thenpset(63,63,rnd({8,13,7,15}))end
endfunction draw_table()cls(2)draw_menu()
endfunction draw_menu()--spr(0,0,0,16,16)if menu thenfor i=1,#menu dofor j=1,#menu[i] dolocal mymnu=menu[i][j]local c=mymnu.c or 13if i==cury and j==curx thenc=7if _upd==upd_type thenc=0endendbgprint(mymnu.w,mymnu.x+scrollx,mymnu.y+scrolly,13)   bgprint(mymnu.txt,mymnu.x+scrollx,mymnu.y+scrolly,c) endendendif _upd==upd_type thenlocal mymnu=menu[cury][curx]local txt_bef=sub(typetxt,1,typecur-1)local txt_cur=sub(typetxt,typecur,typecur)local txt_aft=sub(typetxt,typecur+1)txt_cur=txt_cur=="" and " " or txt_cur if (time()*2)%1<0.5 thentxt_cur="\^i"..txt_cur.."\^-i"endlocal txt=txt_bef..txt_cur..txt_aftbgprint(txt,mymnu.x+scrollx,mymnu.y+scrolly,7)endend-->8
--update
function update_edit()refresh_edit()
endfunction update_list()refresh_list()if btnp(??) thencury-=1endif btnp(??) thencury+=1endcury=(cury-1)%#menu+1cury-=mscrollcury=mid(1,cury,#menu)curx=1local mymnu=menu[cury][curx]if mymnu.y+scrolly>110 thenscrolly-=4endif mymnu.y+scrolly<10 thenscrolly+=4endscrolly=min(0,scrolly)if mymnu.x+scrollx>110 thenscrollx-=2endif mymnu.x+scrollx<20 thenscrollx+=2endscrollx=min(0,scrollx)if btnp(?) thenlocal mymnu=menu[cury][curx]if mymnu.cmd=="newline" thenadd(data,{0,0,0,0,0,0})elseif mymnu.cmd=="editspr" thenselspr=mymnu.cmdy_upd=update_edit_drw=draw_editendend
endfunction update_table()refresh_table()if btnp(??) thencury-=1endif btnp(??) thencury+=1endcury=(cury-1)%#menu+1cury-=mscrollcury=mid(1,cury,#menu)if btnp(??) thencurx-=1endif btnp(??) thencurx+=1endif cury<#menu thencurx=(curx-2)%(#menu[cury]-1)+2elsecurx=1endlocal mymnu=menu[cury][curx]if mymnu.y+scrolly>110 thenscrolly-=4endif mymnu.y+scrolly<10 thenscrolly+=4endscrolly=min(0,scrolly)if mymnu.x+scrollx>110 thenscrollx-=2endif mymnu.x+scrollx<20 thenscrollx+=2endscrollx=min(0,scrollx)if btnp(?) thenlocal mymnu=menu[cury][curx]if mymnu.cmd=="edit" then_upd=upd_typetypetxt=tostr(mymnu.txt)typecur=#typetxt+1elseif mymnu.cmd=="newline" thenadd(data,{0})  elseif mymnu.cmd=="newcell" thenadd(data[mymnu.cmdy],0)endend
endfunction upd_type()if key thenif key=="\r" then-- enterlocal mymnu=menu[cury][curx]poke(0x5f30,1)local typeval=tonum(typetxt)if typeval==nil thenif mymnu.cmdx==#data[mymnu.cmdy] and typetxt=="" then--delete celldeli(data[mymnu.cmdy],mymnu.cmdx)if mymnu.cmdx==1 thendeli(data,mymnu.cmdy)end_upd=update_tablereturnend  typeval=0enddata[mymnu.cmdy][mymnu.cmdx]=typeval_upd=update_tablereturnelseif key=="\b" then--backspaceif typecur>1 thenif typecur>#typetxt thentypetxt=sub(typetxt,1,#typetxt-1)elselocal txt_bef=sub(typetxt,1,typecur-2)local txt_aft=sub(typetxt,typecur)typetxt=txt_bef..txt_aftendtypecur-=1endelseif typecur>#typetxt thentypetxt..=keyelselocal txt_bef=sub(typetxt,1,typecur-1)local txt_aft=sub(typetxt,typecur)typetxt=txt_bef..key..txt_aftendtypecur+=1endendif btnp(??) thentypecur-=1endif btnp(??) thentypecur+=1endtypecur=mid(1,typecur,#typetxt+1)
end
-->8
--toolsfunction bgprint(txt,x,y,c)print("\#0"..txt,x,y,c)
endfunction split2d(s)local arr=split(s,"|",false)for k, v in pairs(arr) doarr[k] = split(v)endreturn arr
endfunction mspr(si,sx,sy)local ms=myspr[si]sspr(ms[1],ms[2],ms[3],ms[4],sx-ms[5],sy-ms[6],ms[3],ms[4],ms[7]==1)if ms[7]==2 thensspr(ms[1],ms[2],ms[3],ms[4],sx-ms[5]+ms[3],sy-ms[6],ms[3],ms[4],true)endif ms[8] thenmspr(ms[8],sx,sy)end
end
-->8
--i/o
function export()local s=arrname.."=split2d\""for i=1,#data doif i>1 thens..="|"endfor j=1,#data[i] doif j>1 thens..=","ends..=data[i][j]endends..="\""printh(s,file,true)add(msg,{txt="exported!",t=120})--debug[1]="exported!"
end
-->8
--ui
function refresh_edit()menu={}
endfunction refresh_list()menu={}for i=1,#data dolocal lne={}local linemax=#data[i]if i==cury thenlinemax+=1  endadd(lne,{txt="spr "..i,w="",cmd="editspr",cmdy=i,x=2,y=-4+6*i})add(menu,lne)endadd(menu,{{txt=" + ",w="   ",cmd="newline",x=2,y=-4+6*(#data+1)+2, }})
endfunction refresh_table()menu={}for i=1,#data dolocal lne={}local linemax=#data[i]if i==cury thenlinemax+=1  endadd(lne,{txt=i,w="   ",cmd="",x=4,y=-4+8*i,c=2  })for j=1,linemax doif j==#data[i]+1 thenadd(lne,{txt="+",w=" ",cmd="newcell",cmdy=i,x=-10+14*(j+1),y=-4+8*i, })elseadd(lne,{txt=data[i][j],cmd="edit",cmdx=j,cmdy=i,x=-10+14*(j+1),y=-4+8*i,w="   "})endendadd(menu,lne)endadd(menu,{{txt=" + ",w="   ",cmd="newline",x=4,y=-4+8*(#data+1), }})
end__gfx__
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00700700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00077000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00077000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00700700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
__map__
0000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/79310.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/79310.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/79310.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mac下載homebrew 安裝和使用git

mac下載homebrew 安裝和使用git 本人最近從windows換成mac&#xff0c;記錄一下用homebrew安裝git的過程 打開終端 command 空格&#xff0c;搜索終端 安裝homebrew 在終端中輸入下面命令&#xff0c;來安裝homebrew /bin/bash -c "$(curl -fsSL https://raw.githu…

【LeetCode Hot100】圖論篇

前言 本文用于整理LeetCode Hot100中題目解答&#xff0c;因題目比較簡單且更多是為了面試快速寫出正確思路&#xff0c;只做簡單題意解讀和一句話題解方便記憶。但代碼會全部給出&#xff0c;方便大家整理代碼思路。 200. 島嶼數量 一句話題意 求所有上下左右的‘1’的連通塊…

《社交類應用開發:React Native與Flutter的抉擇》

社交類應用以令人目不暇接的速度更新迭代。新功能不斷涌現&#xff0c;從更智能的算法推薦到多樣化的互動形式&#xff0c;從增強的隱私保護到跨平臺的無縫體驗&#xff0c;每一次更新都旨在滿足用戶日益增長且多變的需求。面對如此高頻的更新需求&#xff0c;選擇合適的跨端框…

關于3D的一些基礎知識

什么是2D/3D? 2D&#xff08;二維&#xff09;和3D&#xff08;三維&#xff09;是描述空間維度的概念&#xff0c;它們的核心區別在于空間維度、視覺表現和應用場景。以下是詳細對比&#xff1a; 1. 定義與維度 ? 2D&#xff08;二維&#xff09; ? 定義&#xff1a;僅包…

大連理工大學選修課——機器學習筆記(7):集成學習及隨機森林

集成學習及隨機森林 集成學習概述 泛化能力的局限 每種學習模型的能力都有其上限 限制于特定結構受限于訓練樣本的質量和規模 如何再提高泛化能力&#xff1f; 研究新結構擴大訓練規模 提升模型的泛化能力 創造性思路 組合多個學習模型 集成學習 集成學習不是特定的…

嵌入式產品運行中數據丟失怎么辦?

目錄 1、數據丟失現象與根源分析 2、硬件層優化 3、系統/驅動層優化 4、應用軟件層優化 5、文件系統選型深度解析 5.1、NAND Flash 適用文件系統 5.2、eMMC 適用文件系統 6、系統掛載選項優化實踐 嵌入式系統在運行過程中&#xff0c;尤其是在涉及頻繁數據寫入&#xf…

第十一節:性能優化高頻題-響應式數據深度監聽問題

解決方案&#xff1a;watch的deep: true選項或watchEffect自動追蹤依賴 Vue響應式數據深度監聽與性能優化指南 一、深度監聽的核心方案 watch的deep: true模式 ? Vue2實現&#xff1a;需顯式聲明深度監聽配置 watch: {obj: {handler(newVal) { /* 處理邏輯 */ },deep: tru…

【Linux實踐系列】:進程間通信:萬字詳解命名管道實現通信

&#x1f525; 本文專欄&#xff1a;Linux Linux實踐項目 &#x1f338;作者主頁&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客勵志語錄&#xff1a; 與其等待完美的風&#xff0c;不如學會在逆風中調整帆的角度——所有偉大航程都始于此刻出發的勇氣 ★★★ 本文前置知…

權力結構下的人才價值重構:從 “工具論” 到 “存在論” 的轉變?

引言? 在現在的公司管理里&#xff0c;常常能聽到這樣一種說法&#xff1a;“我用你&#xff0c;你才是人才&#xff1b;不用你&#xff0c;你啥都不是。” 這其實反映了一種很常見的評判人才價值的標準&#xff0c;就是只看公司的需求&#xff0c;把人才當作實現公司目標的工…

UE實用地編插件Physical Layout Tool

免費插件 https://www.fab.com/zh-cn/listings/a7fb6fcf-596f-48e9-83cc-f584aea316b1 可以通過物理模擬批量放置物體 不用再一個個擺放了 裝飾環境從未如此簡單&#xff0c;您不必再考慮對齊物體。 物理地放置物體&#xff0c;移動它們&#xff0c;在移動或在地圖上放置物體…

Nerfstudio 環境配置與自有數據集(圖片和視頻)測試全方位全流程實戰【2025最新版!!】

一、引言 神經輻射場(Neural Radiance Fields&#xff0c;簡稱NeRF)是近年來計算機視覺和圖形學領域的一項革命性技術&#xff0c;它能夠從2D圖像中學習復雜的3D場景表示。然而&#xff0c;NeRF技術的實現和應用門檻較高&#xff0c;需要較為專業的計算機視覺和深度學習知識。…

Transformer:顛覆深度學習的架構革命與技術演進

2017年&#xff0c;谷歌團隊在論文《Attention Is All You Need》中提出的Transformer架構&#xff0c;徹底改變了人工智能對序列數據的處理范式。它不僅解決了傳統循環神經網絡&#xff08;RNN&#xff09;的長期依賴和并行化難題&#xff0c;更催生了BERT、GPT等劃時代模型&a…

原型模式(Prototype Pattern)詳解

文章目錄 1. 什么是原型模式&#xff1f;2. 為什么需要原型模式&#xff1f;3. 原型模式的結構4. 原型模式的基本實現4.1 基礎示例&#xff1a;簡單的原型模式4.2 使用Java的Cloneable接口 5. 深拷貝與淺拷貝5.1 淺拷貝&#xff08;Shallow Copy&#xff09;5.2 深拷貝&#xf…

掉餡餅,八分之一到二分之一:《分析模式》漫談59

DDD領域驅動設計批評文集 做強化自測題獲得“軟件方法建模師”稱號 《軟件方法》各章合集 “Analysis Patterns”的第6章“存貨和會計”原文&#xff1a; The transactions creation would then be the only place that could create entries. ... Providing only the trans…

使用Python和Pandas實現的Amazon Redshift權限檢查與SQL生成用于IT審計

import pandas as pd import psycopg2 from psycopg2 import sql# 連接Redshift conn psycopg2.connect(hostyour-cluster.endpoint.redshift.amazonaws.com,port5439,dbnamedev,useradmin,passwordyour-password )# 權限檢查函數 def check_redshift_permissions(conn):"…

Cribl 數據脫敏 更多方法 MASK (三)

我做過好幾個cribl 數據脫敏的實驗: Cribl 脫敏mask-CSDN博客

Android Studio下載安裝教程

## 什么是Android Studio Android Studio是Google官方推出的Android應用開發集成環境(IDE)&#xff0c;基于IntelliJ IDEA開發&#xff0c;專門用于Android應用開發。它包含了代碼編輯器、可視化布局編輯器、應用性能分析工具、模擬器等功能&#xff0c;為開發者提供了一站式的…

如何測試登錄模塊?全面測試思路解析

思路如下: 面試官問"如何測試一個登錄模塊?"時,考察的是你的測試思維是否全面,能否覆蓋功能、安全、性能、兼容性等多個維度。下面我會從不同角度詳細展開,確保回答既系統又深入。 1. 功能測試(Functional Testing) 1.1 正常流程測試 ? 正確的用戶名+密碼:…

MySQL基礎篇 | 數據庫概述及在TencentOS中安裝MySQL8.0.42版本

MySQL基礎篇 | 在TencentOS中安裝MySQL8.0.42版本 1. 數據庫概述2. 部署前準備工作2.1. 安裝依賴包2.2. GCC版本升級3. MySQL服務部署3.1. 編譯部署MySQL3.2. 初始化數據庫3.3. 啟動數據庫4. 數據庫配置4.1 配置環境變量4.2. 首次登錄設置1. 數據庫概述 SQL Server:SQL Server…

Angular教程前言:歷史、安裝與用途

Angular 是一個強大且流行的開源前端 Web 應用程序框架&#xff0c;由 Google 開發并維護 1。它在現代 Web 開發中占據著重要的地位&#xff0c;尤其在構建動態、高效且可擴展的 Web 應用程序方面表現出色&#xff0c;特別適用于單頁應用程序 (SPA) 和復雜的用戶界面 1。本教程…