Создание 2D-игр с Tiniest2D
Экспорт и лучшие практики
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) // Установить пиксель по адресу (5,5) на кадре 0
var color = getPixel(img, 0, 5, 5) // Получить [r,g,b,a] по адресу (5,5)
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("READY", 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 - Создавайте игры, а не движки.