| 
				
				Почему не работает 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
 |  
| 
 | 
 |    |