Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

22.01.2010, 21:59

SDL-Spiel Erweiterung (Animiertes Raumschiff bei Abschuss)

Hallo!

Ich versuche im Moment das SDL Spiel aus Kapitel 12 zu erweitern, und habe folgendes Problem:

Ich habe ein animiertes Raumschiff Sprite hinzugefügt, das, sobald es von einem Schuss getroffen wurde, nach einer "Explosions-Animation" vom Bildschirm verschwinden soll. Momentan sieht das ganze bei mir so aus:

http://www.youtube.com/watch?v=KyVRQV9Cd34



Hier das Sprite:


(Link)


Wie man sieht läuft die Animation die ganze Zeit durch, das soll sie aber eben nicht. Weiterhin sollen die Frames, die die Explosion darstellen, nur dann gezeigt werden, wenn das Raumschiff mit einem Schuss kollidiert.
Wisst ihr wie ich dieses Problem lösen kann?




Außerdem würde ich noch gerne wissen:


1.) ist es nötig, das ich eine eigene Kollisionsklasse für alle verschiedenen Sprites mache, oder wie würdet ihr das handhaben?

2.) Die Raumschiffe werden, wie die Asteroiden, in einer Liste bearbeitet. Ist das eine gute Idee?






Hier noch der Quellcode der das Sprite betrifft:

(Header) CEnterpriseBoom - http://codepad.org/XMsNL1ff

(Source) CEnterpriseBoom -http://codepad.org/TnTYWnli

Kollision - http://codepad.org/c615BE8M




Solltet ihr auch Erweiterungen haben wäre es toll wenn ihr mir die per pm oder sonst wie schicken könntet, ich lerne am meisten durch code reviews und ausprobieren. Ich bin für jedes bisschen Hilfe dankbar!

(Falls ihr noch einen Code Ausschnitt braucht lade ich den natürlich hoch, aber an sich ist der Code fast identisch mit der Version im Buch) :)

ich1994

Treue Seele

Beiträge: 164

Wohnort: Erlangen(nähe Nuernberg)

Beruf: Bald Abiturient(kein job eig...)

  • Private Nachricht senden

2

22.01.2010, 22:56

1. Wie hast du denn die Animation gemacht :D
2. Vergleiche die Rect's vom Shot und der Enterprise in einer if-Bedingung
(Wie bei dem Asteroid) und dann erst dann die animierten Frames hintereinander ablaufen. und denn bei else gibst du den Sprite nur den ersten Frame.

MfG

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

3

23.01.2010, 14:15

du zeigst immer nur das erste bild und startest die animation erst wenn das schiff getroffen wurde. dafür kannst du eine bool variable benutzen und einen zähler der runter gezählt wird, der bestimmt welche phase du gerade anzeigst und wenn er unter 0 ist wird das sprite komplett entfernt.

achja. bitte glaube nicht, dass du nach dem buch von Heiko Kalista alles weißt was du brauchst. es führt dich zwar in alle aspekte ein aber es geht nicht gerade ins detail. jetzt kannst du verstehen was in größeren handbüchern und weiterführender lektüre erklärt wird. das solltest du auch nutzen und dich weiter bilden.
dazu empfehle ich erst dieses buch:
http://www.amazon.de/von-bis-Mit-CD-ROM-…61169130&sr=8-1
und dann dieses:
http://www.amazon.de/Effektiv-programmie…64255786&sr=1-1

das ist ein langer weg aber dann solltest du sehr gut programmieren können. es lohnt sich.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

4

25.01.2010, 19:05

Das mit der Variable werde ich probieren, danke euch. :)
Das Buch "C++ von A bis Z" habe ich auch, ist echt gut, nur habe ich im Moment noch etwas schwierigkeiten mit OOP allgemein, also was wo hin kommt bei Spielen, werde mir mal mehr source code angucken und rumprobieren. ;)


EDIT:
Ich kriege es mit dem code Beispiel aus dem Buch irgendwie nicht hin, denn ich habe folgendes Problem in der Collision Klasse:

Ist ein Raumschiff abgeschossen, wird es direkt aus der Liste für die Raumschiffe gelöscht, d.h., ich kann die Animation danach gar nicht mehr rendern.

C-/C++-Quelltext

