Game Maker - создание игр | HellRoom Games

Game Maker | GameMaker: Studio [Game-Maker.ru] => Вопросы по TDS (игры с видом сверху) => Тема начата: DSIYS от Ноябрь 29, 2020, 12:31:47



Название: Стрельба из дула оружия
Отправлено: DSIYS от Ноябрь 29, 2020, 12:31:47
Возникла проблема с реализацией оружия:выстрел происходит из "точки крепления". Ещё бы хотелось узнать, как сделать поворот(отражение) спрайта при определенном повороте мыши.
P.s. Жанр не совсем TDS, просто кроме платформеров и TDS тут ничего нет.
Оружие:
Global left down
if (mouse_check_button(mb_left)) {
   sprite_index= MushketAtack;
   image_speed=1.5;
}
if cd=1{
instance_create_depth(x,y,-1,Obj_Bu);
alarm[0]= shooting_speed;
cd=0;
}


End step
x=Obj_Player.x+10;
y=Obj_Player.y;



Название: Re: Стрельба из дула оружия
Отправлено: AndrewVideoGames от Ноябрь 29, 2020, 13:10:00
Используйте lengthdir_x и lengthdir_y – прибавляйте их к координатам при создании пули, первым аргументом (длина) будет расстояние от центра до дула, а вторым (направление) угол направления от центра до дула.


Название: Re: Стрельба из дула оружия
Отправлено: DSIYS от Ноябрь 29, 2020, 15:06:19
Используйте lengthdir_x и lengthdir_y – прибавляйте их к координатам при создании пули, первым аргументом (длина) будет расстояние от центра до дула, а вторым (направление) угол направления от центра до дула.
Благодарю,поискал информацию по lengthdir_x и lengthdir_y и нашёл решение. А что на счёт отражения спрайта? К примеру, я поворачиваю мушкет назад и по идее, он должен перевернутся по оси x. Как можно сделать так, чтобы он с определённого угла зеркально отражался?


Название: Re: Стрельба из дула оружия
Отправлено: AndrewVideoGames от Ноябрь 29, 2020, 18:38:49
Как можно сделать так, чтобы он с определённого угла зеркально отражался?
Пока что я не очень понял что имеется ввиду в отражении с определённого угла, но используйте image_xscale (1 обычное состояние, -1 отраженное по горизонтали) и image_yscale (1 обычное состояние, -1 отраженное по вертикали).


Название: Re: Стрельба из дула оружия
Отправлено: DSIYS от Ноябрь 30, 2020, 20:08:19
Как можно сделать так, чтобы он с определённого угла зеркально отражался?
Пока что я не очень понял что имеется ввиду в отражении с определённого угла, но используйте image_xscale (1 обычное состояние, -1 отраженное по горизонтали) и image_yscale (1 обычное состояние, -1 отраженное по вертикали).
Вот моя проблема (извиняюсь за качество). Мне нужно, чтобы пушка при этом положении перевернулась. Пушка следит за мышкой.


Название: Re: Стрельба из дула оружия
Отправлено: AndrewVideoGames от Декабрь 01, 2020, 09:44:12
Повернулась по каким направлениям? Вправо/влево и Вверх/Вниз? Или больше?


Название: Re: Стрельба из дула оружия
Отправлено: DSIYS от Декабрь 01, 2020, 11:23:40
Повернулась по каким направлениям? Вправо/влево и Вверх/Вниз? Или больше?
Если разделить картинку, что я прислал на 2 части по вертикали, то в правой половине мушкет будет смотреть в право, а в левой стороне он должен отразиться по оси x. т.е если спрайт заходит на левую половину (-x) то он должен зеркально отразиться


Название: Re: Стрельба из дула оружия
Отправлено: AndrewVideoGames от Декабрь 01, 2020, 13:14:38
Повернулась по каким направлениям? Вправо/влево и Вверх/Вниз? Или больше?
Если разделить картинку, что я прислал на 2 части по вертикали, то в правой половине мушкет будет смотреть в право, а в левой стороне он должен отразиться по оси x. т.е если спрайт заходит на левую половину (-x) то он должен зеркально отразиться
Код:
image_xscale = sign(mouse_x - x); // если спрайт изначально повёрнут вправо, если влево, то sign(x - mouse_x)


