Explosion an der richtigen Stelle (bzw Fehler)

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

M0rgenstern

Betreff: Explosion an der richtigen Stelle (bzw Fehler)

BeitragSo, Aug 10, 2008 16:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo an alle.
Ich schreib im Moment einen kleinen Spaceshooter und hab jetzt folgendes Problem:
Ich möchte eine Explosion (animiert) an der Stelle anzeigen, an der ein Gegnger ist (wenn er getroffen wurde)
Eigentlich funktioniert alles wunderbar ohne explosion.
Gegnertyp wird bei Treffer gelöscht etc.
Jetzt habe ich die Animation eingebunden und bekomme folgenden Fehler: "Variable must be a Type"
Und die Stelle wird makiert wo das Draw Image für die Explosion steht.
Hier der Code für die kollision/Explosion und die Variablen:

Variablen deklarieren:
Code: [AUSKLAPPEN]

;Explosion:
Global explosion = LoadAnimImage ("spielg/explodeA.bmp",65,50,0,9)
MaskImage explosion, 256,0,255
ResizeImage explosion, 65,65
;-----------------**

;Der hier ist nur zum Test:
Global char1 = LoadImage("spielg\gegner2.bmp")
MidHandle char1
ResizeImage char1, 65,65
Const ENEMYSPEED = 2
Global enemyFrame = 0
Type Tgegner1
   Field x,y
   Field tot
   Field image
   Field frame
End Type 
;--------------**



Hir die Kollsion/Das Problem:
Code: [AUSKLAPPEN]

Function GegnerGetroffen() ;Gegner getroffen?
   
   For gegner1.Tgegner1= Each Tgegner1 ;Jeder Gegner
      If gegner1\x <= -10
         Delete gegner1.Tgegner1 ;Gegner außer Sicht? -> Löschen
      Else
         For info.Tshotp = Each Tshotp
            If Not gegner1.Tgegner1 = Null
          If ImagesCollide(gegner1\image,gegner1\x,gegner1\y,0,info\image,info\shotp_x,info\shotp_y,0) Then ;Wenn die bilder kollidieren
               Delete gegner1.Tgegner1 ;Gegner löschen
               Delete info.Tshotp ;Kugel löschen
                 ;Die Explosion:
                  If MilliSecs()>tmrExplo + 100 Then
                     tmrExplo = MilliSecs()
                     frameEX = (frameEX+1) Mod 9
                  EndIf
              DrawImage explosion,gegner1\x,genger1\y,frameEX ;<-----DIESE ZEILE WIRD BEI DER MELDUNG ;MARKIERT!

          EndIf
         EndIf
         Next
      EndIf
   Next
   
End Function
;-----------------**


Wäre echt lieb wenn mir da jemand helfen könnte (Bin noch Anfänger)
Achja, Forensuche hab ich nix gefunden bzw nix was da passt...

Danke schonmal im Vorraus
gruß, M0rgenstern

Xeres

Moderator

BeitragSo, Aug 10, 2008 17:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Nach dem ImagesCollide löschst du die Type-Einträge, deren Koordinaten du brauchst, um die Explosion dar zu stellen.
- Für Explosion einen eigenen Type benutzen
- Types Löschen wenn auf sie sicher nicht mehr zugegriffen wird oder eine Variable "tot" o.ä. auf True schalten und ganz am ende der Update-Funktion alle so markierten Types löschen.
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)

M0rgenstern

BeitragSo, Aug 10, 2008 18:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich hab jetzt folgednes geändert:
(Type: ExplosionA):
Da ist jetzt aber folgendes Problem. An der markeirten Stelle bei der "neuen" Explosion bekomm ich angezeigt: "Variable must be a Type"
Code: [AUSKLAPPEN]

;Explosion:
Global explosion = LoadAnimImage ("spielg/explodeA.bmp",65,50,0,9)
MaskImage explosion, 256,0,255
ResizeImage explosion, 65,65

Type TExplosionA
 Field x,y
 Field imageEx
 Field frameExp
 Field tmrEx
End Type
;--------


;Explosion für Gegner:
Global gegnerExplo.TExplosionA = New TExplosionA
 gegnerExplo\x = gegner1\x ;<---- HIER IST DAS NÄCHSTE PROBLEM!
 gegnerExplo\y = gegner1\y
 gegnerExplo\imageEx = explosion
 gegnerExplo\frameEx = gegnerExplo\frameEx
 gegnerExplo\tmrEx = MilliSecs()


