Defold. Создание персонажа.

Defold. Создание персонажа.

Как создать персонажа в Defold Game Engine.

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

Подготовка.

Откроем предыдущий проект в Defold и начнем. Первым делом нужно импортировать изображения героя (они находятся в архиве в прошлом уроке). Из этих изображений мы будем делать анимированного героя (Лягушку), поэтому их получается много.
В окне Project Explorer нажмите правой кнопкой мыши и создайте новую папку New- Folder и назовите ее Hero.

folder
В папке создайте новый файл atlas hero.atlas и новую папку images

heroatlas
Перетащите все изображения героя в папку imajes

imajehero
Откройте hero.atlas и в окне Outline добавьте все эти изображения в атлас Add images

addimages

imajeitog
Далее, добавим скелет персонажа, он находится так же в архиве с ресурсами под названием hero.json. Перенесите этот файл в папку hero.

Этот файл поможет нам создать скелет персонажа и его анимацию. Добавим в папку hero еще один файл spinescene New-Spine Scene File , этот файл поможет нам связать скелет с текстурами.

spinescene
В файле hero.spinescene в строке spine_json выберете hero.json и в строке atlas, hero.atlas.

spinesceneadd

И не забываем сохранять наши сцены и атласы.

Создание объекта персонажа.

Подготовка файлов для персонажа закончена, теперь займемся созданием самого персонажа (игрового объекта)
Добавим в папку hero новый файл Add — New Game Object

herogo
Откройте hero.go и в окне Outline добавьте новый компонент Add Component Spine Model

spinemodel
И в строке spine csene, в окне Properties выберете наш hero.spinescene, в строке Defauit Animation выберете анимацию run_right.

spinesceneanim

В окне Outline добавьте новый component Collison Obgect и к нему добавьте объект Add Shape.
Выберем Sphere и Box для создания физики нашему персонажу.

addshape
Выберете объект сферу и для свободного перемещения его по сцене нажмите на панели меню Scene -Move Tool
Разместим объекты так, чтобы сфера была на голове персонажа а куб на туловище.

collisonpers
Выберете файл collisionobject и в окне Properties в строке Type выберете kinematic, в строке Group напишите hero и в строке mask geometry

kinematik
Скрипт движения.

Создадим скрипт, который будет отвечать за движение персонажа
В папке hero New -Script File.

heroscript
Удалим все из скрипта и добавим такой код

-- gravity pulling the player down in pixel units/sˆ2
local gravity = -20

-- take-off speed when jumping in pixel units/s
local jump_takeoff_speed = 900

function init(self)
    -- this tells the engine to send input to on_input() in this script
    msg.post(".", "acquire_input_focus")

    -- save the starting position
    self.position = go.get_position()

    -- keep track of movement vector and if there is ground contact
    self.velocity = vmath.vector3(0, 0, 0)
    self.ground_contact = false
end

function final(self)
    -- Return input focus when the object is deleted
    msg.post(".", "release_input_focus")
end

function update(self, dt)
    local gravity = vmath.vector3(0, gravity, 0)

    if not self.ground_contact then
        -- Apply gravity if there no ground contact
        self.velocity = self.velocity + gravity
    end

    -- apply velocity to the player character
    go.set_position(go.get_position() + self.velocity * dt)

    -- reset volatile state
    self.correction = vmath.vector3()
    self.ground_contact = false
end

local function handle_geometry_contact(self, normal, distance) 
    -- project the correction vector onto the contact normal
    -- (the correction vector is the 0-vector for the first contact point)
    local proj = vmath.dot(self.correction, normal)
    -- calculate the compensation we need to make for this contact point
    local comp = (distance - proj) * normal
    -- add it to the correction vector
    self.correction = self.correction + comp
    -- apply the compensation to the player character
    go.set_position(go.get_position() + comp)
    -- check if the normal points enough up to consider the player standing on the ground
    -- (0.7 is roughly equal to 45 degrees deviation from pure vertical direction)
    if normal.y > 0.7 then
        self.ground_contact = true
    end
    -- project the velocity onto the normal
    proj = vmath.dot(self.velocity, normal)
    -- if the projection is negative, it means that some of the velocity points towards the contact point
    if proj < 0 then -- remove that component in that case self.velocity = self.velocity - proj * normal end end function on_message(self, message_id, message, sender) if message_id == hash("contact_point_response") then -- check if we received a contact point message. One message for each contact point if message.group == hash("geometry") then handle_geometry_contact(self, message.normal, message.distance) end end end local function jump(self) -- only allow jump from ground if self.ground_contact then -- set take-off speed self.velocity.y = jump_takeoff_speed end end local function abort_jump(self) -- cut the jump short if we are still going up if self.velocity.y > 0 then
        -- scale down the upwards speed
        self.velocity.y = self.velocity.y * 0.5
    end
end

function on_input(self, action_id, action)
    if action_id == hash("jump") or action_id == hash("touch") then
        if action.pressed then
            jump(self)
        elseif action.released then
            abort_jump(self)
        end
    end
end

Данный скрипт будет отвечать за скорость, движение персонажа, соприкосновение со объектами и прыжки.
Вернемся в hero.go и добавим скрипт к персонажу, нажмите правой кнопкой на Game Object в окне Outline и выберете Add Component From File.

heroscriptadd
Настроим действие прыжка для ПК (пробел) и для сенсорных экранов (прикосновение). В Project Explorer в папке input откройте game.input_building

gaimbuid

и настройте key_trigger и touch_trigger (по нажатию правой кнопкой мыши по функции add key trigger, изменить action на jump и touch и в input выбрать KEY_SPACE и TOUCH_MULTI)

gaimbuid2
Теперь, если запустить игру наш персонаж пролетит сквозь землю, поэтому нужно добавить коллизию к нашим блокам земли.

К папке main добавим новый компонент New- File Collection.

level
И откроем его. В окне Outline добавим нашу ground.collection Add Collection From File

levelground
и нашего персонажа Add Game Object File hero.go

levelinmain
Сохраним все изменения и откроем main.collection, изменим ground.collection на level.collection

Создадим в папке main еще один скрипт controller

go.property("speed", 6) 

function init(self)
    msg.post("ground/controller#script", "set_speed", { speed = self.speed })
end

Откроем level.collection и добавим в окне Outline новый объект controller Add Game Object (изменить id на controller)

controller
И к нему добавим скрипт controller.script Add Component From File.
Этот скрипт будет контролировать все что касается этого уровня, в дальнейшем появление препятствий, появление монет, но пока только скорость движения земли.
Откроем скрипт ground и добавим

function on_message(self, message_id, message, sender)
    if message_id == hash("set_speed") then 
        self.speed = message.speed 
    end
end

т.к. скрипт controller обращается к этой функции.

Ну и непосредственно добавление самой коллизии.

Откроем ground.collection и добавим к controller новый объект Сollision Object.

collisionground
К этому объекту добавим Add Share — Box и настроим его примерно так, как на скриншоте…

boxcollider
У collisionobject измените Type на Static и так же Group geometry и mask hero.

groundcolission

И вот теперь можно запустить игру Project -Build and lauch.

playerprig

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

На главную


Оставить Комментарий