Пятница, 19 Апреля 2024, 16:37

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Форум игроделов » Конструкторы игр и лёгкие в освоении системы разработки игр » Game Maker » GMS 2 TDS Неправильный полет пули. (Немного не понимаю в чем дело.)
GMS 2 TDS Неправильный полет пули.
trespass91Дата: Среда, 24 Июня 2020, 12:43 | Сообщение # 1
был не раз
Сейчас нет на сайте
Привет,форумчане.Есть такой код в Step объекта башни танка:
Код
//Вычисление точки вылета пули из дула
var dir = point_direction(x , y , mouse_x , mouse_y );
var x_offset = lengthdir_x(81, dir);
var y_offset = lengthdir_y(81, dir);

if (mouse_check_button(mb_left))
{
if (canshoot = false)
{
canshoot = true
instance_create_layer(x + x_offset, y + y_offset, "bullets", obj_bullet)
alarm[0] = room_speed * 1;
audio_play_sound(sound_tank_shot, 1, 0);
}
if (mouse_x = obj_tank.x) && (mouse_y = obj_tank.y)
{
canshoot = true;
    
}
}


Тут определяется точка вылета пули из дула и скорострельность.Но если я наведу мышью на танк,пули летят в обратном направлении или летят до курсора мыши и разворачиваются в обратном направлении.Как это исправить можно?Я пытался задать условие,что,когда мышь находится по координатам танка игрока,возвращается вот эта штука canshoot = true;
Но видимо,что-то я делаю не так.


Нуб из нубов даже в GML.
JAMPERДата: Среда, 24 Июня 2020, 12:59 | Сообщение # 2
почетный гость
Сейчас нет на сайте
trespass91, я предполагаю, что проблема возникает именно в объекте obj_bullet. Какой код отвечает за ее перемещение?

Zombie Day --- "Без шансов"
Space Conflict --- игра на Gamiron #8
Kill your brain --- игра на Gamiron #10
Eat them all!--- игра на Gamiron #12
Supr_maksДата: Среда, 24 Июня 2020, 13:41 | Сообщение # 3
частый гость
Сейчас нет на сайте
Можно сделать так чтобы пуля появлялась в центре и двигалась к курсору? Так будет казаться что пуля вылетела из дула и ненужен бессмысленные вычисления которые нагружают твой пк.

У всех в душе пустота...
trespass91Дата: Среда, 24 Июня 2020, 13:44 | Сообщение # 4
был не раз
Сейчас нет на сайте
Цитата JAMPER ()
trespass91, я предполагаю, что проблема возникает именно в объекте obj_bullet. Какой код отвечает за ее перемещение?


в Create у объекта Bullet:
Код
bullet_speed = 10;
move_towards_point(mouse_x, mouse_y,bullet_speed);
image_angle = direction;


Добавлено (24 Июня 2020, 13:46)
---------------------------------------------
Цитата Supr_maks ()
Можно сделать так чтобы пуля появлялась в центре и двигалась к курсору? Так будет казаться что пуля вылетела из дула и ненужен бессмысленные вычисления которые нагружают твой пк.

Я так делал,но если активно вертеть башней танка,то легко можно увидеть,что пуля идет не из дула а из центра объекта танк.Тем более,если танк в движении находится.Совсем не смотрится это.

Добавлено (24 Июня 2020, 14:52)
---------------------------------------------
Пришла внезапно мысль:наверное можно ограничить мышь,минимальный радиус вокруг игрока указать и максимальный заодно,чтобы нельзя было целиться на весь экран.Надо почитать про это.Полюбому должно помочь.


Нуб из нубов даже в GML.

Сообщение отредактировал trespass91 - Среда, 24 Июня 2020, 13:57
Supr_maksДата: Среда, 24 Июня 2020, 15:43 | Сообщение # 5
частый гость
Сейчас нет на сайте
Цитата trespass91 ()
Я так делал,но если активно вертеть башней танка,то легко можно увидеть,что пуля идет не из дула а из центра объекта танк.Тем более,если танк в движении находится.Совсем не смотрится это.

Так сделай так чтобы пока пуля соприкасается с танком\башней направление пули меняется. Тогда будет всё ок


У всех в душе пустота...
MagicHeroДата: Среда, 24 Июня 2020, 20:14 | Сообщение # 6
участник
Сейчас нет на сайте
У тебя пуля летит по координатам мыши что и приводит к всем проблемам ( полет назад, не из дула) нужно просто в момент нажатия на мышь производить появление объекта пули в конце ствола и движение по прямой с углом на который в момент нажатия было повернуто дуло танка. А если пуля ни во что не врежется то уничтожать ее, как только выйдет за пределы комнаты т.к. иначе она будет лететь бесконечно за пределами вида.

