Ограничение перетаскивания в гейммейкере

Привет, я пытаюсь ограничить, сколько пользователь может перетаскивать в Gamemaker.

Я создал два представления в комнате. Первый вид - это полная ширина комнаты и размер 1250x768. Второй вид - это область, которую я хотел бы, чтобы пользователь мог масштабировать и перетаскивать, которая составляет 955x465. x и y позиция 40 на 170.

В настоящее время я настроил масштабирование для второго представления, которое:

vmx=(mouse_x-X)-omx;
omx=(mouse_x-X);
vmy=(mouse_y-Y)-omy;
omy=(mouse_y-Y);

if mouse_wheel_up() && view_wview[1] > 600 {
    center_of_space_x=view_xview[1]+view_wview[1]/2;
    center_of_space_y=view_yview[1]+view_hview[1]/2;
    view_wview[1]-=view_wview[1]*0.15;
    view_hview[1]-=view_hview[1]*0.15;
    view_xview[1]=center_of_space_x-view_wview[1]/2;
    view_yview[1]=center_of_space_y-view_hview[1]/2;


}
if mouse_wheel_down(){
    view_xview[1] = 40;
    view_yview[1] = 170;
    view_wview[1] = 955;
    view_hview[1] = 465;}

Ниже приведен код перетаскивания:

if (mouse_check_button_pressed(mb_left)) {
    drag_x = mouse_x
    drag_y = mouse_y
}
// update:
if (mouse_check_button(mb_left)) && view_wview[1] < 700 {
    // actual dragging logic:
    view_xview[1] = drag_x - (mouse_x - view_xview[1])
    view_yview[1] = drag_y - (mouse_y - view_yview[1])
    // make sure view doesn't go outside the room:
    view_xview[1] = max(0, min(view_xview[1], room_width - view_wport[1]))
    view_yview[1] = max(0, min(view_yview[1], room_height - view_hview[1]))

Таким образом, ограничение работает, чтобы вид не покидал комнату, но я хочу, чтобы он не покидал определенный вид, который был настроен.

Пожалуйста помоги

Я изменил свой код, чтобы использовать функцию зажима, которая работает, но это не чистое решение:

view_xview[1] = clamp(view_xview[1],40,400);
view_yview[1] = clamp(view_yview[1],170,500);

Пользователь должен быть полностью увеличен, чтобы ограничить просмотр. Если его нет, то они все равно могут видеть другие области комнаты :(


person Jivvy    schedule 21.06.2016    source источник


Ответы (1)


РЕДАКТИРОВАТЬ: возможно, я неправильно понял ваш вопрос, я оставлю приведенный ниже код для справки, если он поможет вам решить проблему немного по-другому.

Я бы, наверное, проверил, что mouse_x и mouse_y не выходят за рамки нужного вам представления.

if (mouse_x > view_limit_x || mouse_y > view_limit_y)
{
  return; // Or continue or break however your language of choice goes.
}

Если вы не можете выполнить оператор return, обертка вашего кода в обратной логике, описанной выше, должна работать нормально.

Старый пост:

Я не на 100% знаком с гейммейкером. Я бы реализовал что-то подобное, пропуская логику перетаскивания каждые x кадров. Скажем, вы обновляете со скоростью 60 кадров в секунду и хотите, чтобы перетаскивание было в 6 раз медленнее, вам просто нужно обновлять логику только 10 раз за кадр.

const int framesToSkip = 6;
int frameCount = 0;

update()
{

  // Will only call when framecount = 0, 6, 12, 18 etc.
  if (frameCount % framesToSkip == 0)
    {
      // Drag Logic.
    }


  frameCount++;
}

Таким образом, логика перетаскивания происходит только на 1/6 скорости, как раньше. Вы также можете изменить это, чтобы происходило первое количество кадров x, а затем пропускать остальные (но это может показаться немного прерывистым).

person lozzajp    schedule 22.07.2016