na jakiej zasadzie działa przesuwanie ekranu w grach 2d?

0

Taka gra jak mario, jak w niej działa przesuwanie ekranu wraz z graczem?

Albo weźmy taką grę jak Dwarf Fortress, jest to gra w ASCII choć ma nakładki graficzne, ale słabe

tam poruszać mapą można, a postacie, które nie są widoczne na ekranie i tak się poruszają na wielkiej mapie. Chcę tak mniej więcej zrozumieć o co biega przy tym. Metodą prób i błędów, bez tutoriali z netu udało mi się tylko zrobić przez przypadek "czarną mgłę", czyli wokół gracza widać wszystko dookoła w promieniu np. 10 metrów, a później reszta mapy jest czarna i renderuje się przy poruszaniu, ale dalej moja postać nie jest non stop na środku ekranu ustawiona, bo ona się na ekranie porusza w dół, prawo i tak dalej.

czy ktoś z was, kto pisze gry 2d mógłby odpalić mspaint i narysować jak powinno działać to poruszanie się kamery wraz z graczem? Nie chcę kodu, chcę tylko wytłumaczenie. Może to być wyjaśnione na platformowej grze gdzie gracz non stop będzie na środku
a dla ułatwienia niech gra będzie zrobiona z kratek jak w dwarf fortress i niech postać przeskakuje z jednej kratki do drugiej kratki np. o 50, 100 pixeli. Wolałbym by okno gry miało scrolla poziomego i pionowego i przy skoku postaci o jedną kratkę, scroll przesuwałby się też o jedną kratkę i superowo i zrozumiale by było, a tak to muszę prosić was o tłumaczenia.

ps. jak ktoś ma zamiar tylko napisać posta w stylu "wiem, ale ci nie powiem, wejdź na google.com i se szukaj" to niech lepiej nic nie pisze, bo taka osoba nie pomaga wcale, a później przez takie osoby zdarza się, że ktoś szuka czegoś w google, wchodzi na forum z tym problemem, a tam mu każdy odpisze "google.com", wchodzi w kolejnych 5 wyników z google i tam każdy do google go kieruje.

0
  1. robisz globalny uklad wspolrzednych (uwzgledniasz cala plansze)
  2. obliczasz ktory fragment ekranu ktory chcesz wyswietlic - konkretnie lewy gorny rog, chyba ze u Ciebie wspolrzedna 0,0 jest gdzie indziej niz w prawym gornym rogu (prawdopodobnie: wspolrzedna_x_gracza-szerokosc_ekranu/2; wspolrzedna_y_gracza+szerokosc_ekranu/2), czyli obliczasz ktore kafelki do niego naleza i z jakim przesunieciem wyswietlic te graniczne
  3. wyswietlasz
0

u mnie lewy góry róg to 0, 0
załóżmy, że mapę se na starcie wczytam i ma 300 kratek szerokości i 10 kratek wysokości, a gracza na starcie ustawię na pozycji 200 i 5 i od razu chcę by ekran przeniósł się na pozycję gracza na środek, a gracza pozycja XY dalej wynosiła 200 i 5

0

http://lazyfoo.net/SDL_tutorials/lesson21/index.php
tam masz opisane na przykładzie użycia tego w SDL'u

0

Postaram się to w-miarę jasno opisać ;)

Przypuśćmy, że mamy macierz o wymiarach 100 na 100, która opisuje naszą dwuwymiarową mapę, nazwijmy ją map.
Każda kafelka to obrazek o rozdzielczości 10 na 10 pikseli (czyli, cała mapa po wyrenderowaniu miałaby wymiary 100*10 na 100*10).
Znamy także pozycję gracza: PlayerX oraz PlayerY.
Jeżeli korzystamy z silnika graficznego, który obsługuje poruszanie kamerą, wystarczy narysować mapę na pozycji (0, 0), a kamerę ustawić na pozycję (PlayerX*rozmiar kafelki+szerokość ekranu/2, PlayerY*rozmiar kafelki+wysokość ekranu/2).
Informacja: przyjmujemy, że PlayerX oraz PlayerY są z zakresu 0..szerokość mapy oraz 0..wysokość mapy (stąd mamy mnożenie przez rozmiar kafelki, jeżeli pozycja gracza jest adresowana per pixel, a nie per kafelka, należy pominąć to mnożenie).
W przypadku, gdy nie mamy możliwości zmiany pozycji kamery, gracza należy narysować na pozycji (szerokość ekranu/2, wysokość ekranu/2) (czyli na środku ekranu), a mapę na pozycji (-PlayerX*rozmiar kafelki, -PlayerY*rozmiar kafelki).