Сообщение отредактировал MagicHero - Среда, 24 Июня 2020, 20:17
trespass91Дата: Среда, 24 Июня 2020, 23:32 | Сообщение # 7
был не раз
Сейчас нет на сайте
Ясно,спасибо за наводку.Буду пытаться сделать все это.

Добавлено (25 Июня 2020, 03:52)
---------------------------------------------

Цитата MagicHero ()
У тебя пуля летит по координатам мыши что и приводит к всем проблемам ( полет назад, не из дула) нужно просто в момент нажатия на мышь производить появление объекта пули в конце ствола и движение по прямой с углом на который в момент нажатия было повернуто дуло танка. А если пуля ни во что не врежется то уничтожать ее, как только выйдет за пределы комнаты т.к. иначе она будет лететь бесконечно за пределами вида.


Не подскажешь примерно,где копать?Это связано просто с координатами или тут фигурирует lengthdir и direction,image_angle?


Нуб из нубов даже в GML.
MagicHeroДата: Четверг, 25 Июня 2020, 19:03 | Сообщение # 8
участник
Сейчас нет на сайте
var x_offset = lengthdir_x(81, dir);
var y_offset = lengthdir_y(81, dir);

Я так понял что у тебя длина пушки 81 (либо ты брал чуть меньше чтобы снаряд вылетал из ствола), dir это угол поворота твоей пушки т.е. direction.
Хотя я в своей игре точку на окружности находил так:
x_temp=x+radius*dsin(direction);
y_temp=y+radius*dcos(direction);
Но сути этого не меняет.
В общем при нажатие на мышку, создаешь снаряд по координатам
Код
var x_offset = lengthdir_x(81, dir);
var y_offset = lengthdir_y(81, dir);


где 81 это длина твоего дула а dir это direction (угол наклона) твоего дула.
Код
var temp=instance_create_depth(x_offset,y_offset,depth,obj_bullet);    // делаем временный temp, которому присваеваем ID созданного обьекта чтобы можно было передать ему данные
with (temp) {   // with применяется чтобы код выполнялся непосредственно для прописанного в нем обьекта.
      speed=10;  // скорость полета снаряда
      direction=имя_обьекта_башни.dir; // угол наклона
      image_angle=direction;  // чтобы снаряд был повернут в сторону полета
}


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

depth (глубина) нужно сделать больше чем у дула, чтобы снаряд появился под дулом.
obj_bullet так назвал обьект пулю.

В самой пуле не забудь прописать instance_destroy(); в add_event --- Other --- Outside Room чтобы уничтожить пулю за пределами комнаты если она ни в кого не врежется.


Сообщение отредактировал MagicHero - Четверг, 25 Июня 2020, 19:05
trespass91Дата: Пятница, 26 Июня 2020, 08:51 | Сообщение # 9
был не раз
Сейчас нет на сайте
Цитата MagicHero ()
var x_offset = lengthdir_x(81, dir);
var y_offset = lengthdir_y(81, dir);

Я так понял что у тебя длина пушки 81 (либо ты брал чуть меньше чтобы снаряд вылетал из ствола), dir это угол поворота твоей пушки т.е. direction.
Хотя я в своей игре точку на окружности находил так:
x_temp=x+radius*dsin(direction);
y_temp=y+radius*dcos(direction);
Но сути этого не меняет.
В общем при нажатие на мышку, создаешь снаряд по координатам
Код
var x_offset = lengthdir_x(81, dir);
var y_offset = lengthdir_y(81, dir);

где 81 это длина твоего дула а dir это direction (угол наклона) твоего дула.
Код
var temp=instance_create_depth(x_offset,y_offset,depth,obj_bullet); // делаем временный temp, которому присваеваем ID созданного обьекта чтобы можно было передать ему данные
with (temp) { // with применяется чтобы код выполнялся непосредственно для прописанного в нем обьекта.
speed=10; // скорость полета снаряда
direction=имя_обьекта_башни.dir; // угол наклона
image_angle=direction; // чтобы снаряд был повернут в сторону полета
}

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

depth (глубина) нужно сделать больше чем у дула, чтобы снаряд появился под дулом.
obj_bullet так назвал обьект пулю.

