Почему не работает motion_set() (РЕШЕНО)
|
|
GameMakerBeginner | Дата: Среда, 15 Апреля 2020, 14:46 | Сообщение # 1 |
был не раз
Сейчас нет на сайте
| И снова надо обратиться на форум. Решил поработать с такими интересными штучками, как direction и speed. Сколько инфы не читай, а нигде толком не написано, как это работает. В общем, есть у меня объект Candle (без физики). Я хочу, чтобы он двигался, например со скоростью 5 в направлении 290. Не понятно почему, команда motion_set(dir, speed) не работает, хотя в ней всё, что мне нужно. Решил попробовать move_towards_point(x,y,speed). Опять же: пошёл я на фиг, ничего не робит. Уже и физику объекту дал, всё равно. Может у меня объект дефективный или что? Подскажите, пожалуйста
Сообщение отредактировал GameMakerBeginner - Суббота, 18 Апреля 2020, 02:52 |
|
| |
UNIT02_GAMES | Дата: Четверг, 16 Апреля 2020, 08:51 | Сообщение # 2 |
частый гость
Сейчас нет на сайте
| GameMakerBeginner, трудно сказать, что ты делаешь не так, потому что нет подробностей.
Как например делаю я в своей игре:
В Create: friction = 0.5; // Трение, по простому говоря, нужно что бы объект мог останавливаться.
В Step:
"Тут на примере кнопка W, но ты сделаешь так как тебе нужно. Правда вместо motion_set, я использую motion_add. Мне так удобней"
if keyboard_check(ord('W')) { motion_add(290,5); // Направление 290 и скорость 5 }
speed = min(speed,5); // Ограничиваем скорость, иначе она будет постоянно увеличиваться.
///
|
|
| |
GameMakerBeginner | Дата: Суббота, 18 Апреля 2020, 02:51 | Сообщение # 3 |
был не раз
Сейчас нет на сайте
| Короче, я полазил по глубине ваших интернетов и выяснил, что такие команды, как move_towards_point, motion_add, motion_set не будут работать при включенной в комнате физике. Это весь печально, потому что GMS 2 не может предложить вам ничего взамен этого. Тут я опустил руки. Но в моей голове ещё остался школьный курс тригонометрии и я могу даже поделиться своими наработками (вот инструкция) : 1) создаём скрипт phy_move_direction 2) внутри мы записываем вот это (все вычисления основаны на тригонометрии и проверены мной):
Код if(argument0%90!=0) {
if(argument0<=180) a = 180 - argument0; else a = argument0 - 180;
xpos = argument1/ sqrt((1/sqr(dcos(a)))-2*dsin(a));
ypos = dtan(a) * xpos;
if(argument0>90 and argument0<270 ) phy_speed_x = -xpos; else phy_speed_x=xpos; if(argument0>90 and argument0<270) { if(argument0 < 180) phy_speed_y = -ypos; else phy_speed_y= ypos;} else { if(argument0 < 180) phy_speed_y = ypos; else phy_speed_y= -ypos;}
}
else {
if(argument0==90) {phy_speed_y=-argument1;} if(argument0==0) {phy_speed_x=argument1;} if(argument0==270) {phy_speed_y=argument1;} if(argument0==180) {phy_speed_x=-argument1;}
}
3) Чтобы вызвать команду, её надо запускать в событиях объекта, который вы собрались двигать (не забываем включить физику у объекта и в комнате) 4) как вы поняли, в скобках должно быть два аргумента: первый - это ваш угол движения, второй - это ваша скорость (теорема Пифагора, сложение phy_speed_x и phy_speed_y) 5) Если есть вопросы, спрашивайте 6) И ещё мне интересно, можно ли сделать легче. Напишите команду, которая делает это же с физическим объектом и вы услышите взрыв моего бензобака.
|
|
| |
Raven84 | Дата: Понедельник, 20 Апреля 2020, 12:15 | Сообщение # 4 |
старожил
Сейчас нет на сайте
| GameMakerBeginner, чего-то ты там намудрил через чур! Для начала просто находим угол между двумя объектами:
Код ang=point_direction(phy_position_x,phy_position_y,Hero.phy_position_x,Hero.phy_position_y)
А потом в событии шага (Step) меняем координаты x и y:
Код phy_position_x+=lengthdir_x(f,ang) phy_position_y+=lengthdir_y(f,ang)
, где f - это необходимая тебе скорость в пикселях.
Все! Тут три строчки кода достаточно. Пользуйся!
Super Knight Story (в разработке) Idolzzz - игра доступна в Steam и Play Market Oliver's Adventures in the Fairyland
|
|
| |