Keep your place in this quest

Log in or sign up for free to subscribe, follow lesson progress, and access more learning content.

导出您的游戏

  1. 点击顶部栏中的 导出 图标
  2. 选择游戏的保存位置和文件名
  3. 引擎创建一个独立的 .exe 文件,其中嵌入了您的项目
  4. 分发此单一文件 - 不需要其他文件!

导出的游戏:

  • 在没有编辑器界面的情况下运行
  • 包含所有图像、场景和代码
  • 经过加密以保护您的资产

提示和最佳实践

性能

  • 保持图像大小合理(像素,不要高分辨率)
  • 使用 removeObject() 删除不再需要的对象
  • 使用图层组织渲染顺序

组织

  • 给对象和图像命名有意义的名称
  • 使用注释记录您的代码
  • 将相关变量分组在一起

调试

  • 使用 print() 输出变量值
  • 打印信息出现在游戏窗口中
  • 如果对象穿过墙壁,检查碰撞类型

常见问题

对象未碰撞:

  • 检查碰撞类型(两个对象都需要适当的类型)
  • 确保对象已添加到场景中
  • 验证精灵已启用碰撞体

对象穿过墙壁:

  • 墙壁应为 COLLISION_STATIC()
  • 移动对象应为 COLLISION_DYNAMIC()
  • 很快的对象可能会穿透 - 降低速度或增加碰撞边界

相机未跟随玩家:

  • onUpdate() 中更新相机位置,而不仅仅是在 start()
  • 记住,相机位置是视图的中心

快速参考卡

// 创建资产
var img = Sprite(16, 16)
var scene = Scene()
var sfx = Audio()
var obj = Object("Name")

// 对象操作
setX(obj, 100)
setY(obj, 100)
setSprite(obj, img)
setCollisionType(obj, COLLISION_DYNAMIC())
addObject(scene, obj)

// 精灵操作
fillSprite(img, 255, 0, 0, 255)  // 填充为红色
setPixel(img, 0, 5, 5, 0, 255, 0, 255)  // 在帧 0 的 (5,5) 设置像素
var color = getPixel(img, 0, 5, 5)      // 获取 (5,5) 的 [r,g,b,a]
setAnimationFPS(img, 24)         // 设置动画速度
var fps = getAnimationFPS(img)   // 获取动画速度

// 物理(速度 + 重力)
setGravityY(scene, 300)         // 设置场景重力
setVelocityX(obj, 100)          // 向右移动
setVelocityY(obj, -200)         // 向上跳

// 动画控制
setFrame(obj, 0)           // 设置为特定帧
var frame = getFrame(obj)  // 获取当前帧
var count = getFrameCount(obj)  // 总帧数

// 场景控制
setScene(scene)
resetScene(scene)
setBackgroundColor(scene, 135, 206, 235)  // 天空蓝

// 场景查询
var obj = getObjectAt(scene, mx, my)       // 指定点的对象
var hits = getObjectsInBox(scene, x, y, 32, 32)  // 区域内的对象
var enemy = getObjectByName(scene, "enemy")     // 根据名称查找
var all = getAllObjects(scene)             // 获取所有对象
var count = getObjectCount(scene)          // 计数对象
var coins = getObjectsBySprite(scene, coinSprite)  // 按精灵
var enemies = getObjectsByCollisionType(scene, COLLISION_DYNAMIC())

// 音频
var handle = playAudio(sfx)
if (isAudioPlaying(handle)) { }
stopAudio(handle)

// 相机(位置 = 视图中心)
setCameraX(scene, x)
setCameraY(scene, y)
setCameraZoom(scene, 3.0)  // 垂直显示 240 世界单位

// 屏幕和坐标转换
var w = getScreenWidth()
var h = getScreenHeight()
var worldPos = screenToWorld(mouseX, mouseY)  // [worldX, worldY]
var screenPos = worldToScreen(objX, objY)     // [screenX, screenY]

// 窗口模式(仅影响导出游戏)
setWindowMode(WINDOW_MAXIMIZED())  // 默认
setWindowMode(WINDOW_FULLSCREEN()) // 无边框全屏
setWindowMode(WINDOW_WINDOWED())   // 常规窗口

// 键盘输入
if (isKeyPressed(KEY_SPACE())) { }
if (isKeyHeld(KEY_LEFT())) { }

// 鼠标输入
if (isMouseButtonPressed(MOUSE_LEFT())) { }
var mx = getMouseX()
var my = getMouseY()

// 随机数和数学
var r = random()              // 0.0 到 1.0
var n = randomInt(1, 10)      // 1 到 10
var x = clamp(14, 0, 10)      // 10
var y = lerp(0, 100, 0.5)     // 50
var snapped = round(15.7)     // 16
var dir = sign(-8)            // -1
var power = pow(2, 3)         // 8
var angle = PI() / 2          // 1.5708... 弧度
var bob = sin(angle)          // 三角函数使用弧度
var deg = rad2deg(angle)      // 90 度

// UI 样式栈
uiPushElementColor(28, 40, 70, 220)
uiPushFontColor(255, 220, 120)
uiLabel("准备好", 4, 4)
uiPopFontColor()
uiPopElementColor()

// 存储(保存/加载游戏数据)
var data = [100, "Player", true]
save(getAppDataPath() + "/MyGame/save.dat", data)
var loaded = load(getAppDataPath() + "/MyGame/save.dat")
if (fileExists(getAppDataPath() + "/MyGame/save.dat")) { }
deleteFile(getAppDataPath() + "/MyGame/old.dat")

// 游戏控制
quitGame()  // 退出游戏

// 游戏循环
func start() { }
func onUpdate(dt) { }
func onCollision(a, b) { }
func end() { }

Tiniest 2D Pixel Engine - 制作游戏,而不是引擎。