制作一款打飞机游戏22:表格导出
编辑器功能扩展
今天,我想让编辑器能够处理一个数组,这是编辑器将要编辑的东西,它只编辑数组。这些区域在后续的不同版本的编辑器中会有不同的含义,但现在我想创建一个模板,能够加载一个二维数组,并将二维数组写回文件。
好吧,让我们马上开始。首先,我想把一个数组放到我们的东西里面,就像这样:0, 1, 2, 3,这些只是一些数字。这里有个小问题,这是一个字符串,里面包含了一些数字,我们将使用split
函数将它拆分成一个数组。我觉得这样更好,尽管我们也可以直接放一个数组在这里,但这是不可行的。
关于导入功能,有一个重要的事情我没有提到,那就是这并不能绕过令牌限制。当你把这个文本文件的内容粘贴到你的 PICO-8 卡上时,你会失去那些令牌。如果现在选择这个,它显示是0个令牌,但一旦执行并且测试内容等于某些东西,你就会支付那些令牌。如果代码超过了令牌限制(比如8100个令牌),那么你的卡就不会运行。
所以,我不能把所有的令牌密集型的东西都放到一个文本文件中然后导入,那样是行不通的。有其他方法可以做到这一点,但不是这种方法。
实现细节与优化
无论如何,我们在这个文本文件里的东西最好已经是令牌优化过的,尤其是因为这里有很多数据。所以,我们想保存一个字符串,然后把它拆分成一个数组。但如果我们这样做,我们需要对导入的数据运行split
函数,为什么不直接把这个split
写在我们的文本文件里呢?
好吧,我来保存这个并看看会发生什么。现在,我们不能再把这个数据打印到屏幕上了,因为现在这个数据在我们的文本文件里是一个数组,我们不能直接打印它。现在我们需要做的是遍历这些数据,我们可以通过一个循环来实现,比如for i = 1, #data do
,然后使用bgprint(datai])
来打印每个数据。
但是,问题是我们把所有的数字都画在了同一个地方,所以我们需要让它们稍微下移一点。我们可以这样做:y = 2 + 7 * i
,这样随着我们在屏幕上绘制下一个项目,y值就会增加。现在我们有了一个像表格一样的项目列表,很好。
接下来,我们在PICO-8(或Lua)中有一个技巧,如果你运行一个函数,而这个函数只接受一个字符串作为参数,你可以省略引号和括号。这也会执行,我们将利用这一点。
导出功能实现
现在,我想实现导出功能。稍后我们将为多维数组实现导出功能,但现在我想先写一个简化版的,为一维数组实现导出功能。为此,我想做一些小的改动。比如,我们想要编辑器能够处理不同的变量名,但内部的变量名应该始终保持不变。
所以,我想创建一个地方,你可以自定义编辑器来编辑不同类型的数据。我想在文本文件中保存要写入的文件名,以及从哪个文件名写入。但是,include
语句不接受变量,你必须拼写出文件名,比如include "text.txt"
,我们不能这样做。所以,我们需要在文本文件中保存要写入的文件名,这样我们的导出函数就可以使用它。
我们还想有一个叫data
的变量,我们将把这个变量设置为test
,在这个例子中,test
是我们从文件中获取的变量。每次在编辑器中工作时,我们都会使用这个data
变量。
现在,让我们去实现导出功能。我们肯定要保留这个print()
语句,我们只是想编辑这个局部变量s
。我们想把所有的数据格式化成字符串,然后把它写入s
,再把s
写出来。
哦,对了,我们还需要在字符串中包含数组的名字,因为导出时需要知道应该把哪个数组写入导出文件。
接下来,我们要遍历所有的数据,并把它们写入字符串。我们可以使用与在屏幕上打印数据相同的逻辑。但是,我们还需要在数字之间添加逗号,而且最后一个数字后面不应该有逗号。我们可以通过在添加数字之前检查是否是第一个数字来解决这个问题。
现在,我们保存并运行它,看看是否有效。我们需要找一种方法把调试代码从我们的主程序中引入到这里,这样我们就可以调试导出功能是否工作正常。但现在,我们先看看记事本是否有任何变化。看起来没有变化,这实际上是件好事,因为如果我们没有对底层数据进行任何更改,我们希望代码导出的是相同的东西。
现在,这个导出功能已经可以使用一维数组了。接下来,我想让它能够处理二维数组。为此,我们需要添加一些东西,我想复制粘贴我们的split2d
函数到这里。这个函数很重要,因为它将把一个字符串拆分成二维数组,就像我们在主程序中做的那样。
我们要使用split2d
函数,并用管道符|
来分隔数据。现在,我们要把数据绘制到屏幕上,所以我们需要一个嵌套的循环。但是,我们之前遇到的问题是所有的数字都重叠在一起,所以我们需要添加一些偏移量来让它们分开显示。
现在,我们需要实现二维数组的导出功能。这基本上与一维数组的导出相同,但我们需要在数组之间插入管道符|
,在数组内的元素之间插入逗号。而且,我们需要确保第一个数组和每个数组的第一个元素前面没有额外的分隔符。
现在,我们保存并导出数据,看看是否一切正常。看起来一切正常,数据已经成功导出。现在,我想看看这是否能与我们实际的数据一起工作,所以我把之前的一些数组数据复制粘贴到这里,并进行了一些小的调整。现在,我们可以运行它,看看是否能成功导入和导出这些数据。
看起来一切正常,数据已经成功导入和导出。现在,我们可以把这个编辑器集成到我们的工作流程中。我们有一个完整的导入导出循环,现在我想开始着手编辑器的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={}_drw=draw_table_upd=update_tablemenuitem(1,"export",export)reload(0x0,0x0,0x2000,"cowshmup.p8")
endfunction _draw()_drw()-- debug --cursor(4,4)color(8)for txt in all(debug) doprint(txt)end
endfunction _update60()_upd()
end
-->8
--drawfunction draw_table()cls(2)--spr(0,0,0,16,16)for i=1,#data dofor j=1,#data[i] dobgprint(data[i][j],2+18*j,2+8*i,7)endend
end
-->8
--updatefunction update_table()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
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,"test.txt",true)debug[1]="exported!"
end
__gfx__
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00700700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00077000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00077000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00700700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
相关文章:

