КРОК 8 - Скидання рівня


Якщо ви спробуєте гру зараз, швидко стає очевидним, що механізм скидання не працює. Перезапуск героя добре, але ви можете легко перейти до ситуації, коли ви відразу потрапляєте на край платформи і знову помрете. Що ми хочемо зробити, це правильно скинути весь рівень на смерть. Оскільки рівень - це всього лише серія порожніх платформ,
нам просто потрібно відстежувати всі створені платформи, а потім видалити їх при перезавантаженні:
  1. Відкрийте файл controller.script і відредагуйте код, щоб зберегти ідентифікатор: із усіх накопичених платформ:
    -- controller.script
    go.property("speed", 360)
    
    local grid = 460
    local platform_heights = { 100, 200, 350 }
    
    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 * dt
    
        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 f = "#platform_factory"
                if math.random() > 0.5 then
                    f = "#platform_long_factory"
                end
    
                local p = factory.create(f, vmath.vector3(1600, h, 0), nil, {}, 0.6)
                msg.post(p, "set_speed", { speed = self.speed })
                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
    
    1. Ми використовуємо таблицю для зберігання всіх порожніх платформ
    2. Повідомлення "reset" видаляє всі платформи, збережені в таблиці
    3. Повідомлення "delete_spawn" видаляє певну платформу та вилучає її з таблиці
    4. Зберегти файл.

    5. Відкрийте platform.script і змініть його, щоб замість того, щоб просто видалити платформу, яка досягла лівого краю,
    6. надішліть на контролер рівня запит на видалення платформи:
  2. -- platform.script
    ...
    if pos.x < -500 then
        msg.post("/level/controller#script", "delete_spawn", { id = go.get_id() })
    end
    ...
    
    Insert platform code
  3. Зберегти файл.

    Відкритий герой.спис. Тепер останнє, що нам потрібно зробити - це вказати рівень для скидання. Ми перемістили повідомлення з проханням героя скинути скрипт контролера рівня. Це має сенс централізувати контроль скидання, як це, тому що це дозволяє нам, наприклад, запровадити більш тривалий послідовність смертей з більшою легкістю:
-- hero.script
...
go.animate(".", "position.y", go.PLAYBACK_ONCE_FORWARD, go.get_position().y - 200, go.EASING_INSINE, 0.5, 0.2,
    function()
        msg.post("controller#script", "reset")
    end)
...
Insert hero code
І тепер основна петля перезавантаження - вимирає!

Наступне - щось жити: монети!

Немає коментарів:

Дописати коментар

Kоментарі неуkраїнсьkою видалятимуться