Brauche dringend Hilfe (Fehler bei der Kollision)

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Mulei

Betreff: Brauche dringend Hilfe (Fehler bei der Kollision)

BeitragMo, Okt 17, 2005 16:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo ich bin erst seit ein paar Monaten dabei und Arbeite seit einer Woche an ein Weltraum- Shooter. Ich bin also noch ein totaler Anfänger in Blitz Basic. Und jetzt bin ich halt an einer stelle angelangt an der ich nicht weiter weiß.

Ich habe erst mal nur verschiedene dinge programmiert und nun wollte ich halt die kollisions- abfragen programmieren. Aber schon bei der ersten gibt es ein Fehler den ich mir nicht erklären kann. Es geht darum das feindliche schiffe „Alien1“ von oben nach unten fliegen und wenn ich dann eine Rakete abschieße erscheint die explosions- Animation ohne das die Rakete den Feind berührt hat, oder das feindliche schiff verschwindet und taucht irgendwo woanders auf. Am besten man schaut sich das mal selber an. Ich habe schon alles Mögliche probiert aber nun bin ich halt an meine grenzen gestoßen und weiß nicht mehr weiter. Deshalb hoffe ich das mir welche Helfen können die mehr Erfahrung haben als ich (also alle Laughing ) bei der programmierung der kollisions- abfrage und beim lösen des Problems. Vielleicht könnte man mir auch sagen was ich noch am Code verbessern könnte da er sicher noch mehr Fehler beinhaltet.

Es währ nett wenn ihr mir eure Problemlösungen oder Vorschläge auch per E-Mail schicken könntet.

Danke im Voraus

masterwoyack@yahoo.de

BlitzBasic: [AUSKLAPPEN]

; Alien Wars
Graphics 800, 600
SetBuffer BackBuffer()

; Grafiken und Sounds ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

