Масштабирование collisionobject

Всё по учебнику. Есть фабрика прототипом для которой служит Game Object состоящий из спрайта и collisionobject.

function init(self)
	msg.post(“.”, “acquire_input_focus”)
 	self.id = {{},{},{},{}}
 	for i = 1, 2 do
  		for j = 1, 2 do
   			self.id\[i\]\[j\] = factory.create(“/pole#bone_factory”, vmath.vector3(50\**i, 80*\*j, 0))
   			msg.post(self.id\[i\]\[j\], “set_blok”, {variant = 66})
   			msg.post(self.id\[i\]\[j\], “set_blok”, {scale=vmath.vector3(0.1,0.1,1)})
  		end
 	end
end

В скрипте объекта функция принимающая настройки отображения.

function on_message(self, message_id, message, sender)
    if message_id == hash(“set_blok”) then
        if message.variant then
              local frame = string.format(“%02d”, message.variant)
              sprite.play_flipbook(“#sprite”, hash(frame))
		end
        if message.scale then
            go.set_scale(message.scale)
        end
	end
end

Размер объекта задаётся в 10% от умолчания - {scale=vmath.vector3(0.1,0.1,1)}

Методом тыка выяснил, что это уменьшение ни как не влияет на collisionobject. Оно по прежнему 100% размера и занимает пол экрана хотя спрайт послушно уменьшается. Кто с таким сталкивался и как выходили из положения?

1 Like

А что за учебник, можно ссылку на него?

Не так выразился. Имелись в виду примеры с defold.com. Просто задачка начального уровня, а что то не пошло.

Я в своей практике ещё не задавался вопросами по изменению размера collision_object
Если скинешь ссылку на конкретный пример, я постараюсь тебе помочь ещё лучше.

Насколько мне известно, в Defold нельзя изменять в коде размер игрового объекта.
Если только передать как аргумент через фабрику при создании объекта.
Или просто создать в игровом объекте несколько collision_object, а затем их менять по мере необходимости.

function init(self)
    msg.post(".", "acquire_input_focus")
    self.id = {{}, {}, {}, {}}
    local scale = vmath.vector3(0.1, 0.1, 0.1)  -- Uniform по всем осям
    for i = 1, 2 do
        for j = 1, 2 do
            -- Передаём scale как 5-й параметр: factory.create(url, position, rotation, properties, scale)
            self.id[i][j] = factory.create("/pole#bone_factory", vmath.vector3(50 * i, 80 * j, 0), nil, nil, scale)
            msg.post(self.id[i][j], "set_blok", {variant = 66})  -- Только variant, без scale
        end
    end
end
function on_message(self, message_id, message, sender)
    if message_id == hash("set_blok") then
        if message.variant then
            local frame = string.format("%02d", message.variant)
            sprite.play_flipbook("#sprite", hash(frame))
        end
        -- Убираем go.set_scale — оно теперь устанавливается в фабрике  
    end
end
-- установка параметров капсулы
local capsule_data = {
  type = physics.SHAPE_TYPE_CAPSULE,
  diameter = 10,
  height = 20,
}
physics.set_shape("#collisionobject", "my_capsule_shape", capsule_data)



-- установка параметров сферы
local sphere_data = {
  type = physics.SHAPE_TYPE_SPHERE,
  diameter = 10,
}
physics.set_shape("#collisionobject", "my_sphere_shape", sphere_data)

-- установка параметров коробки
local box_data = {
  type = physics.SHAPE_TYPE_BOX,
  dimensions = vmath.vector3(10, 10, 5),
}
physics.set_shape("#collisionobject", "my_box_shape", box_data)

Также, можно попробовать изменить размер формы столкновения:

-- установка параметров капсулы
local capsule_data = {
  type = physics.SHAPE_TYPE_CAPSULE,
  diameter = 10,
  height = 20,
}
physics.set_shape("#collisionobject", "my_capsule_shape", capsule_data)

-- установка параметров сферы
local sphere_data = {
  type = physics.SHAPE_TYPE_SPHERE,
  diameter = 10,
}
physics.set_shape("#collisionobject", "my_sphere_shape", sphere_data)

-- установка параметров коробки
local box_data = {
  type = physics.SHAPE_TYPE_BOX,
  dimensions = vmath.vector3(10, 10, 5),
}
physics.set_shape("#collisionobject", "my_box_shape", box_data)

P.S если я смог тебе помочь, дай знать :folded_hands:

Специально выносил скале в отдельное сообщение. Лично мне так было удобнее и код , на мой взгляд, более читабельный. Может быть в полном варианте передачи фабрике всех параметров за раз всё будет работать более корректно. Возможно позже проверю.

Рассчитывать и менять в скрипте размеры collisionobject… В принципе это можно автоматизировать через локальные функции если вдруг очень понадобится, но такое решение выглядит как костыль. На данный момент я убрал в своём проекте уменьшение объекта через скале и промассштабировал всю сцену через камеру.

Пост изначально создал не сколько для помощи сколько для обсуждения тонкостей программирования в Defold и не логичность его поведения при изменении размера игрового объекта. А ещё для того что бы сэкономить кому то время и предупредить о граблях на которые я наступил =). Сообщения от триггеров шли совершенно хаотично при попытках уменьшить игровой объект..

Догадывался о существование длинного обходного пути ( изменять отдельно размер игрового объекта и отдельно изменять привязанный к нему collisionobject), но надеялся что есть более простой. На данный момент в своём проекте я просто не использую изменения размеров игровых объектов через код.

1 Like

Спасибо, что решил внести свой вклад в развитие форума. Я это ценю.
Если что, есть чат титанов по Defold, там сидят разработчики, с большим стажем чем я (новичок).