SDL blending wielu powierzchni jednocześnie

10

Próbuję napisać platformówkę, w której duszki dla poziomów tła są podzielone na kawałki 512 x 512. Trzymam w pamięci 3 porcje na raz i próbuję napisać kod, żeby wszystkie trzy były na ekranie. Oto aktualny kod, który mam:

SDL_Rect where;
where.y = -game->camera->y;

where.x = -game->camera->x - MAP_WIDTH;
SDL_BlitSurface(left_chunk, NULL, screen, &where);

where.x = -game->camera->x;
SDL_BlitSurface(center_chunk, NULL, screen, &where);

where.x = -game->camera->x + MAP_WIDTH;
SDL_BlitSurface(right_chunk, NULL, screen, &where);

Problem, na który wpadam, polega na tym, że którykolwiek fragment zostanie zblokowany jako pierwszy, pojawia się tylko jeden. Reszta nie pojawia się na ekranie. Myślę, że problem może mieć coś wspólnego z przezroczystością alfa, ale nawet jeśli fragmenty w ogóle się nie pokrywają, nadal nie mogą się zepsuć. W innych częściach kodu ściemniam na ekranie wiele rzeczy naraz, takich jak znaki i tła, i wszystkie one wyświetlają się poprawnie. Ten konkretny segment kodu jest jedynym obszarem, w którym napotykam ten problem.

Zrzut ekranu

Jeśli skomentuję wiersz, który blits left_chunk, zmienia się w następujący sposób:

Zrzut ekranu po

silnik zewnętrzny
źródło
Czy jesteś pewien, że obliczone wartości X pozycjonują obraz w widocznym obszarze ekranu?
Zack The Human
@ZackTheHuman Są częściowo poza ekranem, ponieważ ekran ma tylko 300 x 175, a fragmenty mapy mają 512 x 512. Pomyślałem, że może to być problem na początku, ale to, czy są wyświetlane na ekranie, czy nie, wydaje się nie mieć znaczenia, czy renderuje się poprawnie, czy nie. Mogę przesłać zrzut ekranu, aby zilustrować problem.
silnik pozagiełdowy
1
Dokumentacja SDL mówi, że SDL_BlitSurface zapisuje końcowy prostokąt do rozprostowania po blittingu. Czy próbowałeś zresetować zmienną where po każdym blit?
Asakeron
@Asakeron To było to! Nie spodziewałem się, gdzie mam zostać zmodyfikowany. Twój komentarz powinien być odpowiedzią!
silnik z napędem zewnętrznym

Odpowiedzi:

8

Dokumentacja SDL mówi, że SDL_BlitSurface zapisuje końcowy prostokąt do rozprostowania po blittingu. Ponowne wpisanie zmiennej gdzie rozwiązuje problem.

Asakeron
źródło