linux 游戏 复刻,用 PICO-8 复刻 Infinite Loop 游戏
前言
第一次使用 PICO-8 开发游戏,虽然跟 Unity3d,cocos2d 比起来 PICO-8实在是简陋,但是用起来却十分的令人着迷。8bit 复古风的 PICO-8 的限制十分的多,比如 128x128 的分辨率,只有 16 种颜色,可以使用的 sprite 和地图的大小也有限制。但是在这种限制下反而可以更简单的去考虑游戏本身的玩法,而且 PICO-8 的分享修改机制可以快速的修改他人的游戏,尝试不同的玩法。总之 PICO-8 是一个可以用来快速实现并检验游戏创意的游戏引擎,对于想尝试开发游戏的新手也十分友好,仅凭官方文档中的简单介绍就可以立刻上手。下面我就分享下开发过程,先上下游戏截图:
在线版本地址:
indienova PICO-8 在线玩:
使用其他代码编辑器
打开 PICO-8 未进入任何游戏之前是默认的空项目,点击 ESC 切换到编辑模式可以看到,代码 / sprite / map / 音效 / 音乐编辑器。
自带的编辑器只有大写使用起来十分不便,我采用自己的熟悉的编辑器(SublimeText)来进行代码编辑。
使用其他编辑器之前首先保存项目,ESC 切换到控制台下,使用 save loop.p8 命令进行保存文件。保存后我们可以在 PICO-8 目录中找到保存的 `loop.p8`文件,不同的系统的默认路径不同:Windows: C:/Users/Yourname/AppData/Roaming/pico-8/carts
OSX: /Users/Yourname/Library/Application Support/pico-8/carts
Linux:~/.lexaloffle/pico-8/carts
找到 p8文件后直接拖入想使用的文本编辑器即可,在外部编辑器编辑完成保存后切回 PICO-8后,使用 CTRL+R 刷新即可看到结果(但有的时候代码错误,会导致刷新没有效果,这时候回到控制台模式输入 load loop.p8 重新载入后再输入 run 命令重新运行)。
代码结构
PICO-8提供了3个特殊函数,只要代码中有这三个函数引擎会自动调用以完成游戏循环_update()
更新函数,以 30fps 的速度执行,即每 0.033s 执行一次
_draw()
绘制函数每次 update 执行一次
_init()
初始化函数,游戏启动时执行一次
结构十分简单,在 update 中处理用户输入等变量,在 draw 中根据变量进行绘制
绘制 cursor
我们需要一个 cursor 根据玩家输入进行移动,首先在 PICO-8的编辑模式中绘制 cursor。PICO-8中的 sprite 大小是 8x8 像素,我们需要的的 cursor 大小是 16x16,可以将上图红框中的范围拖到第二格,就可以直接绘制 16x16 的范围了。
绘制好了之后就可以在 _draw() 中使用了,PICO-8 提供了 spr 函数将 sprite sheet 中的图片绘制到游戏中,[ ]中的参数为可选参数:spr n x y [w h] [flip_x] [flip_y]
n: sprite 的序号,可以在编辑模式中查看
x y: 绘制到屏幕上的坐标
w h:绘制到屏幕上的宽高默认1 1
flip_x flip_y:水平/垂直方向是否翻转
spr 一次只能绘制一个 8x8 的 sprite 而光标是16x16 需要执行 4 次才可以绘制完成,好在还有另一个更方便的函数 ssprsspr sx sy sw sh dx dy [dw dh] [flip_x] [flip_y]
跟 spr 不同的是 sspr 不使用 sprite 序号定位,而是使用 sx sy sw sh ;这 4 个参数代表在 sprite sheet 中的 sprite 的 左上角坐标 x,y 和 sprite 的宽高,对于上图中的 cursor 这 4 个参数应该是 8,0,16,16;dx dy dw dh 是绘制到屏幕上的坐标,dw dh 不输入默认取 sw sh。
sx sy sw sh 这四个值是固定的,我们只需要根据用户输入在 update 中调整 dx dy 这两个值就可以移动 cursor 了。为了在 draw 和 update 都可以调用位置信息,用一个全局变量储存 cursor 的信息。cursor = {}
cursor.x = 0
cursor.y = 0
function _draw()
cls(1)
sspr(8,0,16,16,cursor.x*16,cursor.y*16)
end
function _update()
if btnp(0,0) then cursor.x -= 1 end
if btnp(1,0) then cursor.x += 1 end
if btnp(2,0) then cursor.y -= 1 end
if btnp(3,0) then cursor.y += 1 end
if cursor.x < 0 then cursor.x += 8 end
if cursor.x > 7 then cursor.x -= 8 end
if cursor.y < 0 then cursor.y += 8 end
if cursor.y > 7 then cursor.y -= 8 end
endcursor.x
cursor.y 存的不是坐标值,而是 cursor 当前所在格子的位置,这样每次移动 cursor 都会移动一格而不是一个像素。屏幕尺寸是 128x128 ,格子的大小也就是 cursor 的大小是 16x16 所以格子的尺寸应该是 8x8,x,y 取值 [0-7]。
_update 函数中使用 btnp 来获取被按下的按键,btnp 两个参数第一个参数是按钮代码,二个参数是玩家代码,取 0 就是第一个玩家。按键代码 0123 分别是左右上下。
当按钮按下时移动 cursor 的 x,y 当到达屏幕边缘时,比如 x<0 将其 +8 移动到最右边。
_draw 函数中首先调用 cls 函数清空屏幕以便重新绘制,cls 有一个可选参数表示使用指定颜色进行填充屏幕,从 16 个颜色中选。
使用同样的办法可以将游戏中的一个个旋转的图形绘制出来,这里遇到个问题,我没有找到旋转的函数。PICO-8 只提供了 flip_x
flip_y 进行翻转,有些旋转可以通过翻转代替,有些就没法做到了。所以有些图形我画了两个,这样就可以通过水平和垂直翻转实现 4 个方向旋转了。
关于游戏数据,我使用了 2 个数组,一个用来存图形的类型(一共 5 种)一个用来存储旋转方向,这两个数组长度都是 64(8*8)。关于游戏数据生成,如何判断胜利的算法,代码比较长这里就不多说了,可以直接看代码。点击上面的在线版链接,在 code 中可以直接看到,有 PICO-8 的朋友也可以在 splore 中找到 InfiniteLoop 下载下来编辑。
如果有感兴趣的朋友可以留言,我再单独写一篇日志。
游戏菜单
我们想在游戏开始前有一个开始菜单用来展示游戏玩法。当然可以在 _draw 函数中判断游戏是否开始,未开始则绘制开始菜单,开始就绘制游戏画面。还有一种更好的方法,使用一个全局变量存储绘制的函数,在同状态下对此变量重新赋值,这样就把游戏和开始菜单的绘制代码分到两个函数中,不会都挤在 _draw 中,影响代码的阅读。function draw_game()
end
function draw_menu()
end
function _init()
scn.draw = draw_menu
end
function _update()
if btnp(4,0) then
if scn.draw == draw_menu then
scn.draw = draw_game
end
end
end
function _draw()
cls(1)
scn.draw()
endLua 中函数可以赋值给变量
发布游戏
游戏制作好以后使用 run 运行游戏,在想做游戏封面的地方按下 F7进行截图;然后 ESC 到控制台模式,输入:save loop.p8.png
这时候就在 carts 目录里生成了一个 loop.p8.png 图片,这个类似游戏卡的神奇的图片就包含了游戏所有内容。将此图片提交到官网就可以在 splore 中找到你的游戏啦。简单几步就可以将游戏发布分享,供玩家欣赏或者修改。以下是官网游戏提交链接
linux 游戏 复刻,用 PICO-8 复刻 Infinite Loop 游戏相关推荐
- linux用独显运行steam,Steam使数以千计的Windows游戏可以在Linux上轻松玩
Steam使数以千计的Windows游戏可以在Linux上轻松玩 Mark Do 2018年9月5日 暂无评论 阅读 5,183 次 众所周知,Linux游戏库只是Windows游戏库中的一小部分.这 ...
- 基于Linux、QT、C++的“别踩白块儿”小游戏
基于Linux.QT.C++的"别踩白块儿"小游戏 源码链接 一.功能实现 完善的游戏界面.游戏倒计时.得分记录.历史最高分显示 二.功能描述 1.界面为4*4,一行中只有一个黑块 ...
- Linux 光盘刻录和windows光盘刻录不能兼容问题
国产电脑使用的是麒麟Linux,在当需要与windows系统进行文件交换的时候就会用到光盘刻录,但光盘刻录的时候往往会出现不能识别的问题,尤其是往光盘中添加文件的时候,遇到不能识别的的情况更多.所以有 ...
- 计算机自带游戏删掉还能装吗,电脑自带游戏删除后怎么恢复
Q1:电脑里自带的游戏全被我删除了,应该怎么才能恢复啊? 完全可以恢复 各个程序的项目位置: 空当接龙 %SystemRoot%\system32\freecell.exe 纸牌 %SystemRoo ...
- 游戏设计模式】之一 序言:架构,性能与游戏
转载自:https://blog.csdn.net/potato47/article/details/53463916 一.系列文章前言 承接<代码整洁之道>的精读与演绎,<Game ...
- python编程小游戏-python趣味入门——写几个常玩的游戏
文档介绍 利用python写"猜数字","猜词语","谁是卧底"这三个游戏,从而快速掌握python编程的入门知识,包括python语法/列 ...
- python编写一个弹球游戏_Python实战案例:用Python写一个弹球游戏,就是这么强
我们前面讲了几篇关于类的知识点,为了让大家更好的掌握类的概念,并灵活的运用这些知识,我写了一个有趣又好玩的弹球的游戏,一来可以把类的知识融会一下,二来加深对Python的兴趣.你会发现哎呀Python ...
- steam游戏开发_如何从Steam Cloud下载保存的游戏
steam游戏开发 Casimiro PT/Shutterstock卡西米罗PT /快门 Steam synchronizes many save files to its servers. They ...
- python简单小游戏代码-python基础练习之几个简单的游戏
文档介绍 利用python写"猜数字","猜词语","谁是卧底"这三个游戏,从而快速掌握python编程的入门知识,包括python语法/列 ...
最新文章
- WIN7添加loopback接口
- leetcode 38. 外观数列 「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。前五项如下
- 如何在同一台电脑上同时运行2个tomcat
- 超详综述 | 基于深度学习的命名实体识别
- git安装【Windows】
- c语言分组求和函数,R语言 实现data.frame 分组计数、求和等
- 从小一看到数字,脑子里就开始搞颜色......
- 利用jdk自带的运行监控工具JConsole观察分析Java程序的运行 Jtop
- Linux IO 测试工具 fio命令
- linux svn官网,linux svn
- mybatis plus使用
- 税务计算机 试题分析,税务师考试方式、题型、计算器使用规定
- php ziparchive 类不存在,php – 致命错误:类’ZipArchive’中找不到
- (附源码)基于springboot平衡膳食小程序 毕业设计 250859
- ERP系统更改颜色操作步骤
- c语言中如何找坐标,如何在C语言中找到四个坐标并擦除RubberBand矩形的绘图#
- 和开源硬件相关的几个词,免费、山寨、创客教育,以及未来 | COSCon'18
- 【转载】第三方支付业务如何测试
- java获取MP3文件信息(歌手,歌名,封面,专辑,时长)
- The type or namespace name 'Windows' does not exist in the namespace....
热门文章
- 为什么用于打游戏的计算机需要独立显卡,玩游戏,教给您一些购买独立显卡的注意事项...
- 系统hosts文件配置
- 1.9 日本蜡烛图技术之支撑和压力的其他含义
- c语言转本买iPad还是笔记本,对于考研党,是买个笔记本还是平板?简单分析一下!...
- 世界知名工会小D情况
- 线性正切制导 matlab编程实现,数学建模之MATLAB编程
- 异常检测中的三种异常:点异常、上下文异常、集合异常
- 第5天 结构体、文字显示与GDT/IDT初始化
- 【2019斯坦福CS224N笔记】(5)依存结构语法
- 姑娘,你为什么要编程呢