1
2
3
4
5
     // Asteroid löschen, falls deaktiviert

    if (ItEnterpriseBoom->IsAlive () ) 
      ItEnterpriseBoom++;
    else
    ItEnterpriseBoom = m_EnterpriseListBoom.erase (ItEnterpriseBoom);



Ist es normal, die Sprites direkt in der Kollisionsklasse zu zerstören?
Wenn die Raumschiffe nicht direkt zerstört würden, könnte ich sie ja alle problemlos mit meiner Animation rendern, aber dann ist die Frage, wo ich die Dinger zerstören lassen soll. In der Update Klasse etwa?

Hier nochmal der verlängerte Code:

Collision: http://codepad.org/IL1zAWqc

Update: http://codepad.org/D2GjinvQ

5

27.01.2010, 14:29

Ich hab das Problem jetzt gelöst:

http://www.youtube.com/watch?v=fKas-6bHuWc


Das Spiel läuft einwandfrei, aber sobald ich es beende, kommt folgende Fehlermeldung:


(Link)


Jetzt würde ich gerne mal wissen wie ich so ein Problem beheben soll, denn hier kann ich nicht, wie sonst, direkt zur Fehlerquelle "springen" und es ändern. Wo soll denn diese Position 0x000000c zum Beispiel sein? Welche Tricks gibt es, solche Fehler aufzuspüren? Wie man auf dem Bild erkennen kann benutze ich VC 2008.

6

27.01.2010, 16:06

Lokalisiere den Fehler mal noch genauer

Der Fehler scheint aufzutreten, weil du versuchst noch einmal mit einem auf NULL gesetzten Zeiger einen Wert zu lesen. Vermutlich hast du zuvor den Zeiger um 0xc (12) vergrößert.
Versuch mal mit Hilfe von Konsolenausgaben den Fehler einzuschränken. Vielleicht liegt er auch in einer SDL-Funktion.
Hast du eigentlich als Debug oder als Release kompiliert?

7

28.01.2010, 18:30

Ich habe im Debug kompiliert und der Fehler ist mittlerweile weg, bin einfach mal alle Debug-Methoden (/MDd etc.) durchgegangen aber habe sonst nichts geändert... ziemlich merkwürdig.

Würde es denn überhaupt einen Unterschied machen wenn mit Release kompiliere?

8

28.01.2010, 21:29

Bei der Release compilierung kommen die Debug Informationen nicht in den Programmcode. Somit kann es passieren, dass er ebene nicht bei einem Fehler zu der Ursache springt. Außerdem optimiert er bei Release, was ein Finden des Fehlers im Quellcode noch schwieriger machen dürfte.

9

06.02.2010, 20:57

Ich möchte jetzt das Programm so umschreiben, dass der Spieler bei Kollision mit einem Raumschiff explodiert. Das funktioniert schon einigermaßen wie man in diesem clip sieht:
http://www.youtube.com/watch?v=ycb06ONV7ds

Hier der Teile vom code, der Rest ist fast identisch mit dem Beispiel im Buch:
http://codepad.org/n5JpfHLW


Mir ist aufgefallen, dass der Spieler kein "SDL_Rect" in der Klasse hatte, habe deswegen ein SDL_Rect hinzugefügt und den Rest entsprechend angepasst. Wenn der Spieler sich bewegt (ProcessMoving) werden die Koordinaten im Rect gespeichert. Warum funktioniert das nicht richtig? Wie hättet ihr das Problem gelöst?

P.S.: Der Colorkey ist extra ausgeschaltet und das Spielerraumschiff verschwindet bei Kollision nicht damit man es besser erkennen kann


EDIT: Problem gelöst!

Bei der Kollisionsüberprüfung musste ich folgendes ändern:
RectPlayer.w/11 ( 11 = Anzahl Frames auf dem Spritesheet)

Die Breite (RectPlayer.w) war vorher immer so breit wie das gesamte Sprite. Weshalb man das bei der Kollision mit den Asteroiden nicht machen muss verstehe ich trotzdem irgendwie nicht... die sind doch auch auf einem Spritesheet mit 20 Frames.. :?:

10

07.02.2010, 10:50

War es nicht so, dass das Rect jeweils auf den aktuellen Ausschnitt vom Bild zeigt. Also auf den einzelnen Frame.
PS: Ansonsten kannst du das doch auch mir den Positionen vergleichen. Die sollte jedes Objekt ja haben.

Werbeanzeige