All = LoadImage(\"Stars.bmp\")
Boni1 = LoadImage(\"Schildboni.bmp\")
Boni2 = LoadImage(\"Plasma1boni.bmp\")
Boni3 = LoadImage(\"Plasma2boni.bmp\")
Boni4 = LoadImage(\"Laserboni.bmp\")
Boni5 = LoadImage(\"Raketenboni.bmp\")

;Meteor1
;Meteor2

Alien52_48 = LoadImage(\"Alien52_48.bmp\")

Explosion1 = LoadAnimImage(\"Explosion.bmp\", 60, 46, 0, 6)

;Explosion2

Raumschiff = LoadImage(\"schiff.bmp\")

Rakete = LoadImage(\"bullet.bmp\")
Laser = LoadImage(\"Laser.bmp\")
Plasmastrahl = LoadAnimImage(\"Plasmastrahl.bmp\", 16 ,576, 0, 18)


Laserball = LoadAnimImage(\"spinBullets.bmp\", 16, 14, 0, 4)



; Ende Grafiken und Sound ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


; Dim Felder ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Dim Lasenergie(1,1)
Dim Lasstrahlenergie(1,1)
Dim Las(100,2)
Dim Rak(100,2)
Dim Alien1(10,1)
Dim Alien2(5,2)
Dim Alien3(5,2)
Dim Alien3ge(50,3)
;Dim Meteor1(20,2)
;Dim Meteor2(3,2)
Dim Alien1Explodiert(10,1)
;Dim Alien2Explodiert(5,1)
;Dim Alien3Explodiert(5,1)
;Dim MeteorExplodiert(20,1)

Dim Boni(6,2)
Boni(0, 2) = Boni1
Boni(1, 2) = Boni2
Boni(2, 2) = Boni3
Boni(3, 2) = Boni4
Boni(4, 2) = Boni5

; Ende Dim Felder ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



; Start Position Raumschiff
X = 305
Y = 420



; Variablen
Punkte = 0
Leben = 3
Schild = 0
Laserenergie = 100
Laserstrahlenergie = 0
Plasmaenergie = 100
Const MagazinRakete = 5
Const MagazinLaser = 5
Geschwin = 2



;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Hauptschleife ;;;;;;;;;;;;;;;;;;
Repeat
Cls

; Zeit
SeedRnd MilliSecs()


; Hintergrund
Sterne = Sterne+1
If Sterne = 200 Then Sterne = 0
TileBlock All, 0, Sterne



; Anzeige
DrawImage Raumschiff, X, Y
Text 0, 5, \"Punkte: \" +Punkte
Text 0, 20, \"Leben: \" +Leben
Text 0, 35, \"Laser: \" +Laserenergie+ \"%\"
Text 0, 50, \"Plasma: \" +Plasmaenergie+ \"%\"


; Pfeiltasten abfragen
If KeyDown(200) = 1 Then Y = Y - Geschwin
If KeyDown(208) = 1 Then Y = Y + Geschwin
If KeyDown(205) = 1 Then X = X + Geschwin
If KeyDown(203) = 1 Then X = X - Geschwin



; Rand-Überschreitung verhindern
If X < 0 Then X = 0
If X > 752 Then X = 752
If Y < 0 Then Y = 0
If Y > 559 Then Y = 559



; Gegner ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



; Alien1-Steuerung
For I=1 To 10
If Alien1(I,0) + Rand(1,300) = 1 Then
Alien1(I,0) = Rand(30,750)
Alien1(I,1) = Rand(-100,0)
EndIf
If Alien1(I,0) <> -1 Then
Alien1(I,1) = Alien1(I,1) + 2
EndIf
If Alien1(I,1) > 600 Then Alien1(I,0) = 0
If Alien1(I,0) <> -1 Then DrawImageRect Alien52_48, Alien1(I,0), Alien1(I,1), 416, 0, 52, 48
Next



; Alien2-Steuerung
For I=1 To 5
If Alien2(I,0) = 0 Then
Alien2(I,0) = Rand(100,200)
Alien2(I,1) = Rand(-20,840)
Alien2(I,2) = Rand(-100,0)
EndIf
If Alien2(I,0) <> -1 Then
Alien2(I,2) = Alien2(I,2) + 1
Alien2(I,1) = 320 + Sin( Alien2(I,2) ) * Alien2(I,0)
EndIf
If Alien2(I,2) > 600 Then Alien2(I,0) = 0
If Alien2(I,0) <> -1 Then DrawImageRect Alien52_48, Alien2(I,1), Alien2(I,2), 156, 0, 52, 48
Next



; Alien3-Steuerung
For I=1 To 5
If Alien3(I,1) + Rand(1,400) = 1 Then
Alien3(I,0) = Rand(-100,0)
Alien3(I,1) = Rand(20,300)
Alien3(I,2) = 0
EndIf
If Alien3(I,1) <> -1 Then
Alien3(I,0) = Alien3(I,0) + 1
EndIf
If Alien3(I,0) > 800 Then Alien3(I,1) = 0
If Alien3(I,1) <> -1 Then DrawImageRect Alien52_48, Alien3(I,0), Alien3(I,1), 416, 0, 52, 48
Next




; Alien3-Waffen
For I=1 To 5
If Alien3(I,2) + Rand(1,2) = 1 Then
Alien3ge(I,0) = Alien3(I,0)
Alien3ge(I,1) = Alien3(I,1)
Alien3(I,2) = 1
Alien3ge(I,3) = Rand(-3,3)
EndIf
If Alien3ge(I,1) <> -1 Then
Alien3ge(I,1) = Alien3ge(I,1) + 3
Alien3ge(I,0) = Alien3ge(I,0) + Alien3ge(I,3)
EndIf
If Alien3ge(I,1) > 600 Then Alien3(I,2) = 0
If Alien3ge(I,1) <> -1 Then DrawImage Laserball, Alien3ge(I,0)+20, Alien3ge(I,1)+30
Next
; Ende Gegner ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


; Waffen ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; Rakete-Test
If KeyHit(57) And Raketemax < MagazinRakete Then
RakSchuss = RakSchuss + 1
Raketemax = Raketemax + 1
If RakSchuss = 101 Then RakSchuss = 1
Rak(RakSchuss,0) = 1
Rak(RakSchuss,1) = X+17
Rak(RakSchuss,2) = Y-5
; Sound
EndIf


; Raketen zeichnen
For I=1 To 100
If Rak(I,0) = 1 Then
DrawImage Rakete, Rak(I,1), Rak(I,2)
Rak(I,2) = Rak(I,2) - 2
If Rak(I,2) = 1 Then Raketemax = Raketemax -1
EndIf
Next



; Laser-Test
If KeyDown (56) And Laserenergie > 0 Then
If zeit + 100 < MilliSecs() Then
LasSchuss = LasSchuss + 1
If LasSchuss = 101 Then LasSchuss = 1
Laserenergie = Laserenergie - 1
Las(LasSchuss,0) = 1
Las(LasSchuss,1) = X+23
Las(LasSchuss,2) = Y-5
zeit = MilliSecs()
; Sound
EndIf
EndIf




; Laser zeichnen
For I=1 To 100
If Las(I,0) = 1 Then
DrawImage Laser, Las(I,1), Las(I,2)
Las(I,2) = Las(I,2) - 5
EndIf
Next




; Plasmastrahl-Test
If KeyDown(42) And Plasmaenergie > 0 Then
If ZaehlStart + 100 < MilliSecs() Then
P = P + 1
J = J + 1
If P = 18 Then P = 0
If J = 1 Then
Plasmaenergie = Plasmaenergie - 1
J = 0
EndIf
zaehlstart = MilliSecs()
EndIf
HandleImage PlasmaStrahl, 0, 576
DrawImage PlasmaStrahl, X + 17 , Y + 10, P
EndIf




; Ende Waffen ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



; Kollision-Testen ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


; Kollision Alien 1 testen


For I=1 To 100
If Rak(I,0) <> 0 Then
For J=1 To 10
If ImagesCollide(Alien52_48, Alien1(J,0), Alien1(J,1), 0, Rakete, Rak(I,1), Rak(I,2), 0) Then
Alien1(J,0) = 500
EndIf
Next
EndIf
Next


; Ende kollision-Testen ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


; Explosion zeichnen ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; Explosion Alien2 zeichnen
For I=1 To 10
If Alien1(I,0) = 500 Then
If Alien1Explodiert(I,1) + 100 < MilliSecs() Then
Alien1Explodiert(I,0) = Alien1Explodiert(I,0) + 1
Alien1Explodiert(I,1) = MilliSecs()

If Alien1Explodiert(I,0) = 6 Then
Alien1Explodiert(I,0) = 0
Alien1Explodiert(I,1) = 0
Alien1(I,0) = 0
Punkte = Punkte + 10
EndIf
EndIf
DrawImage Explosion1, Alien1(I,0), Alien1(I,1), Alien1Explodiert(I,0)
EndIf
Next



; Extras ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


; Boni
For I=1 To 4
If Boni(I,0) = 0 And Rand(1,2000) = Rand(1,5) Then
Boni(I,0) = Rand(0,640)
Boni(I,1) = Rand(-60,0)
EndIf
If Boni(I,0) <> -1 Then
Boni(I,1) = Boni(I,1) + 3
EndIf
If Boni(I,1) > 600 Then Boni(I,0) = 0
If Boni(I,0) <> -1 Then DrawImage Boni(I,2), Boni(I,0), Boni(I,1)
Next


; Ende Extras ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



Flip
Until KeyDown(1)


~Editiert~
Code sprengt Layout. Angepasst. MfG D2006

Hellfront

Betreff: Bilder

BeitragMo, Okt 17, 2005 20:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Könntest du mal Bilder posten damit man das Spiel auch starten kann
so dass man sich das ganze beasser vvorstellen kann?
 

Omenaton_2

BeitragDi, Okt 18, 2005 10:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, ich kann jetzt nicht so genau den Code lesen, daß ich richtig helfen könnte, aber ich kann schon mal paar Tipps geben.

Ich habe festgestellt, daß man mit "SeedRnd", wenn man es zu häufig in Schleife benutzt Probleme bekommen kann. Setz diesen Befehl außerhalb der Schleife, es reicht das nur ein Mal am Anfang zu machen. Sonst werden die Zufallszahlen anstat unterschiedlich, sehr ähnlich, weil der Random-Wert aus der fast gleichen Millisecs Zeit gelesen wird. Auch sont hatte ich schn mal irgendwelche schwer erklärbare Ungereimtheiten mit Random Werten.

Mir gefällt die Code-Struktur nicht und es gibt für meinen Geschmack viel zu Viele Dims, es ist deswegen nicht wirklich übersichtlich (wobei für einen Anfänger-Code schon nicht schlecht ist, es gibt sehr viel schlimmere Sachen.)
Wenn du zum Beispiel Types nimmst, kannst du die Variablen als Type-Felder viel verständlicher benennen.

Du machst alles in der Hauptschleife und zeichnest alles kontinuierlich.
Es wäre übersichtlicher und wenn dein Code größer wird sogar unendlich wichtig, nicht alles in Hauptschleife zu machen, sondern die einzeln Teilaufgaben wie zum Beispiel das Zeichnen von alles, das Berechnen von Kollisionen, das Abfeuern von Rakete, etc außerhalb der Schleife entweder als Funktion oder als Subrutine mit Gosub zu machen.
Dann sieht deine Hauptschleife sehr klein aus. Du siehst übersichtlich nur die wenigen Zeilen die den logischen Ablauf deines Porgrammes zeigen. Wie hintereinander das Spieler-Schiff bewegt wird, die Aliens bewegt werden, Schüsse bewegt werden, Kollisionen gechecked werden, am Ende wird alles gezeichenet, nicht immer, es reicht alle 30 millisekunden ein Mal zu zeichnen.
Du könntest schon weiterkommen, wenn du deinen Code optimier würdest.

Anonsten, du hast gesagt die Explosion kommt unnötig und zu oft. Dann schaue nach, welche Bedingungen in deinem Code erfüllt sein müssen, damit die Explosion kommt. Da steht was von 500 für ein Dim-Feld (";Explosion Alien2 zeichnen"). Schaue nach, wo und warum du diesem Feld den Wert 500 gibst.
Eine logische Fehlerquelle ist wegen deines "alles in einer Schleife" Aufbaus ist auch, daß du scheinbar (habe nicht richtig nachgeschaut) nicht geregelt kriegst, daß Alien Schiffe oder Raketen wenn sie schon ein Mal explodiert sind nicht mehr gezeichnet werden, sondern nur die Explosion und das für eine bestimmte Zeit.

Ok, noch was. Vielleicht solltest du erst als Test das Programm so weit vereinfache, daß du nciht Dims mit vielen Schiffe und Raketen nimmst, sondern nur ein einziges Alien und eine einzige Rakete nimmst. Das Spiel soll erstmal mit Minimum funktionieren und erweiter es Schritt für Schritt. Erst nur mehr als 1 Rakete nehmen, dann mehr als ein Alien und so weiter. Für einen Anfänger kann diese Vorgehensweise hilfreich sein. Häufig testen und nicht weiter gehen, bis jeder kleine Fehler der auftaucht vollkommen bereinigt ist.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group