2012-03-06 12 views
9

Napisałem klasę view_port dla klasy do gry 2D. Panoramowania (za pomocą klawiszy strzałek) i powiększanie (z kółkiem myszy) działają dobrze, ale chciałbym pogląd również domu kierunku gdziekolwiek kursor znajduje się, podobnie jak w Google Maps or Supreme CommanderPowiększyć w kierunku myszy (np. Mapy Google)

będę oszczędzić specyfiki tego, w jaki sposób zoom jest zaimplementowany, a nawet jakiego języka używam: to wszystko nie ma znaczenia. Ważna jest funkcja zoom, która modyfikuje strukturę prostokąta (x, y, w, h), która reprezentuje widok. Dotychczas kod wygląda następująco:

void zoom(float delta, float mouse_x, float mouse_y) 
{ 
    zoom += delta; 
    view.w = window.w/zoom; 
    view.h = window.h/zoom; 
    // view.x = ??? 
    // view.y = ??? 
} 

zanim ktoś sugeruje to, następujące nie praca:

view.x = mouse_x - view.w/2; 
view.y = mouse_y - view.h/2; 

Ten obraz pokazuje, dlaczego, jak staram się przybliżyć ku buźkę:

http://oi43.tinypic.com/16m21au.jpg

Jak widać, gdy obiekt pod mysz umieszcza się w t on pośrodku ekranu przestaje być pod myszą, więc przestajemy przybliżać się do niego!

Jeśli masz głowę do matematyki (potrzebujesz jej), wszelka pomoc na ten temat będzie najbardziej doceniona!

Odpowiedz

7

Udało mi się wymyślić rozwiązanie, dzięki dużej liczbie drapania głowy, wiele małych zdjęć: Zamierzam opublikować algorytm tutaj na wypadek, gdyby ktoś tego potrzebował.

Vect2f mouse_true(mouse_position.x/zoom + view.x, mouse_position.y/zoom + view.y); 
Vect2f mouse_relative(window_size.x/mouse_pos.x, window_size.y/mouse_pos.y); 
view.x = mouse_true.x - view.w/mouse_relative.x; 
view.y = mouse_true.y - view.h/mouse_relative.y; 

Zapewnia to, że obiekty umieszczone pod myszą pozostają pod myszą. Możesz sprawdzić kod na github, a także zrobiłem demonstracyjną wersję demonstracyjną dla youtube.

+1

Czy możesz wyjaśnić, co oznaczają zmienne? – WebF0x

1

W mojej koncepcji jest kamera i ekran. Aparat jest częścią ruchomą. Ekran jest skalowalną częścią.

Zrobiłem przykładowy skrypt zawierający wersję demonstracyjną na żywo. Problem jest ograniczony do jednego wymiaru, aby był prosty. https://www.khanacademy.org/cs/cam-positioning/4772921545326592

var a = (mouse.x + camera.x)/zoom; 

// now increase the zoom e.g.: like that: 
zoom = zoom + 1; 

var newPosition = a * zoom - mouse.x; 

camera.setX(newPosition); 
screen.setWidth(originalWidth * zoom); 

Dla przykładu 2D można po prostu dodać ten sam kod dla wysokości i y pozycjach.