制作一款打飞机游戏22:表格导出
编辑器功能扩展 今天,我想让编辑器能够处理一个数组,这是编辑器将要编辑的东西,它只编辑数组。这些区域在后续的不同版本的编辑器中会有不同的含义,但现在我想创建一个模板,能够加载一个二维数组,并将二维…...

Linux内核源码结构
目录 Linux内核源码结构 Linux内核版本命名 Linux内核版本选择 内核源码结构 arch:与CPU架构相关的源代码 block:磁盘设备的支持 COPYING文件 CREDITS文件 crypto:加密相关 Documentation: drivers:设备驱动 firmware:固件 fs:文件系统 include:头文件…...

72.评论日记
【巫师】中美关税战02:应给人民爆装备,以及普通人如何应对(7条建议)_哔哩哔哩_bilibili 2025年4月26日11:03:31...
在springboot项目中,如何进行excel表格的导入导出功能?
以下是使用 Apache POI 和 EasyExcel 实现 Excel 表格导入导出功能的具体代码示例。 1. 使用 Apache POI 实现 Excel 导入导出 添加依赖 在 pom.xml 中添加 Apache POI 的依赖: <dependency><groupId>org.apache.poi</groupId><artifactId…...

Websocket自动发送消息客户端工具
点击下载《Websocket自动发送消息客户端工具》 1. 前言 在现代网络应用中,实时通信和即时数据传输变得越来越重要。WebSocket作为一种全双工通信协议,因其高效、实时的特点,被广泛应用于聊天应用、实时数据监控、在线游戏等领域。然而&…...

STM32的开发环境介绍
目录 STM32软件环境 Keil软件在线安装 其他软件环境安装 STM32开发的几种方式 STM32寄存器版本和库函数版本 标准外设库的作用: STM32软件环境 STM32 的集成开发环境(IDE):编辑编译软件 常见的环境: (1)KEIL&a…...