Название: Re: Стрельба из дула оружия
Отправлено: DSIYS от Декабрь 01, 2020, 18:07:17
Теперь, когда я поворачиваю оружие в лево, оно не следит за мышью, а переворачивается.


Название: Re: Стрельба из дула оружия
Отправлено: AndrewVideoGames от Декабрь 01, 2020, 18:14:10
Теперь, когда я поворачиваю оружие в лево, оно не следит за мышью, а переворачивается.
Сформулируйте что вам нужно точнее. Кроме отражения и поворота направления я не представляю что можно сделать с оружием.


Название: Re: Стрельба из дула оружия
Отправлено: DSIYS от Декабрь 01, 2020, 19:25:29
Если честно, не знаю как описать ещё точнее.
Дуло оружия следит за мышью по этому коду:
Код:
image_angle=point_direction(x,y,mouse_x,mouse_y);

Когда оружие поворачивается назад, то есть в левую сторону, то получается, что оно перевёрнуто(см. картинка 1). По этому коду, который вы мне скинули, оружие, когда я перевожу мышь в левую часть, оружие,а точнее его спрайт перестаёт следить за курсором и просто отражается зеркально (см. картинка 2 и 3).
Код:
image_xscale = sign(mouse_x - x);

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



Название: Re: Стрельба из дула оружия
Отправлено: AndrewVideoGames от Декабрь 01, 2020, 20:20:31
Работает без проблем (только поворачивать не по горизонтали, а по вертикали же нужно оружие):
Код:
var gunX = x;
var gunY = y;
var gunAngle = point_direction(mouse_x, mouse_y, gunX, gunY);
var gunScale = sign(gunX - mouse_x);
draw_sprite_ext(sGun, 0, gunX, gunY, 1, gunScale, gunAngle, c_white, 1);


Название: Re: Стрельба из дула оружия
Отправлено: DSIYS от Декабрь 01, 2020, 21:47:56
Работает без проблем (только поворачивать не по горизонтали, а по вертикали же нужно оружие):
Код:
var gunX = x;
var gunY = y;
var gunAngle = point_direction(mouse_x, mouse_y, gunX, gunY);
var gunScale = sign(gunX - mouse_x);
draw_sprite_ext(sGun, 0, gunX, gunY, 1, gunScale, gunAngle, c_white, 1);
Не получается. Скорее всего, чтобы это работало, я изначально должен был сделать всё по умному. Быть новичком в любой сфере не просто. Я скину проект во вложении в rar файле, если будет время и желание, может вы найдёте, в чём проблема.


Название: Re: Стрельба из дула оружия
Отправлено: AndrewVideoGames от Декабрь 01, 2020, 23:51:46
Экспортируйте проект через File -> Export


Название: Re: Стрельба из дула оружия
Отправлено: DSIYS от Декабрь 01, 2020, 23:56:48
Экспортируйте проект через File -> Export


Название: Re: Стрельба из дула оружия
Отправлено: AndrewVideoGames от Декабрь 02, 2020, 11:46:18
У меня проект не открывается из-за того, что гмс2 не обновлен. Из того, что я увидел по файлам, я не увидели, чтобы Вы меняли image_yscale и point_direction Вы используете от x,y до mouse_x,mouse_y, а нужно наоборот.
Просто вставьте мой код в любой объект, вставьте туда название спрайта оружия и всё будет работать.


Название: Re: Стрельба из дула оружия
Отправлено: DSIYS от Декабрь 02, 2020, 20:23:57
У меня проект не открывается из-за того, что гмс2 не обновлен. Из того, что я увидел по файлам, я не увидели, чтобы Вы меняли image_yscale и point_direction Вы используете от x,y до mouse_x,mouse_y, а нужно наоборот.
Просто вставьте мой код в любой объект, вставьте туда название спрайта оружия и всё будет работать.
В какое событие вставлять?


Название: Re: Стрельба из дула оружия
Отправлено: AndrewVideoGames от Декабрь 02, 2020, 20:58:48
В какое событие вставлять?
Step:
Код: (Step)
gunAngle = point_direction(mouse_x, mouse_y, x, y);
gunScale = sign(x - mouse_x);

Draw:
Код: (Draw)
draw_self();
draw_sprite_ext(sGun, 0, x, y, 1, gunScale, gunAngle, c_white, 1);


