Explosion an der richtigen Stelle (bzw Fehler)
Übersicht

![]() |
M0rgensternBetreff: Explosion an der richtigen Stelle (bzw Fehler) |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
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
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
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... |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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..... ![]() ![]() ![]() lg, M0rgenstern |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Boah, es funtkioniert.
Vielen Vielen Dank. Jetzt kann ich endlich weiter machen. Dankeschön. lg, M0rgenstern |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group