数据库系统概论(四)关系操作,关系完整性与关系代数
数据库系统概论(四)详细讲解关系操作,关系完整性与关系代数 前言一、什么是关系操作1.1 基本的关系操作1.2 关系数据语言的分类有哪些 二、关系的完整性2.1 实体完整性2.2 参照完整性2.3 用户的定义完整性 三、关系代数是什么3.1 传统的集合运…...

基于 IPMI + Kickstart + Jenkins 的 OS 自动化安装
Author:Arsen Date:2025/04/26 目录 环境要求实现步骤自定义 ISO安装 ipmitool安装 NFS定义 ks.cfg安装 HTTP编写 Pipeline 功能验证 环境要求 目标服务器支持 IPMI / Redfish 远程管理(如 DELL iDRAC、HPE iLO、华为 iBMC)&…...
【AI提示词】财务顾问
提示说明 财务顾问是一个专注于帮助个人和企业优化财务状况、制定财务计划并实现财务目标的专业人士。 提示词 # Role: 财务顾问## Profile - language: 中文 - description: 财务顾问是一个专注于帮助个人和企业优化财务状况、制定财务计划并实现财务目标的专业人士。 - ba…...

使用 Node、Express 和 MongoDB 构建一个项目工程
本文将详细介绍如何使用 Node.js Express MongoDB 构建一个完整的 RESTful API 后端项目,涵盖: 项目初始化 Express 服务器搭建 MongoDB 数据库连接 REST API 设计(CRUD 操作) 错误处理与中间件 源码结构与完整代码 部署建…...

【C++11】右值引用和移动语义:万字总结
📝前言: 这篇文章我们来讲讲右值引用和移动语义 🎬个人简介:努力学习ing 📋个人专栏:C学习笔记 🎀CSDN主页 愚润求学 🌄其他专栏:C语言入门基础,python入门基…...
【滑动窗口+哈希表/数组记录】Leetcode 3. 无重复字符的最长子串
题目要求 给定一个字符串 s,找出其中不含有重复字符的最长子串的长度。 子字符串是字符串中连续非空字符序列。 示例 1 输入:s "abcabcbb" 输出:3 解释:无重复字符的最长子串是 "abc",长度为…...
pytest 技术总结
目录 一 pytest的安装: 二 pytest有三种启动方式: 三 用例规则: 四 配置框架: 一 pytest的安装: pip install pytest # 安装 pip install pytest -U # 升级到最新版 二 pytest有三种启动方式: 1…...
java中的Selector详解
Selector(选择器)是Java NIO(非阻塞I/O)的核心组件,用于实现I/O多路复用,允许单个线程管理多个通道(Channel),从而高效处理高并发场景。 一、Selector的核心概念与作用 I/O多路复用 Selector通过事件驱动机制,监听多个通道的就绪状态(如可读、可写、连接建立等),无…...
DeepSeek 的长上下文扩展机制
DeepSeek 在基础预训练完成后,引入 YaRN(Yet another RoPE extensioN method)技术,通过额外的训练阶段将模型的上下文窗口从默认的 4K 逐步扩展至 128K。整个过程分为两个阶段:第一阶段将上下文窗口从 4K 扩展到 32K;第二阶段则进一步从 32K 扩展到 128K。每个阶段均采用…...
【修复】Django收到请求报Json解析错误
Django收到请求报Json解析错误 场景分析解决 场景 在使用Postman发送Django的请求时,只能使用原来的json内容,如果修改json内容则会报json解析上的错误 分析 可能是有对请求内容的长度做了上报校验 解决 最终在请求头Headers里找到了Content-Length…...
openEuler对比CentOS的核心优势分析
openEuler对比CentOS的核心优势分析 在开源操作系统领域,openEuler与CentOS均占据重要地位,但随着CentOS维护策略的调整(如CentOS 8停止维护,转向CentOS Stream),越来越多的用户开始关注国产化替代方案。o…...

Python基于Django的全国二手房可视化分析系统【附源码】
博主介绍:✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&…...