Название: Re: Стрельба из дула оружия
Отправлено: DSIYS от Декабрь 06, 2020, 13:05:33
В какое событие вставлять?
Step:
Код: (Step)
gunAngle = point_direction(mouse_x, mouse_y, x, y);
gunScale = sign(x - mouse_x);

Draw:
Код: (Draw)
draw_self();
draw_sprite_ext(sGun, 0, x, y, 1, gunScale, gunAngle, c_white, 1);
Боги, я так благодарен, наконец всё получилось! Ну, почти. Хотелось бы ещё на последок узнать, как менять спрайт при нажатии на кнопку.


Название: Re: Стрельба из дула оружия
Отправлено: AndrewVideoGames от Декабрь 06, 2020, 15:23:10
Боги, я так благодарен, наконец всё получилось! Ну, почти. Хотелось бы ещё на последок узнать, как менять спрайт при нажатии на кнопку.
Смена спрайта:
Код:
sprite_index = нужный спрайт
Нажатие на кнопку:
Код:
if (keyboard_check_pressed(кнопка))


Название: Re: Стрельба из дула оружия
Отправлено: DSIYS от Декабрь 06, 2020, 15:49:29
Боги, я так благодарен, наконец всё получилось! Ну, почти. Хотелось бы ещё на последок узнать, как менять спрайт при нажатии на кнопку.
Смена спрайта:
Код:
sprite_index = нужный спрайт
Нажатие на кнопку:
Код:
if (keyboard_check_pressed(кнопка))
*На кнопку мыши. Чтобы имитировать выстрел. У меня есть два спрайта: Спрайт мушкета без анимации и спрайт с анимацией выстрела. Когда я прописываю замену спрайта через sprite_index ничего не происходит. Я пишу это в событии Global left down.
Код:
if mouse_check_button(mb_left)//нажатие на лкм
{
sprite_index=MushketAtack//замена спрайта
}
if cd=1 //кулдаун использования оружия
{
instance_create_depth(x+lengthdir_x(-50,gunAngle),y+lengthdir_y(-50,gunAngle),1,Obj_Bu)//спавн пули
alarm[0]= shooting_speed//скорость стрельбы

cd=0//блок следущего выстрела
}



Название: Re: Стрельба из дула оружия
Отправлено: ярик от Декабрь 06, 2020, 23:48:36
Кста, отличная идея, в событие нажатие пкм, написать код для проверки нажатии пкм.

GlobalLeftDown (или вроде GlobalLeftPressed)
Код:
sprite_index = MushketAtack//замена спрайта
if cd = true {
     instance_create_depth(x+lengthdir_x(-50,gunAngle),y+lengthdir_y(-50,gunAngle),1,Obj_Bu)
     alarm[0] = shooting_speed
     cd = false
}


Название: Re: Стрельба из дула оружия
Отправлено: DSIYS от Декабрь 07, 2020, 10:31:35
Кста, отличная идея, в событие нажатие пкм, написать код для проверки нажатии пкм.

GlobalLeftDown (или вроде GlobalLeftPressed)
Код:
sprite_index = MushketAtack//замена спрайта
if cd = true {
     instance_create_depth(x+lengthdir_x(-50,gunAngle),y+lengthdir_y(-50,gunAngle),1,Obj_Bu)
     alarm[0] = shooting_speed
     cd = false
}
Прогрессивные технологии игростроя - требуют прогрессивного кода  sm_good.

Добавлено: Декабрь 07, 2020, 16:45:25
Вот только проблема, с заменой спрайта при выстреле, всё ещё не решена.


Название: Re: Стрельба из дула оружия
Отправлено: ярик от Декабрь 07, 2020, 23:16:56
Короче, не смог я открыть твою магию, вот поэтому посмотрел код в .txt.
И я в шоке от увиденного.

Короче, есть несколько вариантов
Этот код в Step'е
Код:
if (not keyboard_check(ord("A") or ord("W") or ord("S") or ord("D"))){sprite_index=PlayerStay}
То есть этот код не дает сработать твоему коду анимации стрельбы.

Сделай проверку на нажатие пкм в верхнем коде.

Также иди учи уроки по оптимизации кода и справку.

