《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.




换一换 























