Как добавить монеты в Defold Game Engine + видео

scrin Уроки

На прошлых уроках мы научились создавать землю, персонажа, добавили несколько игровых объектов  и создали смерть персонажа при соприкосновении с объектами( шипами). В принципе уже можно играть в нашу игру , но у нее нет цели т.е. цель есть — выжить, но хотелось бы чего то еще.

Добавим игровые монеты, которые персонаж будет собирать. Монеты будут создаваться на платформах, т.е. где будут платформы там и будут монеты, приступим.

Откроем наш проект и добавим изображение coins.png в папку lavel/images … далее откроем level.atlas и добавим это изображение в атлас.

Создадим новый объект Game object coint.go в папке Level и в этом объекте в окне Outline добавим sprite и укажем в окне Properties в строке image level.atlas и в Default Material изображение coin.

coint

В coint.go добавим новый Collision object и Add Shape sphere, для того чтобы персонаж мог взаимодействовать с этим объектом.

cointcollision

У Collisionobject изменим Type на kinematic , в строке group напишем pickup и в mask напишем hero.

cointtype

Откроем hero.go и добавим в окне Outline к colisionobject еще mask pickup.

В папке level создадим новый скрипт coin.script и напишем такой код:

function init(self)
self.collected = falseend function on_message(self, message_id, message, sender)
 if self.collected == false and message_id == hash("collision_response") then
   self.collected = true
      msg.post("#sprite", "disable")
   elseif message_id == hash("start_animation") then
       pos = go.get_position()
       go.animate(go.get_id(), "position.y", go.PLAYBACK_LOOP_PINGPONG, pos.y + 24, go.EASING_INOUTSINE, 0.75, message.delay)
  end
end

Добавим этот скрипт в coint.go Add component from file

coinscript

Откроем platform.go и добавим в окне Outline новый компонент Factory и в строке Prototype выберем coin.go.

Продублируем все это и для platform_long.go

Изменим скрипт Platform.script

function init(self)
  self.speed = 9;
   -- Default speed
  self.coins = {}end function final(self)
  for i,p in ipairs(self.coins) do
    go.delete(p)
  end
end
function update(self, dt)
  local pos = go.get_position()
   if pos.x < -500 then
     msg.post("/level/controller#script", "delete_spawn", { id = go.get_id() })
   end
  pos.x = pos.x - self.speed
   go.set_position(pos)end function create_coins(self, params)
   local spacing = 56
   local pos = go.get_position()
  local x = pos.x - params.coins * (spacing*0.5) - 24
   for i = 1, params.coins do
       local coin = factory.create("#coin_factory", vmath.vector3(x + i * spacing , pos.y + 64, 1))        msg.post(coin, "set_parent", { parent_id = go.get_id() })
       msg.post(coin, "start_animation", { delay = i/10 })
       table.insert(self.coins, coin)
  end
end
 function on_message(self, message_id, message, sender)
   if message_id == hash("set_speed") then
    self.speed = message.speed
   elseif message_id == hash("create_coins") then
     create_coins(self, message)
   end
end

Теперь над платформой будут появляться монеты и будут двигаться вместе с платформой.

Добавим несколько строк в controller.script, которые укажут сколько будет монет появляться на платформах и при каких условиях.

Таким образом общий скрипт controller будет выглядеть вот так:

go.property("speed", 6)local grid = 460
local platform_heights = { 100, 200, 350 }
local coins = 3
function init(self)
    msg.post("ground/controller#script", "set_speed", { speed = self.speed })
    self.gridw = 0
    self.spawns = {}
end
function update(self, dt)
    self.gridw = self.gridw + self.speed
    if self.gridw >= grid then
        self.gridw = 0
        -- Maybe spawn a platform at random height
        if math.random() > 0.2 then
          local h = platform_heights[math.random(#platform_heights)]
          local coins = coins
           local f = "#platform_factory"
          if math.random() > 0.5 then
              f = "#platform_long_factory"
               coins = coins * 2
                end
           local p = factory.create(f, vmath.vector3(1600, h, 0), nil, {}, 0.6)
            msg.post(p, "set_speed", { speed = self.speed })
           msg.post(p, "create_coins", { coins = coins })
         table.insert(self.spawns, p)
        end
   end
end
function on_message(self, message_id, message, sender)
    if message_id == hash("reset") then
        -- Tell the hero to reset.
        msg.post("hero#script", "reset")
       -- Delete all platforms
       for i,p in ipairs(self.spawns) do
           go.delete(p)
        end
       self.spawns = {}
   elseif message_id == hash("delete_spawn") then
       for i,p in ipairs(self.spawns) do
           if p == message.id then
               table.remove(self.spawns, i)
             go.delete(p)
           end
       end
    end
end

Можно запустить игру и проверить,

Defold-getting-started

Наши монеты появляются над платформами и удаляются при столкновении с персонажем.

На этом данную серию уроков можно завершить, если вы хотите продолжить обучение в игровом движке Defold можете посетить официальный сайт и посмотреть обучающие материалы.

К этой игре вы можете добавить еще дополнительные объекты, счетчик монет уровень жизней и так далее. Портировать данную игру можно как на мобильные платформы (Androib,iOS и др.) так и на PC.

В эту игру можно поиграть здесь.

Видео

Поделиться или сохранить к себе:
Технологичная помощь
Добавить комментарий

Нажимая на кнопку "Отправить комментарий", я даю согласие на обработку персональных данных, принимаю Политику конфиденциальности и условия Пользовательского соглашения.

  1. нормально беру

    Ответить