Und der Rest:
Funktion GegnerKollision:
Code: [AUSKLAPPEN]

Function GegnerGetroffen() ;Gegner getroffen?
   
   For gegner1.Tgegner1= Each Tgegner1 ;Jeder Gegner
      If gegner1\x <= -10
         Delete gegner1.Tgegner1 ;Gegner außer Sicht? -> Löschen
      Else
         For info.Tshotp = Each Tshotp
            If Not gegner1.Tgegner1 = Null
          If ImagesCollide(gegner1\image,gegner1\x,gegner1\y,0,info\image,info\shotp_x,info\shotp_y,0) Then ;Wenn die bilder kollidieren
               info\treffer = 1
               gegner1\tot = 1
               ExploGegner()
               delboth()
          EndIf
         EndIf
         Next
      EndIf
   Next
   
End Function


und dann die Funktion "delboth" und "ExploGegner":

Code: [AUSKLAPPEN]

Function ExploGegner()
      ;Die Explosion:
      If MilliSecs()>gegnerExplo\tmrEx + 100 Then
         gegnerExplo\tmrEx = MilliSecs()
         gegnerExplo\frameEx = (gegnerExplo\frameEx+1) Mod 9
       EndIf
       DrawImage gegnerExplo\imageEx,gegnerExplo\x,gegnerExplo\y,gegnerExplo\frameEx
End Function
;-----------------**

Function delboth()
 If info\treffer = 1 Then Delete info.Tshotp
 If gegner1\tot = 1 Then Delete gegner1.Tgegner1
End Function


Hat jemand ne Ahnung woran das jetzt schon wieder liegt?

Lg, M0rgenstern
  • Zuletzt bearbeitet von M0rgenstern am So, Aug 10, 2008 19:14, insgesamt einmal bearbeitet

Xeres

Moderator

BeitragSo, Aug 10, 2008 19:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Was ist gegner1 bzw. gegner2 ? Sind die da überhaupt schon definiert?
Du musst bei einer Kollision eine neue Explosion erzeugen, nicht einen einzigen Globalen Typeeintrag verändern...
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)

M0rgenstern

BeitragSo, Aug 10, 2008 19:15
Antworten mit Zitat
Benutzer-Profile anzeigen
So, habs geändert, sry, Tippfehler... Gibt kein Gegner2...
Also gegner1\x ist die x position eines gegners.
(Gegner wurde mit Type erstellt...)
Jeder Gegner wird an ner zufälligen y position erstellt...

Xeres

Moderator

BeitragSo, Aug 10, 2008 19:24
Antworten mit Zitat
Benutzer-Profile anzeigen
So oder so ist es sinnlos da ein TExplosionA zu erstellen. Schreib dir lieber eine Funktion, die Koordinaten erwartet und aufgerufen wird, wenn eine Kollision stattfindet. Dann alle TExplosionA durchgehen und den passenden Frame zeichnen bzw. wieder löschen.
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)

M0rgenstern

BeitragSo, Aug 10, 2008 20:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Also wie genau das meinst mit dem "alle TExplosionA durchgehen und den passenden frame zeichnen" kapier ich irgwie net, sry.
Kannst du mir vllt bitte ein Beispiel geben?

LG, M0rgenstern

Xeres

Moderator

BeitragSo, Aug 10, 2008 20:33
Antworten mit Zitat
Benutzer-Profile anzeigen
In etwa so...
Code: [AUSKLAPPEN]
Global explosion = LoadAnimImage ("spielg/explodeA.bmp",65,50,0,9)
MaskImage explosion, 256,0,255
ResizeImage explosion, 65,65


Type TExplosion
   Field x,y
   Field imageEx
   Field frameEx
   Field tmrEx
   Field die=False
End Type

;..........................................

Function GegnerGetroffen()
   ; Jede Menge Zeug
   
      ;WENN eine Kollision stattfindet:
   Create.TExplosion(gegner1\x, gegner1\y)
   
   ; Noch mehr Zeug
End Function

;...........................................

Function Create.TExplosion(X, Y)
   Local e.TExplosion = New TExplosion
   e\x = X
   e\y = Y
   e\imageEx = explosion
   e\frameEx = 0
   e\tmrEx = MilliSecs()
End Function   

;............................................

