SDL schneidet mehrere Oberflächen gleichzeitig

10

Ich versuche ein Plattformspiel zu schreiben, bei dem die Sprites für die Level-Hintergründe in 512x512 Teile aufgeteilt sind. Ich speichere 3 Blöcke gleichzeitig und versuche, Code zu schreiben, um alle drei auf den Bildschirm zu bringen. Hier ist der aktuelle Code, den ich habe:

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);

Das Problem, auf das ich stoße, ist, dass nur der Block auftaucht, der zuerst aufgebrochen wird. Der Rest wird nicht auf dem Bildschirm angezeigt. Ich denke, das Problem hat möglicherweise etwas mit Alpha-Transparenz zu tun, aber selbst wenn sich die Chunks überhaupt nicht überlappen, können sie immer noch nicht verschwinden. In anderen Teilen des Codes werden mehrere Dinge gleichzeitig auf dem Bildschirm angezeigt, z. B. Zeichen und Hintergründe, und alle werden korrekt angezeigt. Dieses spezielle Codesegment ist der einzige Bereich, in dem dieses Problem auftritt.

Bildschirmfoto

Wenn ich die Zeile auskommentiere, die left_chunk überblendet, ändert sich dies in Folgendes:

Screenshot nach

extropischer Motor
quelle
Sind Sie sicher, dass Ihre berechneten X-Werte das Bild im sichtbaren Bereich des Bildschirms positionieren?
Zack The Human
@ZackTheHuman Sie befinden sich teilweise außerhalb des Bildschirms, da der Bildschirm nur 300 x 175 und die Kartenblöcke 512 x 512 sind. Ich dachte, dass dies zunächst das Problem gewesen sein könnte, aber ob sie auf dem Bildschirm angezeigt werden oder nicht, scheint für das korrekte Rendern irrelevant zu sein. Ich kann einen Screenshot hochladen, um das Problem zu veranschaulichen.
Extropic-Motor
1
Die SDL-Dokumentation besagt, dass SDL_BlitSurface das endgültige Rechteck nach dem Blitting in dstrect speichert. Haben Sie versucht, die where- Variable nach jedem Blit zurückzusetzen?
Asakeron
@ Asakeron Das war es! Ich hatte nicht erwartet, wo geändert werden sollte. Sie sollten Ihren Kommentar zu einer Antwort machen!
Extropic-Motor

Antworten:

8

Die SDL-Dokumentation besagt, dass SDL_BlitSurface das endgültige Rechteck nach dem Blitting in dstrect speichert. Das Zurücksetzen der where- Variablen behebt das Problem.

Asakeron
quelle