Вот мини примерчик оптимизации:
Код:
var Up = keyboard_check(ord("W"));
var Down = keyboard_check(ord("S"));
var Left = keyboard_check(ord("A"));
var Right = keyboard_check(ord("D"));
var MousePressed = mouse_check_button(mv_left);

if Up = false {
    if Down = false {
        if Left = false {
            if Right = false {
                if MousePressed = false {
                    sprite_index = PlayerStay;
                }
            }
        }
    }
}


Название: Re: Стрельба из дула оружия
Отправлено: AndrewVideoGames от Декабрь 08, 2020, 11:28:23
Вот мини примерчик оптимизации:
Код:
var Up = keyboard_check(ord("W"));
var Down = keyboard_check(ord("S"));
var Left = keyboard_check(ord("A"));
var Right = keyboard_check(ord("D"));
var MousePressed = mouse_check_button(mv_left);

if Up = false {
    if Down = false {
        if Left = false {
            if Right = false {
                if MousePressed = false {
                    sprite_index = PlayerStay;
                }
            }
        }
    }
}
Что это за дичь?


Название: Re: Стрельба из дула оружия
Отправлено: ярик от Декабрь 08, 2020, 11:53:55
Ой, извиняюсь.

Код:
CREATE
xx = 0
yy = 0
Spd1 = 4 //скорость игрока

STEP
var WalkY = keyboard_check(ord("W")) - keyboard_check(ord("S"));
var WalkX = keyboard_check(ord("A")) - keyboard_check(ord("D"));
var MousePressed = mouse_check_button(mb_left)
if WalkY = 1 { //Движение по Y
    y -= Spd1
}else{
    if WalkY = -1 {
        y += Spd1
    }
}
if WalkX = 1 { //Движение по X
    x -= Spd1
}else{
    if WalkX = -1 {
        x += Spd1
    }
}
var Spd2 = point_distance(xx,yy,x,y); //speed не будет работать потому что мы передвигаемся через координаты
if Spd2 = 0 { //Если расстояние между точками XxYy и XY = 0, то мы будем знать что перс остановился
    if MousePressed = false { //"Мы не стреляем"
        sprite_index = PlayerStay; //стоим
    }
}
xx = x //end code
yy = y

Теперь?

(Я если что писал к его коду который нашел в файле):
Код:
if (not keyboard_check(ord("A") or ord("W") or ord("S") or ord("D"))){sprite_index=PlayerStay} //Был еще код

Ну все, до свидание, пока.
Ты доволен, я доволен, и чел с вопросом доволен.


Название: Re: Стрельба из дула оружия
Отправлено: DSIYS от Декабрь 08, 2020, 17:43:37
Ой, извиняюсь.

Код:
CREATE
xx = 0
yy = 0
Spd1 = 4 //скорость игрока

STEP
var WalkY = keyboard_check(ord("W")) - keyboard_check(ord("S"));
var WalkX = keyboard_check(ord("A")) - keyboard_check(ord("D"));
var MousePressed = mouse_check_button(mb_left)
if WalkY = 1 { //Движение по Y
    y -= Spd1
}else{
    if WalkY = -1 {
        y += Spd1
    }
}
if WalkX = 1 { //Движение по X
    x -= Spd1
}else{
    if WalkX = -1 {
        x += Spd1
    }
}
var Spd2 = point_distance(xx,yy,x,y); //speed не будет работать потому что мы передвигаемся через координаты
if Spd2 = 0 { //Если расстояние между точками XxYy и XY = 0, то мы будем знать что перс остановился
    if MousePressed = false { //"Мы не стреляем"
        sprite_index = PlayerStay; //стоим
    }
}
xx = x //end code
yy = y

Теперь?

(Я если что писал к его коду который нашел в файле):
Код:
if (not keyboard_check(ord("A") or ord("W") or ord("S") or ord("D"))){sprite_index=PlayerStay} //Был еще код

Ну все, до свидание, пока.
Ты доволен, я доволен, и чел с вопросом доволен.

Ну, не совсем. Код полностью выглядит вот так:
Step
Код:
if (keyboard_check(ord("D"))) //В право, спрайт меняется на бег в право
{
x+=2;
sprite_index=PlayerRun;
image_xscale = 1;
}