Function UpdateTExplosion()
   For Local e.TExplosion = Each TExplosion
      If MilliSecs()>e\tmrEx + 100 Then
         e\tmrEx = MilliSecs()
         e\frameEx = e\frameEx+1
         If e\frameEx = 9 Then e\die=True
      EndIf

      If e\die=True Then
         Delete e
      Else
         DrawImage(e\imageEx,e\x,e\y,e\frameEx)
      EndIf
   Next
End Function

Edit:
Das kommt vom schnellern zusammenkopieren... kleinigkeiten verbesser bzw. gekürzt.
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)

M0rgenstern

BeitragSo, Aug 10, 2008 21:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]

Function Create.TExplosion(X, Y)
   Local gegnerExplo.TExplosion = New TExplosion
   gegnerExplo\x = X
   gegnerExplo\y = Y
   gegnerExplo\imageEx = explosion
   gegnerExplo\frameEx = 0
   gegnerExplo\tmrEx = MilliSecs()
End Function     
;-----------------**


Function UpdateTExplosion()
   For Local  e.TExplosion = Each TExplosion ;<---- Hier tritt jetzt der Fehler "Expecting identifier" auf
      If MilliSecs()>e\tmrEx + 100 Then
         e\tmrEx = MilliSecs()
         e\frameEx = e\frameEx+1
         If e\frameEx = 9 Then e\die=True
      EndIf
      DrawImage(e\imageEx,e\x,e\y,e\frameEx)
     
      If e\die=True Then Delete e
   Next
End Function


In der ersten Zeile in der Funktion "UpdateTExplosion" tauch oben genannte Fehlermeldung auf.... wo muss ich das denn einbinden damit das funtzt?

lg, M0rgenstern.

Xeres

Moderator

BeitragSo, Aug 10, 2008 21:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du die Standart IDE verwendest, stell erst mal sicher das die Namen von Types und Fields überall korrekt geschrieben sind. Mit IDEal z.B. kannst du dir alle Types und Deklarierten Variablen farbig anzeigen lassen, das hilft bei der Fehlersuche.

Edit:
Mh, bin vll. zu sehr an Blitzmax gewöhnt...
Das sollte besser gehen:
Code: [AUSKLAPPEN]
Local e.TExplosion
   For e.TExplosion = Each TExplosion
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)

M0rgenstern

BeitragSo, Aug 10, 2008 21:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, ich hab Ideal nur der funtzt bei mir nicht weil der die exe von bb nicht findet.
Ich hab nur blitz2ddemo und das findet der nicht....

Eingeproggt

BeitragSo, Aug 10, 2008 21:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Hast du unter Settings - Preferences, in der ersten Registerkarte "Compilers" den Standardcompiler "Blitz3D"?
Wahrscheinlich ja.
Änder mal den Pfad zu deiner BB-Installation bzw. erstelle einen neuen Compiler (="Add New" und Set as default)

Dann sollte das mit IDEal hinhauen. (Auch wenn cih IDEal nie mit der BB-Demo getestet hab)

mfG, Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

M0rgenstern

BeitragMo, Aug 11, 2008 12:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, hab ich ja schon probiert.
Der findet die Blitzcc.exe (glaub ich) nicht... also den compiler selbst.


@ Xeres. Ich habs jetzt geändert und da gibts jetzt keine Probleme. Jetzt hab ich Probleme mit ner Abfrage:

Code: [AUSKLAPPEN]

Function GegnerGetroffen() ;Gegner getroffen?
   
   For gegner1.Tgegner1= Each Tgegner1 ;Jeder Gegner
      If gegner1\x <= -10
         Delete gegner1.Tgegner1 ;Gegner außer Sicht? -> Löschen
      Else
         For info.Tshotp = Each Tshotp
            If Not gegner1.Tgegner1 = Null
            If ImagesCollide(gegner1\image,gegner1\x,gegner1\y,0,info\image,info\shotp_x,info\shotp_y,0) Then
;Wenn die bilder kollidieren
               Create.TExplosion(gegner1\x, gegner1\y)
               info\treffer = 1
               gegner1\tot = 1
          EndIf
         EndIf
         Next
      EndIf
   Next
If info\treffer=1 Then ;<------ Da erscheint nun die Fehlermeldung "Object does not exist"
deleted()
EndIf
   
End Function


anstatt info\treffer=1 könnt ich auch gegner1\tot=1 schreiben. Funtzt beides nicht. und ja, ich habs eingebunden,. undzwar so:

Code: [AUSKLAPPEN]