В самой пуле не забудь прописать instance_destroy(); в add_event --- Other --- Outside Room чтобы уничтожить пулю за пределами комнаты если она ни в кого не врежется.


Спасибо за помощь и что подробно все расписал.Сейчас все это прпробую проделать и перечитать код несколько раз для понимания.

Добавлено (26 Июня 2020, 09:17)
---------------------------------------------
Эх,вот в этой строке не дает переменную "dir" поставить:
direction=имя_обьекта_башни.dir;
Пишет переменная "dir" использована лишь однажды.Причем если просто после задания этой переменной ниже строкой ее написать,она без проблем определяется.


Нуб из нубов даже в GML.

Сообщение отредактировал trespass91 - Пятница, 26 Июня 2020, 09:23
MagicHeroДата: Пятница, 26 Июня 2020, 13:31 | Сообщение # 10
участник
Сейчас нет на сайте
dir это direction (угол поворота) спрайта башни твоего танка. Я ее не знаю, но т.к. ты указывал ее я посчитал что dir это переменная угла наклона башни. А так тебе везде надо тогда dir заменить на переменную угла поворота башни танка. Если ее нет, например ты указывал image_angle для башни напрямую то используй вместо dir, имя_обьекта_башни.image_angle Можно записать это так, перед кодом как начнёшь использовать dir:

Код
var dir=имя_обьекта_башни.image_angle;  // создаем временную переменную dir которая = углу повората башни танка.

//потом

var x_offset = lengthdir_x(81, dir);
var y_offset = lengthdir_y(81, dir);

//Тут пояснение, т.к. выше код необходимо делать именно в коде обьекта башни, т.е. я полагаю что все подготовки для выстрела происходят в коде обьекта башни. Если это не так то надо писать так, добавив текущие координаты башни танка:

var x_offset = имя_обьекта_башни.x+lengthdir_x(81, dir);
var y_offset = имя_обьекта_башни.y+lengthdir_y(81, dir);

var temp=instance_create_depth(x_offset,y_offset,depth,obj_bullet);    // делаем временный temp, которому присваеваем ID созданного обьекта чтобы можно было передать ему данные
with (temp) {   // with применяется чтобы код выполнялся непосредственно для прописанного в нем обьекта.
      speed=10;  // скорость полета снаряда
      direction=имя_обьекта_в_котором_создаем_код.dir; // имя_обьекта_в_котором_создаем_код необходимо т.к. выше применяем with и все переменные указываются для обьекта пуля либо можно заменить на имя_обьекта_башни.image_angle
      image_angle=direction;  // чтобы снаряд был повернут в сторону полета
}


Сообщение отредактировал MagicHero - Пятница, 26 Июня 2020, 13:43
trespass91Дата: Пятница, 26 Июня 2020, 13:42 | Сообщение # 11
был не раз
Сейчас нет на сайте
Цитата MagicHero ()
dir это direction (угол поворота) спрайта башни твоего танка. Я ее не знаю, но т.к. ты указывал ее я посчитал что dir это переменная угла наклона башни. А так тебе везде надо тогда dir заменить на переменную угла поворота башни танка. Если ее нет, например ты указывал image_angle для башни напрямую то используй вместо dir, имя_обьекта_башни.image_angle Можно записать это так, перед кодом как начнёшь использовать dir:

var dir=

Вас понял.Вроде смотрел и переменная эта была.Буду дальше смотреть.


Нуб из нубов даже в GML.
MagicHeroДата: Пятница, 26 Июня 2020, 13:45 | Сообщение # 12
участник
Сейчас нет на сайте
Цитата trespass91 ()
Вас понял.Вроде смотрел и переменная эта была.Буду дальше смотреть.

Я не успел дописать, сохранил т.к. неудобно было писать на планшете, чтобы закончить на компе. Выше посмотри там дописал текст )
trespass91Дата: Пятница, 26 Июня 2020, 13:48 | Сообщение # 13
был не раз
Сейчас нет на сайте
Цитата MagicHero ()
dir это direction (угол поворота) спрайта башни твоего танка. Я ее не знаю, но т.к. ты указывал ее я посчитал что dir это переменная угла наклона башни. А так тебе везде надо тогда dir заменить на переменную угла поворота башни танка. Если ее нет, например ты указывал image_angle для башни напрямую то используй вместо dir, имя_обьекта_башни.image_angle Можно записать это так, перед кодом как начнёшь использовать dir:

var dir=