if keyboard_check(ord("A")) //В лево, спрайт отражается зеркально
{
x-=2;
sprite_index=PlayerRun;
image_xscale =-1;
}
if keyboard_check(ord("W"))
{
y-=2;
sprite_index=PlayerRun;
}
if (keyboard_check(ord("S")))
{
y+=2;
sprite_index=PlayerRun;
}
if (not keyboard_check(ord("A") or ord("W") or ord("S") or ord("D"))){sprite_index=PlayerStay}// Спрайт меняется на стояние
mask_index = HitBoxMan; //объект маска
object_get_mask(HitBoxMan)


Название: Re: Стрельба из дула оружия
Отправлено: AndrewVideoGames от Декабрь 08, 2020, 19:21:25
*На кнопку мыши. Чтобы имитировать выстрел. У меня есть два спрайта: Спрайт мушкета без анимации и спрайт с анимацией выстрела. Когда я прописываю замену спрайта через sprite_index ничего не происходит. Я пишу это в событии Global left down.
Код:
if mouse_check_button(mb_left)//нажатие на лкм
{
sprite_index=MushketAtack//замена спрайта
}
if cd=1 //кулдаун использования оружия
{
instance_create_depth(x+lengthdir_x(-50,gunAngle),y+lengthdir_y(-50,gunAngle),1,Obj_Bu)//спавн пули
alarm[0]= shooting_speed//скорость стрельбы

cd=0//блок следущего выстрела
}
Делайте всё в Step и проверку реализуйте через if (mouse_check_button_pressed(mb_left)). Всё должно работать.


Название: Re: Стрельба из дула оружия
Отправлено: DSIYS от Декабрь 08, 2020, 20:32:32
То есть вот так?
Step.
Код:
gunAngle = point_direction(mouse_x, mouse_y, x, y);
gunScale = sign(x - mouse_x);
if mouse_check_button_pressed(mb_left)//нажатие на лкм
{
sprite_index=MushketAtack//замена спрайта
}
if cd=true //кулдаун использования оружия
{
instance_create_depth(x+lengthdir_x(-50,gunAngle),y+lengthdir_y(-50,gunAngle),1,Obj_Bu)//спавн пули
alarm[0]= shooting_speed//скорость стрельбы



cd=false//блок следующего выстрела
}
Делайте всё в Step и проверку реализуйте через if (mouse_check_button_pressed(mb_left)). Всё должно работать.

Добавлено: Декабрь 08, 2020, 20:47:18
Ой, извиняюсь.

Код:
CREATE
xx = 0
yy = 0
Spd1 = 4 //скорость игрока

STEP
var WalkY = keyboard_check(ord("W")) - keyboard_check(ord("S"));
var WalkX = keyboard_check(ord("A")) - keyboard_check(ord("D"));
var MousePressed = mouse_check_button(mb_left)
if WalkY = 1 { //Движение по Y
    y -= Spd1
}else{
    if WalkY = -1 {
        y += Spd1
    }
}
if WalkX = 1 { //Движение по X
    x -= Spd1
}else{
    if WalkX = -1 {
        x += Spd1
    }
}
var Spd2 = point_distance(xx,yy,x,y); //speed не будет работать потому что мы передвигаемся через координаты
if Spd2 = 0 { //Если расстояние между точками XxYy и XY = 0, то мы будем знать что перс остановился
    if MousePressed = false { //"Мы не стреляем"
        sprite_index = PlayerStay; //стоим
    }
}
xx = x //end code
yy = y

Теперь?

(Я если что писал к его коду который нашел в файле):
Код:
if (not keyboard_check(ord("A") or ord("W") or ord("S") or ord("D"))){sprite_index=PlayerStay} //Был еще код

Ну все, до свидание, пока.
Ты доволен, я доволен, и чел с вопросом доволен.

К чему здесь:
Код:
var MousePressed = mouse_check_button(mb_left)
    if MousePressed = false { //"Мы не стреляем"
?
У меня оружие и игрок два разных объекта


Название: Re: Стрельба из дула оружия
Отправлено: ярик от Декабрь 08, 2020, 21:24:50
._.

Короче, про мой код забыли.
И у меня к тебе вопрос. Как оружие узнает что оно стреляет?

---------------------------------------------------------------
Код:
var MousePressed = mouse_check_button(mb_left);
    if MousePressed = false { //"Мы не стреляем"
Первый код записывает в переменную "нажата ли мышка"
А второй код проверяет того что мышка не нажата