Problem mit dem Löschen von Variablen

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

CppAmateur

Betreff: Problem mit dem Löschen von Variablen

BeitragFr, Aug 05, 2005 23:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich bin grad daran, mein erstes Spiel in BlitzBasic zu programmieren. Man selbst ist ein Raumschiff und man wird von Kanonen angegriffen. Wenn man einen Kanonenschuss mit der eigenen Kanone zerstört, bekommt man Punkte. Der Spieler kann nur 30 Schüsse gleichzeitig auf dem Feld haben, der Gegner 900. Außerdem sollen bei einer Kollision beide Schüsse zerstört werden und daran hapert es. Hier der Code:
BlitzBasic: [AUSKLAPPEN]

Function ShotsCollide()
For i=1 To maxshots
If(shotex(i)=1)
For a=1 To maxoppshots
If(oppshotex(a)=1)
If ImagesCollide(arr_shotpic(i),shots(i)\x,shots(i)\y,0,arr_oppshotpic(a),oppshots(a)\x,oppshots(a)\y,0)
pts = pts+10
ToDelete(i) = 1
OppToDelete(a) = 1
EndIf
EndIf
Next
EndIf
Next
For u=1 To 30
If(ToDelete(u)=1)
shotex(u) = 0
Delete shots(u)
EndIf
Next
For z=1 To oppmaxshots
If(OppToDelete(z)=1)
oppshotex(z) = 0
Delete oppshots(z)
EndIf
Next
End Function


Wenn man einen Schuss trifft, kann man selbst nicht mehr Schießen, der eigene Schuss wird zerstört, aber der des Gegners nicht. Also werden irgendwie alle 30 Werte von shotex auf 1 gestellt, was aber nicht sein soll.
Sieht irgendjemand den Fehler?

skey-z

BeitragSa, Aug 06, 2005 7:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Types würden dir sicherlich bei deinem Problem helfen, dann brauchst du nicht so viele Dims erstellen.

schau doch mal auf www.blitzbase.de nach, dort gibt es 2 tutorials zum Thema Types, sieht zwar auf den ersten Blick kompliziert aus, ist aber eigentlich recht einfach.
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz
BAC#57: 2. Platz
Twitter
 

CppAmateur

BeitragSa, Aug 06, 2005 21:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja,
das würde den Code vielleicht lesbarer machen, aber helfen würde es nicht.

x-pressive

BeitragMi, Aug 10, 2005 1:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Uii -das ist mal wirklich ein Paradebeispiel von Wuselcode -kein Wunder, daß du da den Überblick verlierst. Und dann verlangst du gleich von anderen, daß sie da durchsteigen. Das gibt Schmerzensgeld! Wink

Das der Code nicht eingerückt ist, wird wohl am Forum liegen, denn ich kann nicht glauben, daß jemand es schafft, ohne Einrückungen den Überblick zu behalten bei dem ganzen For-Next und If-Then-Gedönsel.

Schau mal, so sauber könnte das aussehen:

BlitzBasic: [AUSKLAPPEN]


Type TShot
Field x%
Field y%
Field Image%
End Type

Type TEnemyShot
Field x%
Field y%
Field Image%
End Type


Function ShotsCollide()

Local S.TShot
Local E.TEnemyShot

; LOOP THROUGH SHOTS
For S = Each TShot
For E = Each TEnemyShot
; COLLISION?
If ImagesCollide(S\Image, S\x, S\y, 0, E\Image, E\x, E\y, 0)
Delete S
Delete E
End If
Next
Next

End Function



Yeah baby, das ist der ZEN-Style des Programmierens. So sauber, daß man drauf essen kann Very Happy
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragMi, Aug 10, 2005 9:51
Antworten mit Zitat
Benutzer-Profile anzeigen
extra für das Forum habe ich mal den BB Code Former geschrieben,
das ist wohl in Vegessenheit geraten!
denn dann sieht der SuperCode oben etwa so aus :BlitzBasic: [AUSKLAPPEN]
Function ShotsCollide ()

For i = 1 To maxshots
If (shotex (i) = 1) Then
For a = 1 To maxoppshots
If (oppshotex (a) = 1) Then
If ImagesCollide (arr_shotpic (i) ,shots (i) \x,shots (i) \y,0,arr_oppshotpic (a) ,oppshots (a) \x,oppshots (a) \y,0) Then
pts = pts + 10
ToDelete (i) = 1
OppToDelete (a) = 1
EndIf
EndIf
Next
EndIf
Next

For u = 1 To 30
If (ToDelete (u) = 1) Then
shotex (u) = 0
Delete shots (u)
EndIf
Next

For z = 1 To oppmaxshots
If (OppToDelete (z) = 1) Then
oppshotex (z) = 0
Delete oppshots (z)
EndIf
Next
End Function

hier zu finden
http://people.freenet.de/rallimen/Basic


x-pressive:
du kannst in deiner Doppelschleife nicht beide Elemente löschen!
E.TEnemyShot geht, aber das S.TShot nicht, wenn es mehrere E.TEnemyShot gibt!
da S nicht exitiert nach einer Kolli
[BB2D | BB3D | BB+]

x-pressive

BeitragMi, Aug 10, 2005 13:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist mir danach auch eingefallen Very Happy Kein Problem, dann einfach den Types ein Feld delete% (TRUE | FALSE) hinzufügen und auf TRUE setzen, nach der Abfrage dann eben nochmal durchlaufen und löschen.

Rallimen, ich weiss nicht, ob der CodeFormer Sinn macht, wenn jemand zu faul zum sauberen Coden ist. Dadurch lernt er es ja auch nicht besser. Aber immerhin kann er seinen Code dann noch mal schnell formatieren, bevor er ihn auf andere loslässt Wink
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL
 

BIG BUG

BeitragMi, Aug 10, 2005 21:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Sollte aber auch einfach mit EXIT gehen:
BlitzBasic: [AUSKLAPPEN]

Function ShotsCollide()

Local S.TShot
Local E.TEnemyShot

; LOOP THROUGH SHOTS
For S = Each TShot
For E = Each TEnemyShot
; COLLISION?
If ImagesCollide(S\Image, S\x, S\y, 0, E\Image, E\x, E\y, 0)
Delete S
Delete E
Exit
End If
Next
Next

End Function
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final)

x-pressive

BeitragDo, Aug 11, 2005 5:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, aber dann nimmt er nur die ersten beiden Schüsse, die kollidieren, holt sich also pro Durchgang nur ein Paar.
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL

Alfadur

BeitragDo, Aug 11, 2005 15:34
Antworten mit Zitat
Benutzer-Profile anzeigen
naja, normal nicht. eigentlich beendet er nur die innere for schleife, also die mit den E ... die S schleife führt er weiter durch und überprüft dann wieder jeden E mit dem nächsten S ...
man könnte alternativ auch noch ein if S<>null / if E<>null machen ...
A Cray is the only computer that runs an endless loop in less than four hours.

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragDo, Aug 11, 2005 22:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Am sichersten wäre es das S ausserhalb der inneren Schleife zu löschen...

BlitzBasic: [AUSKLAPPEN]
Function ShotsCollide ()
Local S.TShot
Local E.TEnemyShot
; LOOP THROUGH SHOTS

For S = Each TShot

For E = Each TEnemyShot
; COLLISION?
If ImagesCollide (S\Image, S\x, S\y, 0, E\Image, E\x, E\y, 0) Then
Del_S = True
Delete E
End If
Next
If Del_S Then
Delete S
Del_S = False
End If
Next
End Function

Nun wird alles überprüft, aber ob es sinnvoll ist , werweis??
[BB2D | BB3D | BB+]

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group