Вторник, 26 Ноября 2024, 22:02

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Управление мышью в Game maker
123dima321Дата: Пятница, 07 Марта 2014, 12:41 | Сообщение # 1
почетный гость
Сейчас нет на сайте
В общем плане нужно, чтобы управление персонажем осуществлялось с помощью мыши.
Необходимо, чтобы выполнялось 5 различных действий:

Нажал, резко мышью вправо, отпустил -> 1 действие
Нажал, резко мышью влево, отпустил -> 2 действие
Нажал, резко мышью вверх, отпустил -> 3 действие
Нажал, резко мышью вниз, отпустил -> 4 действие
Просто нажал, отпустил -> 5 действие

Щелчки мышью осуществляются в любом месте комнаты...

Делаю так:
в объекте o_game, в событии mouse_left_pressed, пишу код:
Код
kn=mouse_x


в объекте o_game, в событии mouse_left_releassed, пишу код:
Код
if kn<mouse_x then instance_create(0,0,o_pac_right) else instance_create(0,0,o_pac_left)


в объекте o_pac_right выполняются соответствующие действия, после он удаляется

Так вот, цикл не работает полностью((( При выполнении срабатывает (не с первого раза) только 1 действие(
Пробовал даже в объекте o_game события запихивать в начальный шаг и конечный...
Помогите, плиз!!! cry
XDominatorДата: Пятница, 07 Марта 2014, 15:35 | Сообщение # 2
постоянный участник
Сейчас нет на сайте
Я мало че понял, но одно могу сказать точно - if это не цикл.

Для реализации того что ты хочешь, потребуется более сложный код чем то что ты представил. Ты не можешь провести мышью идеально вверх или вниз без отклонений по x координате например, тоже самое относится и к x координате - всегда будет отклонение вверх или вниз. Я бы пользовался другим кодом.

Код

object controller:

create event:
action_type = -1 - отвечает за действие, определяемое нашим движение. -1 - необрабатываемое значение
action_enabled = true - блокиратор на управление
xsaved = 0;
ysaved = 0;
angle = 0:

step event

if action_type > -1
{
    switch(action_type)
    {
    case 0:
    show_message("up")
    break;

    case 1:
    show_message("down")
    break;

    case 2:
    show_message("left")
    break;

    case 3:
    show_message("right")
    break;
    }
    action_enabled = true
    action_type = -1
}

global_mouse_pressed:
if action_enabled
{
    action_enabled = false
    xsaved = mouse_x
    ysaved = mouse_y
}

global_mouse_released://представим нашу рабочую область как круг с перекрестием в центре на весь размер круга. Перекрестие образует 4 сектора внутри круга. Определяем сектор, в котором находится курсор, и по нему определяем тип действия:

if action_enabled = false
{
    angle = point_direction(xsaved, ysaved, mouse_x, mouse_y)
    if angle > 315 or angle <= 45 action_type = 3 - правый сектор
    if angle <= 135 and angle > 45 action_type = 0 - верхний сектор
    if angle <= 225 or angle > 135 action_type = 2 - левый сектор
    if angle <= 315 or angle > 225 action_type = 1 - нижний сектор
}



Могу напутать со знаками, но должно работать. Пробуй.


Ghaarp

The soul lighter(Android, logic)

Zzzzombie RAGE!!!(For android)


Сообщение отредактировал XDominator - Пятница, 07 Марта 2014, 15:37
123dima321Дата: Пятница, 07 Марта 2014, 20:10 | Сообщение # 3
почетный гость
Сейчас нет на сайте
XDominator, Спасибо большое))) Код, то что нужно!!! Все супер, получилось!!! Лови +

Сообщение отредактировал 123dima321 - Пятница, 07 Марта 2014, 20:10
Sanchez06Дата: Воскресенье, 09 Марта 2014, 11:41 | Сообщение # 4
участник
Сейчас нет на сайте
Я думаю, можно еще проверять расстояние между xsaved,ysaved и mouse_x,mouse_y, чтобы идеально получался простой клик мышью - вводится погрешность. Также можно проверять пропорцию между размером х-координаты и игрек (например, если икс координата больше, то и движение идет по горизонтали, если у - по вертикали). Но если и этот код работает, то отлично.
123dima321Дата: Воскресенье, 09 Марта 2014, 14:00 | Сообщение # 5
почетный гость
Сейчас нет на сайте
)

Сообщение отредактировал 123dima321 - Воскресенье, 09 Марта 2014, 14:35
XDominatorДата: Среда, 12 Марта 2014, 09:07 | Сообщение # 6
постоянный участник
Сейчас нет на сайте
Не вдаваясь в подробности, функция point_direction по сути и определяет отношения между x/y координатами(проекциями) через простейшую тригонометрию, просто если это уже нормально реализовано средствами гамака, зачем это делать еще раз? smile

Ghaarp

The soul lighter(Android, logic)

Zzzzombie RAGE!!!(For android)
  • Страница 1 из 1
  • 1
Поиск:

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