Probleme mit Type und Animation

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Ziggy

Betreff: Probleme mit Type und Animation

BeitragDo, Dez 06, 2007 15:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Mein Problem:

Ich habe einen Type für Schüsse und eine Animation wenn der Schuss den Bildschirmrand trifft, dann soll die Patrone quasi explodieren.

Leider wird (vermutlich durch den Type) immer pro Patrone nur ein Frame der Animation abgespielt.


So siehts aus: (nur das wichtigste)

Code: [AUSKLAPPEN]

   For s.shot = Each shot
      s\px = s\px + wpnspeed
      DrawImage wpnimg,s\px,s\py         
      If s\px > gfxWidth-50 Then
         s\dead = 1
         For I = 0 To 5
            DrawImage expl1,s\px,s\py,I
         Next
      EndIf
      If s\dead Delete s.shot
   Next


Ich vermute stark dass die IF-Schleife für die Animation einfach an der Stelle nicht funktionert, da ich aber die s\px (Position des Schusses) nur in der For...Next-Anweisung verwenden kann kann ich die IF-Schleife nirgendwo anders unterbringen.

Die Schussposition brauche ich später wenn ich diese Animation abspielen will wenn z.B. ein Gegner angerannt kommt. Dann ändert sie sich ja.

Warscheinlich hab ich nur nen Denkfehler, wäre nett wenn ihr mir da weiterhelfen könntet.

Gruß.
"Es gibt 10 Arten von Menschen: Diejenigen die Binär verstehen, und jene die es nicht verstehen."

"Irren ist menschlich, gut dass ich ein Gott bin... xD"

letzte Informatik-Note : 1 ... 96% richtig, Thema: C++ switch/case

Xeres

Moderator

BeitragDo, Dez 06, 2007 15:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
If s\px > gfxWidth-50 Then
         s\dead = 1
         For I = 0 To 5
            DrawImage expl1,s\px,s\py,I
         Next
      EndIf
Du zeichnest alle Frames übereinander und löschst den Type danach -> so sieht man nie eine Animation.
Lösungsmöglichkeit wäre s\dead als Framenummer anzugeben, herunterzuzählen und dann irgendwann zu löschen, oder für den Type eine Extra variable für den Frame zu deklarieren, und dann sowas wie
If s\dead=1 and s\frame=5 then Delete s.shot
zu benutzen... je nach dem was dir sinnvoller erscheint.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Ziggy

BeitragDo, Dez 06, 2007 15:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habs jetzt mal so probiert:

Code: [AUSKLAPPEN]

   For s.shot = Each shot
      s\px = s\px + wpnspeed
      DrawImage wpnimg,s\px,s\py      
      If s\px > gfxWidth-50 Then
         s\dead = 1
         For I = 0 To 5
            DrawImage expl1,s\px,s\py,I
            If s\dead And I=5 Delete s.shot
         Next
      EndIf
   Next


Eigentlich sollte es so funktionieren, der Schuss bleibt ja jetzt bis zum Ende der Animation bestehen.

Ich habe herausgefunden dass einfach nur die Animation zu schnell abgespielt wird, so dass man nur den ersten Frame sieht.

Also brauche ich nur noch einen Timer der die Animation verlangsamt.... Laughing
"Es gibt 10 Arten von Menschen: Diejenigen die Binär verstehen, und jene die es nicht verstehen."

"Irren ist menschlich, gut dass ich ein Gott bin... xD"

letzte Informatik-Note : 1 ... 96% richtig, Thema: C++ switch/case

Xeres

Moderator

BeitragDo, Dez 06, 2007 15:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Nochmal ganz eindeutig: Keine For...Next Schleife!
Es wär im Grunde nichts anderes als du vorher gehabt hast. Du musst nach jeder Aktualisierung, d.h. jedesmal wenn du den Frame geändert und das passende Bild angezeigt hast, das Programm weiterlaufen lassen bis flip erreicht wurde - sonst wird das nie was.
Kick diese schleife da raus, und mach eine schlaue If...Then Bedingung rein, wann der Frame geändert und wann gelöscht werden soll...
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Ziggy

BeitragDo, Dez 06, 2007 16:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:

Nochmal ganz eindeutig: Keine For...Next Schleife!



Gut ... leider weiss ich nicht wie ich mit einer IF-Anweisung die Frames immer um einen erhöhen kann....

Was ich bisher hinbekommen hab:
Code: [AUSKLAPPEN]

   For s.shot = Each shot
      s\px = s\px + wpnspeed
      DrawImage wpnimg,s\px,s\py      
      If s\px > gfxWidth-50 Then
         s\px = gfxWidth-50
         If frame < 6 Then         
            frame = frame + 1
            DrawImage expl1,s\px,s\py,frame
            s\dead = s\dead + frame
         EndIf
      EndIf
      If s\dead = 6 Delete s.shot
   Next


Damit wird der Frame aber nur um 1 erhöht...
Mit fehlt wohl das Verständnis dafür.
"Es gibt 10 Arten von Menschen: Diejenigen die Binär verstehen, und jene die es nicht verstehen."

"Irren ist menschlich, gut dass ich ein Gott bin... xD"

letzte Informatik-Note : 1 ... 96% richtig, Thema: C++ switch/case

Xeres

Moderator

BeitragDo, Dez 06, 2007 16:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Sieht doch schon nicht ganz falsch aus. Jetzt brauchst du nur den entsprechenden Field Eintrag für den Type, sonst wäre ja "frame" für alle Types gleich, nicht?

Wenn s\dead = 1 Dann
zeichne entsprechendes Bild
erhöhe s\frame um eins

Wenn s\dead = 1 und s\frame = 5 (z.B) Dann Lösche diesen Eintrag.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Ziggy

BeitragDo, Dez 06, 2007 16:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Unglaublich.... es funktioniert wie geschmiert.

Auch wenn ich noch nicht vertstanden habe weshalb es mit "s\frame" funktioniert und mit einer globalen Variable "frame" nicht Sad
Aber da komm ich auch noch hinter.

Mein Code nochmal:
Code: [AUSKLAPPEN]

   For s.shot = Each shot
      s\px = s\px + wpnspeed
      DrawImage wpnimg,s\px,s\py      
      If s\px > gfxWidth-50 Then
         s\px = gfxWidth-50
         If s\frame < 6 Then         
            s\frame = s\frame + 1
            DrawImage expl1,s\px,s\py,s\frame
            s\dead = s\dead + s\frame
         EndIf
      EndIf
      If s\dead = 6 Delete s.shot
   Next


Hoffentlich alles so wie du es meintest Xeres.
Ich danke für die Hilfe.
"Es gibt 10 Arten von Menschen: Diejenigen die Binär verstehen, und jene die es nicht verstehen."

"Irren ist menschlich, gut dass ich ein Gott bin... xD"

letzte Informatik-Note : 1 ... 96% richtig, Thema: C++ switch/case

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group