Game Maker - создание игр | HellRoom Games
Январь 15, 2025, 07:58:06 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   Game Maker Помощь Правила форума Поиск Календарь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: [Example:Easy]Псевдо 3D TDS автомобиль через изображение  (Прочитано 5948 раз)
0 Пользователей и 1 Гость смотрят эту тему.
VladTheCat
Немного
GM Pro user
*

Репутация: 145
Offline Offline

Пол: Мужской
Награды:
1000 сообщений!За постоянность! [100 дней на форуме]Настоящий игродел!
API: Love
Деятельность: Целая игростудия, состоящая из одного кота.
Сообщений: 1435



« : Март 09, 2013, 14:22:16 »

Привет всем. Это мой 2-й пример для Love2D на этом сайте. Он показывает, как можно сделать игру с псевдо 3D графикой, без использования моделей или кучи кадров анимации для каждой позиции предмета.

Что нам нужно для начала: Изображение, содержащее несколько кадров - стрип. Они чаще используются для анимаций, но тут они будут использоваться в качестве слоев изображения. Я по-быстрому нарисовал машину. Вот что вышло:

файл я назвал carStrip.png

Да, не особо то понятно, что здесь творится, но я объясню - это стрип, состоящий из 7 кадров-слоев снизу вверх. Каждый кадр - 32x32. и между ними нет лишних пикселей. Поэтому картинка выглядит так странно.

Теперь приступим к кодингу. Первое, что нам нужно сделать - создать объект машины, и загрузить изображение:
Код:
function love.load()
        love.graphics.setBackgroundColor(30, 30, 30) -- Просто меняем цвет фона :]
car = {}
car.angle = 0
car.x = 400
car.y = 300
car.img = love.graphics.newImage('carStrip.png') -- Загружаем наш стрип
end

car.angle нам нужен для того, чтобы во время просмотра мы могли вращать машину и осмотреть её со всех сторон. Далее, нужно записать каждый кадр в отдельную переменную. Но это будет гов*окод. Поэтому создадим таблицу и в неё запишем все кадры, и в этом нам поможет love.graphics.newQuad(x, y, w, h, sw, sh). Эта функция записывает в переменную кусок изображения, определенный координатами x, y и шириной с высотой w, h. sw и sh - размеры исходного изображения. Тут можно задать вопрос: почему нет аргумента, определяющего само исходное изображение? Ответ простой: quad - не изображение, а просто координаты на изображении (как координаты текстуры в d3d_vertex_texture). Использование этой функции можно сравнить с созданием текстур паков для Minecraft.
Более коротким и понятным языком - один quad можно использовать для нескольких изображений.

Добавляем в конец love.load:
Код:
for i = 0, 6 do
car.frames[i] = love.graphics.newQuad(i * 32, 0, 32, 32, 224, 32) -- Записываем кадры с помощью цикла
end

В love.update нет ничего важного - только вращение машины. Сразу напишем это, чтобы в конце уделить время основной части примера:
Код:
function love.update(dt)
        if love.keyboard.isDown('left') then
       car.angle = car.angle - math.rad(90) * dt
        elseif love.keyboard.isDown('right') then
car.angle = car.angle + math.rad(90) * dt
end
end

Теперь основная часть нашего примера - рисование машины послойно. Рисовать надо снизу вверх, чтобы наложение слоев было правильным:
Код:
function love.draw()
for i = 0, 6 do
love.graphics.drawq(car.img, car.frames[i], car.x, car.y - i, car.angle, 1, 1, 16, 16)
end
end
Тут используется не love.graphics.draw, а drawq, которая рисует часть изображения, определенную quad'ом, который мы создали вначале.
Можно запускать. Но с таким маленьким изображением эффект будет не особо хорошо виден. Можно увеличить все в 2 раза. Для этого заменяем аргументы love.graphics.drawq, для увеличенного изображения:
Код:
love.graphics.drawq(car.img, car.frames[i], car.x, car.y - i * 2, car.angle, 2, 2, 16, 16)
И вот что у нас вышло:


Как всегда, вы можете скачать .love пример
Всем спасибо за внимание  

Добавлено: Март 09, 2013, 14:27:37
Хочу добавить: Если собираетесь рисовать подобные изображения - лучше подготовьте пару заготовок с видом сбоку, сверху, спереди, для правильности послойного изображения  
Записан


Будьте вежливы: Вам помогли? Не забудьте поставить плюс. А то банда злобных апельсинов придет за вами. И даже тех. поддержка вам не поможет. :3

Когда я что-то пишу в "<>", то это значит, что содержимое надо заменить на свое значение.
Slavik
GM Pro user
*

Репутация: 106
Offline Offline

Пол: Мужской
Награды:
За постоянность! [100 дней на форуме]За создание истории чата!
API: Unity 3D
Сообщений: 498



« Ответ #1 : Март 12, 2013, 21:34:07 »

В Love не работаю, но это вроде как гениально.
Записан

Иногда, если есть настроение, пишу музло для игр, не дорого.
Писать сюда: https://vk.com/dmitry.ibragimov
Не особо жду.
zede
Участник
****

Репутация: 24
Offline Offline

Пол: Мужской
API: Game Maker 8.0 Pro
Деятельность: С++ фанатик
Сообщений: 137



« Ответ #2 : Март 18, 2013, 18:06:49 »

Где то видел похожий пример на GML, но здесь как-то лаконичней
+(как раз основы изучаю)
Записан

Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

HellRoom Games © 2006-2012 All Rights Reserved
Powered by SMF 1.1.21 | SMF © 2013, Simple Machines
Страница сгенерирована за 0.063 секунд. Запросов: 29.