Nie jestem pewien cd.ostatniego wzoru, zaraz jeszcze sprawdzę czy nie gadam bzdur ;)
0

mspaint włączyłem na moment, kodu nie klepałem. Dla zrozumienia gracz ma 1 pixel
http://iv.pl/images/26975044275371111290.jpg

nie wiem co z tego wyjdzie bo na razie miałem zmienną globalną dla gracza z pozycją X, Y i rysowałem go na ekranie na tej pozycji aktualnej. To będę musiał pokombinować trochę z tym wszystkim

0

Jak niczego nie zwaliłem, do tej (i nie tylko) mapy powinny pasować te wzory:

conts
ekran_width=3
ekran_height=3

map_width=15
map_height=3

player_width=1
player_height=2

player_x = 8
player_y = 2

{
x:=(player_width+ekran_x/2)-player_x;
y:=(player_height+ekran_y/2)-player_y;
DrawMap(x,y);
}
0

zanim odświeżyłem temat, to sam coś zrobiłem po swojemu i

for x:= Gracz.PozycjaX - 2 to Gracz.PozycjaX + 2 do
begin
y11:= 0;
for y:= Gracz.PozycjaY - 2 to Gracz.PozycjaY+ 2 do
begin
i reszta kodu

i ta zmianna Gracz.PozycjaX i Y to pozycja gracza, aktualna, czyli może mieć nawet X 500, Y 466. A x11 i y11 to dodatkowe zmienne, które dodałem właśnie, one będą miały w pętli wartość od 0 do 4, czyli 5x5 kratek na ekranie się wyświetli (razy szerokość/wysokość obrazka).
Tym sposobem udało mi się wyświetlać gracza na środku, bo ustawiłem go
RysujGracza(gracz, 2100, 2100);
czyli zawsze jest rysowany na środku, choć jedno pozycja X i Y zmienia się przy poruszaniu się. Kolizje mi działają dobrze jak na razie.

teraz mam inny problem, bo jak grę odpalam to mam na starcie ustawione złoto na 500 sztuk złota, myszką jak ruszam na ekranie to wyświetla się pozycja X i Y myszki aktualna i teraz jak gracz jest na środku zawsze, a obrazki są rysowane od pozycji 0, 0 to pozycja myszy też ma od 0, 0 do 5, 5... i nie wiem jak teraz położyć coś na ekranie przy takich pozycjach myszy dziwnych bo jak odejdę postacią od początku mapy np. 200 kroków w prawo i w dół to w lewym górnym rogu ekranu będzie pozycja myszy X, Y 0, 0 czyli jak tam kliknę to (złoto się odejmuje, czyli zbudowałem coś) obrazek rysuje się wtedy na pozycji mapy 0, 0, a nie tam gdzie jestem, czyli na około 200, 200. Jakieś pomysły?

0

Dodawaj pozycję gracza do pozycji myszki?
Btw, skoro już gracz jest rekordem/klasą/wtf, to wypadałoby zrobić jego pozycję także rekordem (nawet istnieje wbudowany - TPoint).

0

k, dam już sobie radę, oby. Dzięki

ale patrz, jak włączam grę i gracz stoi na polu X, Y = 2, 2 to wtedy lewy, górny róg ma pozycję myszki 0, 0 więc jak do pozycji myszki dodam pozycję gracza, czyli 2, 2 to 0+2, 0+2 to wyjdzie lewy górny róg ekranu jako XY 2, 2 i mi zbuduje coś pode mną, a nie na pozycji 0, 0

0

k, już chyba mam
mysz_X:= GraczX + (X div 100) - 2; // a to 100 to wymiary obrazka, dla przykładu mogą mieć 100x100 pixeli
mysz_Y:= GraczY + (Y div 100) - 2;

przy założeniu, że wyświetlam 5x5 obrazków (czyli X ma od 0 do 4, a gracz stoi na środku, czyli na X = 2, dokładnie XY 2,2).
Poszedłem postacią ze 30 kroków na prawo z 6 kroków na dół i postawiłem obrazki i dobrze postawiło

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