Gra 2d, centrowanie mapy do pozycji gracza, płynne przejścia.

0

Witam. Pracuję nad pierwszą grą 2D. Poruszanie się ma być podobne do tego w Tibii (tzn. z "kratki" na "kratkę", ponieważ łatwiej będzie przy moim obecnym stanie wiedzy obsłużyć kolizje). Potrzebuję podpowiedzi, jak wyświetlać gracza na środku ekranu, przy pozornie ruszającej się mapie tak by było to jak najbardziej obiektowo i przejrzyście. Udało mi się to zrobić w taki sposób:
przy każdym rysowaniu gry:

  1. Sprawdzam pozycję gracza (x,y)
  2. Według powyższego ustalam od której kratki mapa ma być rysowana
    Do tego momentu zrobiłem to obiektowo, bez większych problemów. Problem zaczyna się gdy chcę żeby ta postać nie "skakała" tylko ruszała się płynnie. Zrobiłem to tak:
  3. Zmieniam pozycję gracza na kratkę dalej
  4. Jako że ruch z kratki na kratkę trwa 20/60 sekundy, a FPSów jest 60, to co FPS ruszam postać o 1/20 kratki - wielkość kratki (ponieważ pozornie przeskoczyłem już na kratkę dalej)

tak to teraz wygląda, cel osiągnąłem ale nie wyobrażam sobie teraz, dodać jakiegoś potworka który też miałby się ruszać płynnie między kratkami gdzieś koło mojego gracza, nie na środku ekranu.

Reasumując (sorry, że tak długo, ale starałem się objaśnić to jak najlepiej): w jaki sposób zrobić to obiektowo, słyszałem że trzeba zrobić klasę mapObject ale co z nią robić to nie wiem ;DD
Pozdrawiam!

0

Gracz oraz potwory powinny dziedziczyć po jednej wspólnej klasie (coś w stylu mapEntity or sth), w której będzie metoda mapEntity.move(newPosition), mapEntity.Render oraz mapEntity.processMove.
move będzie wywoływane, gdy gracz czy postać będzie chciała się poruszyć na daną kratkę (gdzieś w polu klasy zapiszesz tę nową pozycję), a processMove będzie ruszało postać na ekranie o 1/20 kratki co klatkę bliżej tej zapisanej pozycji.

(btw, ruszanie co FPS o 1/20 kratki jest słabym wyjściem - nie bierzesz pod uwagę możliwości zniżki FPS-ów)

0

A do czego służy metoda Render? do rysowania gracza / potwora?

1

Tia - ogólnie klasa powinna wyglądać mniej więcej tak:

struct entityPosition
{
 float x, y; // pozycja na ekranie
}

struct mapPosition
{
 int x, y; // pozycja na mapie (położenie kafelki, na której stoi gracz)
}

enum mapDirection { mdLeft, mdRight, mdUp, mdDown };

class mapEntity
{
 entityPosition position;
 mapPosition map_position, map_towards; // aktualna pozycja, ta do której zmierzamy
 mapDirection direction;

 abstract void render(); // to powinno być nadpisywane przez klasy dziedziczące po tym, ewentualnie zrób to inaczej - np. zapisuj do pola w tej klasie ID grafik, które mają być wyświetlane ("grafik", czyli "jaki obrazek, gdy obrót w lewo", "jaki obrazek, gdy obrót w prawo" (...) i renderuj bezpośrednio tutaj)

 void move(mapPosition new_position)
 {
  map_towards = new_position;
 }

 void processMove()
 {
  tutaj magia
 }
}

(nie jest to konkretny kod - chcę dać Ci tylko ogólny pogląd na to, jak powinno się to przedstawiać)

0

tutaj magia
haha to mi się spodobało ;D Długa noc przede mną, popróbuję. Dzięki

1 użytkowników online, w tym zalogowanych: 0, gości: 1