《Redirection》机器人街机自定义游戏制作指南
入门
在游玩《Redirection》的过程中,你会解锁各种小型街机游戏,可在机器人街机中游玩——机器人街机实际上是一台被重新编程为街机的机器人!本指南将教你如何编写自己的游戏磁盘,以便在机器人街机中游玩。
机器人街机游戏使用Lua编写。如果你不熟悉Lua,可以查看《15分钟学会Lua》指南,它是最容易上手的编程语言之一。
创建你的第一个游戏
1. 从主菜单中选择【模组编辑器】
2. 选择【新建】,并输入游戏名称(稍后可重命名)
3. 选择【打开模组文件夹】
4. 下载街机游戏模板将其提取到模组的资源文件夹中。返回主菜单,选择机器人街机,确认你的新游戏已出现在游戏列表中。编写你的游戏每个街机游戏由一个.disk文件描述,该文件描述一张软盘,并指向包含其内容的文件夹。每张磁盘都包含一个名为boot.lua的lua文件,其中包含机器人启动时运行的代码。一个非常简单的游戏如下:require "system"-- 获取我们需要的设备gpu = system.getDevice( "gpu" )gamepad = system.getDevice( "gamepad" )while true do-- 清屏gpu.clear( 0 )-- 绘制一些文本gpu.drawText( 0, 0, "HELLO WORLD" )if gamepad.getButton( 0 ) thengpu.drawText( 0, 6, "A键被按住" )end-- 休眠一帧system.play( sound[, channel] )
播放音频通道channel上的sound音效。若未指定通道,则会使用任意空闲通道。返回所选的音频通道,若没有可用通道则返回nil。音效通过包含以下键的表格来描述:
键描述默认值
frequency音效的起始频率,单位为赫兹必填
duration音效的持续时间,单位为秒必填
waveform音效的波形有效值为“square(方波)”“triangle(三角波)”“sawtooth(锯齿波)”和“noise(噪声)”
“square”
volume(音量)
声音的峰值音量,范围为0到11
attack(起音)
声音淡入所需的时间,单位为秒
0
decay(衰减)
声音淡出所需的时间,单位为秒
0
slide(滑音)
声音频率随时间变化的速率,单位为赫兹每秒
0
duty(占空比)
波形的占空比,范围为0到1。仅对方波产生影响。
0.5
speaker.queue( sound, channel )
在音频通道channel上播放声音sound,需等待当前声音及所有先前排队的声音播放完成后才开始。
speaker.stop( [channel] )
若指定了channel,则停止该通道上播放的所有声音。若未指定,则停止所有通道上的所有声音。发布你的游戏
当你对自己的游戏感到满意并准备好与全世界分享时,就可以将你的模组发布到Steam创意工坊了!但首先,请确保你已完成以下操作:
1. 为你的磁盘添加标签。方法是编辑模组资源中与.disk文件一同存放的.png图像。该标签将显示在游戏选择界面的软盘正面。
2. 为你的模组创建缩略图。缩略图需命名为thumbnail.png,尺寸为852x480,并放置在模组的根目录下。此缩略图将显示在Steam创意工坊中。
3. 如果你尚未完成,请接受Steam创意工坊贡献者协议。只有完成此步骤,其他用户才能看到你的模组!
完成上述步骤后,在模组编辑器中选择你的模组,然后点击【发布模组】按钮即可!留意你的模组的订阅者和评论,了解其他玩家对它的反馈。如果你在发布模组后对其进行了任何修改,只需再次点击【发布模组】来上传新版本。你的模组将自动为订阅者更新。
祝你玩得愉快!sleep(0)
end
你可以使用require函数和io库来访问磁盘上的其他文件。在机器人街机中,你随时可以按下Ctrl + R重启机器人并查看当前的更改。
要与显示器、扬声器或游戏手柄交互,只需调用相应设备对象的方法即可。一款典型的游戏会在每帧开始时检查输入,执行一些操作,然后在屏幕上绘制图形。有关可用方法的完整文档,请阅读下一节,或查看Steam创意工坊上的示例游戏。
设备使用说明
每台街机机器人都配备了一个单色显示器、一个简单的GPU、一个带2个音频通道的扬声器以及一个2轴2按钮游戏手柄。你可以在启动时调用system.getDevice(type)来访问这些设备,并对返回的对象调用方法。以下是它们最常用方法的概述:
游戏手柄方法
标准机器人游戏手柄有2个轴和2个按钮,你可以按如下方式访问它们的值:
gamepad.getButton(index)
返回游戏手柄上指定按钮当前是否被按住。0是A按钮,1是B按钮。
gamepad.getAxis(index)
返回游戏手柄上指定轴的值,范围为-1到1。0是X轴,1是Y轴。
显示方法
标准机器人显示器的分辨率为64x64黑白像素。它持有一个表示其当前屏幕内容的图像对象的引用,你可以使用GPU在该图像对象上进行绘制。
display.getImage()
返回当前显示在屏幕上的图像对象。可将此与gpu.setTarget()配合使用,以便在绘制到其他图像后恢复对屏幕的绘制。
display.setImage(image)
更改屏幕上显示的图像。图像的尺寸必须与屏幕分辨率相匹配。
GPU方法
标准机器人GPU包含硬件加速的2D绘制方法,用于写入图像。默认情况下,GPU会将屏幕图像作为目标,因此调用GPU方法会直接绘制到屏幕上。所有传入GPU绘制函数的位置均为整数像素坐标,左上角为0,0。所有传入GPU绘制函数的颜色均为整数颜色索引,其中0为黑色,1为白色。clear( [颜色] )
将GPU目标上的所有像素设置为指定颜色,未指定时则设为0。
gpu.drawPixel( x, y, 颜色 )
在坐标x、y处绘制单个像素。
gpu.drawLine( x1, y1, x2, y2, 颜色 )
在坐标x1、y1和x2、y2之间绘制一条线。
gpu.drawTriangle( x1, y1, x2, y2, x3, y3, 颜色 )
在坐标x1、y1,x2、y2和x3、y3之间绘制一个填充三角形。
gpu.drawTriangleOutline( x1, y1, x2, y2, x3, y3, 颜色 )
在坐标x1、y1,x2、y2和x3、y3之间绘制一个空心三角形。
gpu.drawBox( x1, y1, 宽度, 高度, 颜色 )
在坐标x1、y1处绘制一个宽度为指定像素、高度为指定像素的填充矩形。
gpu.drawBoxOutline( x1, y1, 宽度, 高度, 颜色 )
在坐标x1、y1处绘制一个宽度为指定像素、高度为指定像素的空心矩形。drawEllipse( x1, y1, width, height, color )
在坐标x1、y1处绘制一个填充的椭圆(或圆形),宽度为width像素,高度为height像素。
gpu.drawEllipseOutline( x1, y1, x2, y2, x3, y3, color )
在坐标x1、y1处绘制一个未填充的椭圆(或圆形),宽度为width像素,高度为height像素。
gpu.drawText( x, y, text )
在坐标x、y处绘制字符串text。
gpu.measureText( text )
返回字符串text的像素宽度和高度,不进行绘制。
gpu.newImage( width, height[, color] )
创建一个宽度为width像素、高度为height像素的空白图像,用color颜色填充,若未指定颜色则默认为0。
gpu.loadTGA( stream )
从输入输出流加载TGA文件,并返回创建的图像对象。流必须以rb模式打开,文件必须保存为索引颜色模式。以下代码将加载并绘制图像:
local image = gpu.loadTGA( io.open( "image.tga", "rb" ) )
gpu.drawImage( 0, 0, image )
gpu.drawImage( x, y, image )
在位置x,y处绘制图像image。
gpu.drawMap( x, y, map, tileset )
使用tileset图像中的瓦片图像,将图像map作为瓦片地图绘制在位置x,y处。对于map中的每个像素,会提取颜色索引,并从tileset中绘制对应的瓦片图像,tileset应为16x16大小相等的瓦片图像网格。这对于创建游戏关卡很有用。
gpu.setTarget( image )
将GPU目标设置为image,因此后续的绘制调用将写入此图像而不是显示器。调用gpu.setTarget( display.调用getImage()来重新定位显示。
gpu.setOffset(x, y)
使所有后续绘制调用在水平方向偏移x像素,垂直方向偏移y像素。调用gpu.setOffset(0, 0)可重置偏移。
gpu.mapColor(inColor, outColor)
使所有后续尝试绘制颜色inColor时,最终在GPU目标上绘制出outColor。调用gpu.mapColor(inColor, inColor)可重置映射。
gpu.setTransparentColor(color)
使所有后续尝试绘制颜色color(经重新映射后)时,目标像素保持不变。调用gpu.setTransparentColor(nil)可禁用透明度。
以下方法作用于GPU方法返回的图像对象:
image:getSize()
返回图像的宽度和高度(以像素为单位)。image:read( x, y[, length] )
若指定length参数,返回从坐标x,y开始的颜色值字符串;否则,返回该坐标处像素的颜色。
image:write( x, y, value )
若value为字符串,将字符串中的字节从坐标x,y开始写入图像;若value为数字,则设置该坐标处像素的颜色。
image:flipX()
image:flipY()
image:rotate90()
image:rotate180()
image:rotate270()
对图像进行翻转或旋转操作。
image:copy()
返回图像的副本。
image:sub( x, y, width, height )
返回表示图像子区域的新图像对象。
扬声器方法
标准机器人扬声器有2个音频通道,能够发出基本的音频波形。
speaker.