;"GEGNER":
Function CreateEnemy()
   
   enemyCreator = enemyCreator+1
   If enemyCreator >= 200 ; kreire jeden 120 Durchlauf einen Gegner
       Local wert = Rand(44,509)  ; auf einer zufälligen Position
     If wert <= Y1BORDER
         wert = Y1BORDER + 3
      ElseIf wert >= Y2BORDER
         wert = Y2BORDER - 3
     EndIf
      Local wert2 = Rand(510,1010)  ; auf einer zufälligen Position
     If wert <= Y1BORDER
         wert = Y1BORDER + 3
      ElseIf wert >= Y2BORDER
         wert = Y2BORDER - 3
      EndIf

      gegner1.Tgegner1 = New Tgegner1
      gegner1\x = 1280
      gegner1\y = wert
      gegner1\tot = 0
      gegner1\image = char1
      gegner1\frame = 0
     
      enemyCreator = 0

      gegner1.Tgegner1 = New Tgegner1
      gegner1\x = 1280
      gegner1\y = wert2
      gegner1\tot = 0
      gegner1\image = char1
      gegner1\frame = 0
     
      enemyCreator = 0


   
   EndIf

   For gegner1.Tgegner1 = Each Tgegner1
      gegner1\x = gegner1\x - ENEMYSPEED
      DrawImage gegner1\image,gegner1\x,gegner1\y
   Next
     
End Function


und der schuss:

Code: [AUSKLAPPEN]

;SCHUSS FÜR DEN SPIELER:
Function playershoot() ;Funktion für die Schüsse des Spielers
     

    If (Schusstimer + 500 < MilliSecs()) Then
     If KeyHit(57) Then
         info.Tshotp = New Tshotp           ;hier wird der schuss erstellt
         info\shotp_x = player\x+15     ;nicht AUF dem spieler
         info\shotp_y = player\y         ;Selbe Stelle wie spieler
         info\image = schussp
         shotp_counter = 0              ; Zähler wieder auf null
         info\treffer = 0
         Schusstimer = MilliSecs()

     EndIf ;direkt schießen
    EndIf
   
   

;Für jeden Schuss:
     For info.Tshotp = Each Tshotp                             
         info\shotp_x = info\shotp_x+6                       ; die Schüsse werden um +8 nach rechts bewegt
         DrawImage info\image,info\shotp_x,info\shotp_y           
         If shotp_x > 1280 Then Delete info.Tshotp
     Next
End Function
;-------------------**


langsam glaub ich BB mag mich einfach net..... Crying or Very sad Crying or Very sad Crying or Very sad
lg, M0rgenstern

Xeres

Moderator

BeitragMo, Aug 11, 2008 14:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Muss ja auch ein NULL Objekt sein, denn Next schaltet immer einen Eintrag weiter in der Liste. Wenn die For...Next Schleife von info.Tshotp durchgelaufen ist, zeigt info auf NULL weil das nunmal hinter dem letzten eintrag in der Liste folgt.
Löschen einfach ans ende der Aktuallisierungsschleife setzten:
Code: [AUSKLAPPEN]
;Für jeden Schuss:
For info.Tshotp = Each Tshotp                             
   info\shotp_x = info\shotp_x+6                   
   DrawImage info\image,info\shotp_x,info\shotp_y           
   ;If shotp_x > 1280 Then Delete info.Tshotp  ;<<<< fehlt da nicht ein info\ ?
   If info\shotp_x > 1280 Then info\treffer=1
   
   If info\treffer=1 Then Delete info.Tshotp
Next
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)

M0rgenstern

BeitragMo, Aug 11, 2008 15:37
Antworten mit Zitat
Benutzer-Profile anzeigen
uja hat gefehlt. thx

Wo muss ich denn jetzt die funktion UpdateExplosionA() einfügen? ansonsten klappt alles... Vielen Dank (bekomm nur halt keine Explosionen angezeigt weil ich net weiß wo ich die Funktion UpdateExplosionA() aufrufen muss)
Gruß, M0rgenstern

Xeres

Moderator

BeitragMo, Aug 11, 2008 16:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Na das Updaten erfolgt irgendwo in der Hauptschleife, so wie Schüsse, Gegner usw.
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)

M0rgenstern

BeitragMo, Aug 11, 2008 16:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Boah, es funtkioniert.
Vielen Vielen Dank.
Jetzt kann ich endlich weiter machen.
Dankeschön.

lg, M0rgenstern

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group