VulnHub-DC-2靶机渗透教程
VulnHub-DC-2靶机渗透教程 1.靶机部署 [Onepanda] Mik1ysomething 靶机下载:https://download.vulnhub.com/dc/DC-2.zip 直接使用VMware导入打开就行 2.信息收集 2.1 获取靶机ip(arp-scan/nmap) arp-scan -l nmap 192.168.135.0/24 2.2 详细信息扫描(nmap)…...

n8n 中文系列教程_10. 解析n8n中的AI节点:从基础使用到高级Agent开发
在自动化工作流中集成AI能力已成为提升效率的关键。n8n通过内置的LangChain节点,让开发者无需复杂代码即可快速接入GPT-4、Claude等大模型,实现文本处理、智能决策等高级功能。本文将深入解析n8n的AI节点体系,从基础的Basic LLM Chain到强大的…...
Jest 快照测试
以下是关于 Jest 快照测试的系统化知识总结,从基础使用到底层原理全面覆盖: 一、快照测试核心原理 1. 工作机制三阶段 #mermaid-svg-GC46t2NBvGv7RF0M {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GC46t2NBvGv…...
Linux内核参数调优(TCP BBR算法实践)
Linux 内核参数调优中 TCP BBR 算法的深度实践指南,包含原理说明、操作步骤、性能验证及生产环境注意事项: 一、BBR 算法原理 核心思想 基于拥塞状态而非丢包:传统 CUBIC 算法依赖丢包判断拥塞,BBR 通过测量带宽 (Bandwidth) 和 RTT (Round-Trip Time) 动态调整发送速率。…...

计算机网络 | 应用层(1)--应用层协议原理
💓个人主页:mooridy 💓专栏地址:《计算机网络:自定向下方法》 大纲式阅读笔记 关注我🌹,和我一起学习更多计算机的知识 🔝🔝🔝 目录 1. 应用层协议原理 1.1 …...

MuJoCo 关节角速度记录与可视化,监控机械臂运动状态
视频讲解: MuJoCo 关节角速度记录与可视化,监控机械臂运动状态 代码仓库:GitHub - LitchiCheng/mujoco-learning 关节空间的轨迹优化,实际上是对于角速度起到加减速规划的控制,故一般来说具有该效果的速度变化会显得丝…...
精益数据分析(27/126):剖析用户价值与商业模式拼图
精益数据分析(27/126):剖析用户价值与商业模式拼图 在创业和数据分析的领域中,每一次深入学习都是一次成长的契机。今天,我们继续秉持共同进步的理念,深入研读《精益数据分析》,剖析用户价值的…...
Neo4j 常用查询语句
Neo4j 常用查询语句 Neo4j 是一个图数据库,查询语言是 Cypher,它类似于 SQL 但针对图形数据进行了优化。Cypher 语法直观易懂,适合用来处理图数据。本文将介绍一些 Neo4j 中常用的查询语句,帮助你快速掌握图数据的操作方法。 一…...

LVGL模拟器:NXP GUIDER+VSCODE
1. 下载安装包 NXP GUIDER:GUI Guider | NXP 半导体 CMAKE:Download CMake MINGW:https://github.com/niXman/mingw-builds-binaries/releases SDL2:https://github.com/libsdl-org/SDL/releases/tag/release-2.30.8 VSCODE&…...

《USB技术应用与开发》第四讲:实现USB鼠标
一、标准鼠标分析 1.1简介 1.2页面显示 其中页面显示的“”不用管它,因为鼠标作为物理抓包,里面有时候会抓到一些错误,不一定是真正的通讯错误,很可能是本身线路接触质量不好等原因才打印出来的“”。 1.3按下鼠标左键 &#x…...

一、鸿蒙编译篇
一、下载源码和编译 https://blog.csdn.net/xusiwei1236/article/details/142675221 https://blog.csdn.net/xiaolizibie/article/details/146375750 https://forums.openharmony.cn/forum.php?modviewthread&tid897 repo init -u https://gitee.com/openharmony/mani…...
DataStreamAPI实践原理——计算模型
引入 Apache Flink 是一个框架和分布式处理引擎,用于在 无边界 和 有边界 数据流上进行有状态的计 算。Flink 能在所有常见集群环境中运行,并能以内存速度和任意规模进行计算。Flink可以处理批数据也可以处理流数据,本质上,流处理…...