使用 Tiniest2D 制作 2D 游戏
导出和最佳实践
Lesson 11 of 11 • 10 XP
Keep your place in this quest
Log in or sign up for free to subscribe, follow lesson progress, and access more learning content.
导出您的游戏
- 点击顶部栏中的 导出 图标
- 选择游戏的保存位置和文件名
- 引擎创建一个独立的
.exe文件,其中嵌入了您的项目 - 分发此单一文件 - 不需要其他文件!
导出的游戏:
- 在没有编辑器界面的情况下运行
- 包含所有图像、场景和代码
- 经过加密以保护您的资产
提示和最佳实践
性能
- 保持图像大小合理(像素,不要高分辨率)
- 使用
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 - 制作游戏,而不是引擎。