На прошлых уроках мы научились создавать землю, персонажа, добавили несколько игровых объектов и создали смерть персонажа при соприкосновении с объектами( шипами). В принципе уже можно играть в нашу игру , но у нее нет цели т.е. цель есть — выжить, но хотелось бы чего то еще.
Добавим игровые монеты, которые персонаж будет собирать. Монеты будут создаваться на платформах, т.е. где будут платформы там и будут монеты, приступим.
Откроем наш проект и добавим изображение coins.png в папку lavel/images … далее откроем level.atlas и добавим это изображение в атлас.
Создадим новый объект Game object coint.go в папке Level и в этом объекте в окне Outline добавим sprite и укажем в окне Properties в строке image level.atlas и в Default Material изображение coin.
В coint.go добавим новый Collision object и Add Shape sphere, для того чтобы персонаж мог взаимодействовать с этим объектом.
У Collisionobject изменим Type на kinematic , в строке group напишем pickup и в mask напишем hero.
Откроем 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
Откроем 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 можете посетить официальный сайт и посмотреть обучающие материалы.
К этой игре вы можете добавить еще дополнительные объекты, счетчик монет уровень жизней и так далее. Портировать данную игру можно как на мобильные платформы (Androib,iOS и др.) так и на PC.
В эту игру можно поиграть здесь.
нормально беру