Целиком мой коды выглядит так:
в Step у объекта башни танка
Код
var dir = point_direction(x , y , mouse_x , mouse_y );// -3 выравнивание пули по оси y.
if (mouse_check_button(mb_left))
{
    if (canshoot = false)//тут выставлял паузу между выстрелами,ну и ниже звук выстрела.Думаю никак влиять не должно на код в целом.
    {
    canshoot = true
    var x_offset = lengthdir_x(83, dir);
    var y_offset = lengthdir_y(83, dir);
    var temp = instance_create_depth(x + x_offset, y + y_offset, 1, obj_bullet);
    with (temp)
    {
    speed = 5;
    direction = obj_tank_cannon.image_angle;
    }
    alarm[0] = room_speed * shoot_delay;
    audio_play_sound(sound_tank_shot, 1, 0);
    }

Добавлено (26 Июня 2020, 13:49)
---------------------------------------------
Но в целом это работает,но не совсем.Пуля позиционируется нормально,до тех пор пока я не наведу на сам танк и не нажму ЛКМ.Пуля летит верно из дула,но при этом спрайт разворачивается в противоположную сторону,то есть летит как бы задом.

Добавлено (26 Июня 2020, 14:03)
---------------------------------------------
Ага.кажись я фиксанул это дело.Теперь работает как надо.
В Create объекта пуля прописал:

Код
image_angle = obj_tank_cannon.image_angle;

Такие дела.Спасибо за советы.


Нуб из нубов даже в GML.
MagicHeroДата: Пятница, 26 Июня 2020, 14:14 | Сообщение # 14
участник
Сейчас нет на сайте
Цитата trespass91 ()
var dir = point_direction(x , y , mouse_x , mouse_y );

Это ты находишь угол относительно танка(башни) ? т.е. x и y это координаты башни? я не знаю равны ли у тебя координаты основания танка и башни, но если не равны то в коде var dir = point_direction(x , y , mouse_x , mouse_y ); нужно указывать именно координаты башни танка. И согласно ниже коду выходит что башня у тебя поворачивается мгновенно и всегда смотрит туда куда направлена мышь, т.к. ничего для плавного поворота башни к координатам мыши в коде нет.

Цитата trespass91 ()
var temp = instance_create_depth(x + x_offset, y + y_offset, 1, obj_bullet);

x и y как выше писал это должны быть координаты башни танка.

Цитата trespass91 ()
Пуля летит верно из дула,но при этом спрайт разворачивается в противоположную сторону,то есть летит как бы задом.

ты не прописал image_angle в этом коде

{
speed = 5;
direction = obj_tank_cannon.image_angle;
image_angle = obj_tank_cannon.image_angle; // добавить
}

Вдобавок полю нужно правильно нарисовать а именно по направлению direction 0 т.е. горизонтально слева-направо (слева-зад, справа-перед)


Сообщение отредактировал MagicHero - Пятница, 26 Июня 2020, 14:17
trespass91Дата: Пятница, 26 Июня 2020, 14:35 | Сообщение # 15
был не раз
Сейчас нет на сайте
MagicHero, для плавного поворота такой код у меня:
Код
pointdir = point_direction (x, y, mouse_x, mouse_y);//Плавное вращение башни танка.
image_angle += sin(degtorad(pointdir - image_angle)) * aim_speed;

Добавлено (26 Июня 2020, 14:37)
---------------------------------------------

Цитата MagicHero ()
Вдобавок полю нужно правильно нарисовать а именно по направлению direction 0 т.е. горизонтально слева-направо (слева-зад, справа-перед)

Вот эту часть вообще не понял =(


Нуб из нубов даже в GML.
MagicHeroДата: Пятница, 26 Июня 2020, 15:00 | Сообщение # 16
участник
Сейчас нет на сайте
Цитата trespass91 ()
Вот эту часть вообще не понял =(

Нарисована должна вот так https://www.google.ru/url?sa=i&rct=j&q=&esrc=s&source=imgres&cd=&cad=rja&uact=8&ved=2ahUKEwjfrsHstZ_qAhVU6qYKHbxSAzIQjRx6BAgBEAQ&url=https%3A%2F%2Fwww.hotpng.com%2Ffree-png-clipart-ezmgt&psig=AOvVaw17dr5R1aF23mCTRRRoO-dL&ust=1593258843272431
взял пример с гильзой чтобы было точно понятно направление.

Цитата MagicHero ()
для плавного поворота такой код у меня:

pointdir = point_direction (x, y, mouse_x, mouse_y);//Плавное вращение башни танка.
image_angle += sin(degtorad(pointdir - image_angle)) * aim_speed;


Если для плавного поворота у тебя есть отдельный код то создание пули неверно что ты написал т.к. при смещение мыши пуля не будет создаваться в дуле пока дуло не остановится по координатам мыши.
В общем тебе надо написать так (я там уже добавил код для поворота пули)

Код
var dir = obj_tank_cannon.image_angle; // ИЗМЕНИТЬ
if (mouse_check_button(mb_left))
{
    if (canshoot = false)
    {
    canshoot = true
    var x_offset = lengthdir_x(83, dir);
    var y_offset = lengthdir_y(83, dir);
    var temp = instance_create_depth(x + x_offset, y + y_offset, 1, obj_bullet);
    with (temp)
    {
    speed = 5;
    direction = obj_tank_cannon.image_angle;
    image_angle = obj_tank_cannon.image_angle;    // для поворота пули по направлению полета
    }
    alarm[0] = room_speed * shoot_delay;
    audio_play_sound(sound_tank_shot, 1, 0);
    }



Сообщение отредактировал MagicHero - Пятница, 26 Июня 2020, 15:01
trespass91Дата: Пятница, 26 Июня 2020, 15:06 | Сообщение # 17
был не раз
Сейчас нет на сайте
MagicHero.Благодарю.Сейчас почитаю твой код и внимательно изучу.Насчет направления пули я просто формулировку твою не понял.Оказывается Пулю рисовать в направлении 0.Она собственно и нарисована в ноль сразу.Теперь все спрайты так рисую,чтобы в коде не поворачивать их к 0.

Добавлено (26 Июня 2020, 15:14)
---------------------------------------------
Проверил-Все хорошо работает.Благодарствую.
Теперь я задумался:а не стоило ли мне первый проект попроще взять себе...А то у меня и противник двигает и башней и поворачивается ко мне основанием танка.Правда еще скользит во время движения,если не остановился еще.Думаю придется безбашенных пока делать.Ибо у меня управление танком как у авто,единственное на мете поворачивается и рассчитывается п оформулам синусам-косинусам.Думаю придется брать учебник по тригонометрии,чтобы хоть как-то понимать это.


Нуб из нубов даже в GML.
MagicHeroДата: Пятница, 26 Июня 2020, 15:39 | Сообщение # 18
участник
Сейчас нет на сайте
Противник же едет по какому то пути, раз он едет :) а значит нужно просто image_angle основания танка приравнивать к direction, т.е. просто прописать в степе основания танка image_angle = direction. А в башне image_angle = point_direction(x , y , x_координаты_танка_игрока, y_координаты_танка_игрока ); и соответственно создавать пули которыми он стреляет по dir = имя_обьекта_башни_танка_противника.image_angle а далее для выстрела код почти тот же что и у твоего основного танка. А чтобы противник за километр не крутил башней на танк игрока сделать проверку на расстояние до игрока, прописать в степе башни танка противника:
Код
if distance_to_object(обьект_основания_игрока) < range
{
  image_angle = point_direction(x , y , x_координаты_танка_игрока, y_координаты_танка_игрока ); }
}
else
{
код выравнивания угла поворота башни к углу поворота основания танка
}


где range расстояние до игрока при котором противник начнет реагировать

Хотя так башня будет моментально поворачиваться и лучше сделать код на плавный поворот к игроку.


Сообщение отредактировал MagicHero - Пятница, 26 Июня 2020, 16:02
trespass91Дата: Пятница, 26 Июня 2020, 15:51 | Сообщение # 19
был не раз
Сейчас нет на сайте
Цитата MagicHero ()
Противник же едет по какому то пути, раз он едет а значит нужно просто image_angle основания танка приравнивать к direction, т.е. просто прописать в степе основания танка image_angle = direction. А в башне image_angle = point_direction(x , y , x_координаты_танка_игрока, y_координаты_танка_игрока ); и соответственно создавать пули которыми он стреляет по dir = имя_обьекта_башни_танка_противника.image_angle а далее для выстрела код почти тот же что и у твоего основного танка.

Ага.Примерно понял.Буду заниматься.


Нуб из нубов даже в GML.
MagicHeroДата: Пятница, 26 Июня 2020, 15:58 | Сообщение # 20
участник
Сейчас нет на сайте
Я там немного дополнил ответ выше.
Форум игроделов » Конструкторы игр и лёгкие в освоении системы разработки игр » Game Maker » GMS 2 TDS Неправильный полет пули. (Немного не понимаю в чем дело.)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг