前言

第一次使用 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 游戏相关推荐

  1. linux用独显运行steam,Steam使数以千计的Windows游戏可以在Linux上轻松玩

    Steam使数以千计的Windows游戏可以在Linux上轻松玩 Mark Do 2018年9月5日 暂无评论 阅读 5,183 次 众所周知,Linux游戏库只是Windows游戏库中的一小部分.这 ...

  2. 基于Linux、QT、C++的“别踩白块儿”小游戏

    基于Linux.QT.C++的"别踩白块儿"小游戏 源码链接 一.功能实现 完善的游戏界面.游戏倒计时.得分记录.历史最高分显示 二.功能描述 1.界面为4*4,一行中只有一个黑块 ...

  3. Linux 光盘刻录和windows光盘刻录不能兼容问题

    国产电脑使用的是麒麟Linux,在当需要与windows系统进行文件交换的时候就会用到光盘刻录,但光盘刻录的时候往往会出现不能识别的问题,尤其是往光盘中添加文件的时候,遇到不能识别的的情况更多.所以有 ...

  4. 计算机自带游戏删掉还能装吗,电脑自带游戏删除后怎么恢复

    Q1:电脑里自带的游戏全被我删除了,应该怎么才能恢复啊? 完全可以恢复 各个程序的项目位置: 空当接龙 %SystemRoot%\system32\freecell.exe 纸牌 %SystemRoo ...

  5. 游戏设计模式】之一 序言:架构,性能与游戏

    转载自:https://blog.csdn.net/potato47/article/details/53463916 一.系列文章前言 承接<代码整洁之道>的精读与演绎,<Game ...

  6. python编程小游戏-python趣味入门——写几个常玩的游戏

    文档介绍 利用python写"猜数字","猜词语","谁是卧底"这三个游戏,从而快速掌握python编程的入门知识,包括python语法/列 ...

  7. python编写一个弹球游戏_Python实战案例:用Python写一个弹球游戏,就是这么强

    我们前面讲了几篇关于类的知识点,为了让大家更好的掌握类的概念,并灵活的运用这些知识,我写了一个有趣又好玩的弹球的游戏,一来可以把类的知识融会一下,二来加深对Python的兴趣.你会发现哎呀Python ...

  8. steam游戏开发_如何从Steam Cloud下载保存的游戏

    steam游戏开发 Casimiro PT/Shutterstock卡西米罗PT /快门 Steam synchronizes many save files to its servers. They ...

  9. python简单小游戏代码-python基础练习之几个简单的游戏

    文档介绍 利用python写"猜数字","猜词语","谁是卧底"这三个游戏,从而快速掌握python编程的入门知识,包括python语法/列 ...

最新文章

  1. WIN7添加loopback接口
  2. leetcode 38. 外观数列 「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。前五项如下
  3. 如何在同一台电脑上同时运行2个tomcat
  4. 超详综述 | 基于深度学习的命名实体识别
  5. git安装【Windows】
  6. c语言分组求和函数,R语言 实现data.frame 分组计数、求和等
  7. 从小一看到数字,脑子里就开始搞颜色......
  8. 利用jdk自带的运行监控工具JConsole观察分析Java程序的运行 Jtop
  9. Linux IO 测试工具 fio命令
  10. linux svn官网,linux svn
  11. mybatis plus使用
  12. 税务计算机 试题分析,税务师考试方式、题型、计算器使用规定
  13. php ziparchive 类不存在,php – 致命错误:类’ZipArchive’中找不到
  14. (附源码)基于springboot平衡膳食小程序 毕业设计 250859
  15. ERP系统更改颜色操作步骤
  16. c语言中如何找坐标,如何在C语言中找到四个坐标并擦除RubberBand矩形的绘图#
  17. 和开源硬件相关的几个词,免费、山寨、创客教育,以及未来 | COSCon'18
  18. 【转载】第三方支付业务如何测试
  19. java获取MP3文件信息(歌手,歌名,封面,专辑,时长)
  20. The type or namespace name 'Windows' does not exist in the namespace....

热门文章

  1. 为什么用于打游戏的计算机需要独立显卡,玩游戏,教给您一些购买独立显卡的注意事项...
  2. 系统hosts文件配置
  3. 1.9 日本蜡烛图技术之支撑和压力的其他含义
  4. c语言转本买iPad还是笔记本,对于考研党,是买个笔记本还是平板?简单分析一下!...
  5. 世界知名工会小D情况
  6. 线性正切制导 matlab编程实现,数学建模之MATLAB编程
  7. 异常检测中的三种异常:点异常、上下文异常、集合异常
  8. 第5天 结构体、文字显示与GDT/IDT初始化
  9. 【2019斯坦福CS224N笔记】(5)依存结构语法
  10. 姑娘,你为什么要编程呢