Meine erstes Spiel

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

BlitzMalte

Betreff: Meine erstes Spiel

BeitragDi, Aug 16, 2011 15:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey Leute Smile bin ganz neu hier und hab mal vor einiger Zeit eine art Spaceshooter geschrieben. Ich wollte jetzt wieder Anfangen ein neues Spiel zu Programmieren aber vorher wollte ich mal meine Code posten ob ihr ein paar Tips für mich hab Wink

Ich weiß der Code ist echt Mist aber damals (halbes Jahr her glaub ich) Very Happy wusste ich es noch nicht besser wenn ihr trotz nicht eingerücktem Code und vieler unnötiger Zeilen trotzdem mal drüber gucken wollt wär das echt cool Smile

Exclamation Info das ich beim nächsten mal types und dims verwenden sollte ist mir schon klar Exclamation

BlitzBasic: [AUSKLAPPEN]

Global xmax=800,ymax=600
Graphics3D xmax,ymax,32,1
SetBuffer = BackBuffer()
Global frametimer = CreateTimer(60)
SeedRnd MilliSecs()
HidePointer


font = LoadFont("Arial",18,1)
SetFont font





;Alle images werden in variabel geladen und midhandle und maskimage werden eingesetzt
Global enemy1 = LoadImage("gfx\feind.png")
MidHandle enemy1
MaskImage enemy1,0,0,255
Global enemy2 = LoadImage("gfx\feind2.png")
MidHandle enemy2
MaskImage enemy2,0,0,255
Global enemy3 = LoadImage("gfx\feind3.png")
MidHandle enemy3
MaskImage enemy3,0,0,255
Global enemy4 = LoadImage("gfx\feind4.png")
MidHandle enemy4
MaskImage enemy4,0,0,255
Global enemy5 = LoadImage("gfx\feind5.png")
MidHandle enemy5
MaskImage enemy5,0,0,255
Global enemy6 = LoadImage("gfx\feind6.png")
MidHandle enemy6
MaskImage enemy6,0,0,255
Global enemy7 = LoadImage("gfx\feind7.png")
MidHandle enemy7
MaskImage enemy7,0,0,255
Global spieler = LoadImage("gfx\spieler.png")
MidHandle spieler
MaskImage spieler,0,0,255
Global schuss = LoadImage("gfx\schuss.png")
MidHandle schuss
MaskImage schuss,0,0,255
Global stars = LoadImage("gfx\stars.bmp")
MaskImage stars,0,0,0
Global hauptmenu = LoadImage("gfx\hauptmenu.bmp")
Global pfeile = LoadImage("gfx\pfeile.png")

;sounds laden
Global sound1 = LoadSound("sound\schuss.wav")
Global sound2 = LoadSound("sound\treffer.wav")
Global sound3 = LoadSound("sound\loose.wav")

;alle benötigten variabel werden initalisiert
Global enemy = enemy1
Global xspieler# = 400
Global yspieler = 560
Global xschuss = ""
Global yschuss# =530
Global xenemy = 400
Global yenemy = 60
Global lebenenemy = 5
Global leben = 5
Global xrichtung = 3
Global schussan = 0
Global nextenemy = 0
Global neustart = 0
Global gegnerzahler = 0
Global minusbewegung = -3
Global plusbewegung = 3
Global gegnervor = 1
Global weiter = 0
Global level = 1
Global hauptmenuan = 3
Global steuerungmenu = 1
Global schussspeed = 3
Global sspeed = 4
Global name$ = ""
Global punkte = 0
Global stream
Global file
Global rundenpunkte = 0
Global sscore = 0
Global mscore = 0
Global lscore = 0
Global lsname$
Global msname$
Global ssname$
Global neu = 1
Global zwischen


;die funktion der spieler kontrolle und seiten abgrenzung
Function spielersteuerung()
If KeyDown(203) Then xspieler = xspieler - sspeed
If KeyDown(205) Then xspieler = xspieler + sspeed
If xspieler > 775 Then xspieler = 775
If xspieler < 33 Then xspieler = 33
End Function




;die funktion der gegnerbewegung und seitenabgrenzung
Function gegner()
If yenemy < 600 Then xenemy = xenemy + xrichtung
If yenemy < 680 Then yenemy = yenemy + gegnervor
If yenemy = 680 Then
neustart = 1
channel4 = PlaySound(sound3)
Delay(200)
StopChannel channel4
EndIf
If xenemy > 750 Then xrichtung = -3
If xenemy < 50 Then xrichtung = 3
End Function


;Hauptmenü __________________________________________________________________________________________
Function hauptmenu()
Flip:Cls
Repeat
DrawImage hauptmenu,200,100
Locate 200,460
Print "Hauptmenü"
Locate 200,480
Print "Steuere mit Pfeil hoch und runter"
Locate 200,550
Print "Name = "+name+ " Geld = "+ punkte+""
Locate 10,230
Print "Highscore"
Locate 10,250
Print "Leicht: "+lsname+" "+lscore+""
Locate 10,270
Print "Mittel: "+msname+" "+mscore+""
Locate 10,290
Print "Schwer: "+ssname+" "+sscore+""
Locate 470,580
Print "Zum speichern und Beenden Esc drücken"
If KeyHit(1) Then
If Not name = "" Then
stream = WriteFile("spielstaende\"+name+".txt")
WriteLine stream,name
WriteInt stream,punkte
CloseFile stream
EndIf
End
EndIf
Delay(100)
If KeyHit(200) Then steuerungmenu = steuerungmenu + 1
If KeyHit(208) Then steuerungmenu = steuerungmenu - 1
If steuerungmenu < 1 Then steuerungmenu = 5
If steuerungmenu > 5 Then steuerungmenu = 1
Flip:Cls
Locate 300,500
If steuerungmenu = 1 Then Print "Leicht"
If steuerungmenu = 2 Then Print "Mittel"
If steuerungmenu = 3 Then Print "Schwer"
If steuerungmenu = 4 Then Print "Speichern und Beenden"
If steuerungmenu = 5 Then Print "Zum Spiel"
If Not steuerungmenu = 5 Then
zwischen = steuerungmenu
EndIf
Until KeyHit(28)
If steuerungmenu = 1 Then
minusbewegung = -2
plusbewegung = 2
schussspeed = 8
sspeed = 6
gegnerzahler = 0
level = 1
xspieler = 400
lebenenemy = 5
enemy = enemy1
schussan = 0
neustart = 0
leben = 5
xenemy = 400
yenemy = 60
gegnervor = 1
EndIf
If steuerungmenu = 2 Then
minusbewegung = -3
plusbewegung = 3
schussspeed = 5
sspeed = 4
gegnerzahler = 0
level = 1
xspieler = 400
lebenenemy = 10
enemy = enemy1
schussan = 0
neustart = 0
leben = 10
xenemy = 400
yenemy = 60
EndIf
If steuerungmenu = 3 Then
minusbewegung = -5
plusbewegung = 5
schussspeed = 2
sspeed = 3
gegnervor = 2
gegnerzahler = 0
level = 1
xspieler = 400
lebenenemy = 25
leben = 10
enemy = enemy1
leben = 25
schussan = 0
neustart = 0
xenemy = 400
yenemy = 60
EndIf
If steuerungmenu = 4 Then
If Not name = "" Then
stream = WriteFile("spielstaende\"+name+".txt")
WriteLine stream,name
WriteInt stream,punkte
CloseFile stream
EndIf
End
EndIf
If steuerungmenu = 5 Then
Flip:Cls
Locate 400,300
Print "Weiter gehts"
Delay(1000)
Locate 400,320
Print "3..."
Delay(1000)
Locate 400,340
Print "2..."
Delay(1000)
Locate 400,360
Print "1..."
Delay(100)
EndIf
hauptmenuan = 0
steuerungmenu = zwischen
End Function
;----------------------------------------------------------------------------------------------------



;MAINschleife
Repeat
SetBuffer = BackBuffer()
WaitTimer (frametimer)

file = OpenFile("score\score.txt")
lsname = ReadLine$(file)
lscore = ReadInt%(file)
msname = ReadLine$(file)
mscore = ReadInt%(file)
ssname = ReadLine$(file)
sscore = ReadInt%(file)
CloseFile file



If hauptmenuan = 3 Then
Repeat
DrawImage hauptmenu,200,100
If KeyHit(200) Then neu = neu + 1
If KeyHit(208) Then neu = neu - 1
If neu < 1 Then neu = 2
If neu > 2 Then neu = 1
DrawImage pfeile,240,440
Locate 300,500
If neu = 1 Then Print "Spieler Laden"
If neu = 2 Then Print "Neuen Spieler"
Locate 450,500
Print "-------------->Rechte Pfeiltaste"
hauptmenuan = 2
Flip:Cls
Until KeyHit(205)
EndIf


If hauptmenuan = 2 Then
Delay(100)
DrawImage hauptmenu,200,100
Locate 300,450
Print "Bitte geben Sie ihren Namen ein"
Locate 300,470
name$ = Input()
Delay(500)
hauptmenuan = 1
hauptmenu
Flip:Cls
EndIf

If hauptmenuan > 0 Then hauptmenu


If punkte = 0 And neu = 1 Then
file = OpenFile("spielstaende\"+name+".txt")
name = ReadLine$(file)
punkte = ReadInt%(file)
CloseFile file
EndIf

;funktionen
spielersteuerung
gegner

If KeyHit(30) Then hauptmenuan = 1

;stern bewegen
ystar = ystar + 1
If ystar = 2000 Then ystar = 1


If schussan = 0 Then
If KeyHit(200) Then
xschuss = xspieler - schussspeed
yschuss = 533
schussan = 1
channel1 = PlaySound(sound1)
EndIf
EndIf
If schussan = 1 Then yschuss = yschuss - schussspeed
If yschuss < 1 Then schussan = 0
If yschuss < 500 Then
StopChannel channel1
EndIf

;Alles malen


If hauptmenuan > 0 Then
Flip:Cls
Else
If schussan = 1 Then DrawImage schuss,xschuss,yschuss
DrawImage spieler,xspieler,yspieler
DrawImage enemy,xenemy,yenemy
TileImage stars,1,1
Flip:Cls
EndIf

;kollision von schuss und gegner mit reset schuss und leben abzug
If ImagesCollide(enemy,xenemy,yenemy,0,schuss,xschuss,yschuss,0) Then
xschuss = ""
yschuss = ""
lebenenemy = lebenenemy - 5
schussan = 0
StopChannel channel1
EndIf


Locate 1,520
Print "Leben: "+lebenenemy
Locate 1,540
Print "Geld: "+punkte
Locate 1,560
Print "Score: "+rundenpunkte
Locate 1,580
Print "Level: "+level





;kollision von gegner und spieler mit neustart
If ImagesCollide(enemy,xenemy,yenemy,0,spieler,xspieler,yspieler,0) Then
channel3 = PlaySound(sound2)
Delay(420)
neustart = 1
EndIf

;gegner tot
If lebenenemy < 1 Then
nextenemy = 1
channel2 = PlaySound(sound2)
EndIf

;nächster gegner und alles zurück setzten was den gegner betrifft
If nextenemy = 1 Then
If steuerungmenu = 1 Then
punkte = punkte + 1
EndIf
If steuerungmenu = 2 Then
punkte = punkte + 2
EndIf
If steuerungmenu = 3 Then
punkte = punkte + 5
EndIf
If steuerungmenu = 1 Then
rundenpunkte = rundenpunkte + 1
EndIf
If steuerungmenu = 2 Then
rundenpunkte = rundenpunkte + 1
EndIf
If steuerungmenu = 3 Then
rundenpunkte = rundenpunkte + 1
EndIf
schussan = 0
gegnerzahler = gegnerzahler + 1
xenemy = Rand(730,70)
yenemy = 60
lebenenemy = leben + 5
leben = leben + 5
If xenemy > 400 Then xrichtung = -3
If xenemy < 400 Then xrichtung = 3
If gegnerzahler = 1 Then enemy = enemy2
If gegnerzahler = 2 Then enemy = enemy3
If gegnerzahler = 3 Then enemy = enemy4
If gegnerzahler = 4 Then enemy = enemy5
If gegnerzahler = 5 Then enemy = enemy6
If gegnerzahler = 6 Then enemy = enemy7
If gegnerzahler = 7 Then enemy = enemy1
If gegnerzahler = 8 Then enemy = enemy2
If gegnerzahler = 9 Then enemy = enemy3
If gegnerzahler = 10 Then enemy = enemy4
If gegnerzahler = 11 Then enemy = enemy5
If gegnerzahler = 12 Then enemy = enemy6
If gegnerzahler = 13 Then enemy = enemy7
If gegnerzahler = 14 Then enemy = enemy1
If gegnerzahler = 15 Then enemy = enemy2
If gegnerzahler = 16 Then enemy = enemy3
If gegnerzahler = 17 Then enemy = enemy4
If gegnerzahler = 18 Then enemy = enemy5
If gegnerzahler = 19 Then enemy = enemy6
If gegnerzahler = 20 Then enemy = enemy7
If gegnerzahler = 21 Then enemy = enemy1
If gegnerzahler = 22 Then enemy = enemy2
If gegnerzahler = 23 Then enemy = enemy3
If gegnerzahler = 24 Then enemy = enemy4
If gegnerzahler = 25 Then enemy = enemy5
If gegnerzahler = 26 Then enemy = enemy6
If gegnerzahler = 27 Then enemy = enemy7
If gegnerzahler = 28 Then enemy = enemy1
If gegnerzahler = 29 Then enemy = enemy2
If gegnerzahler = 30 Then enemy = enemy3
If gegnerzahler = 31 Then enemy = enemy4
If gegnerzahler = 32 Then enemy = enemy5
If gegnerzahler = 33 Then enemy = enemy6
If gegnerzahler = 34 Then enemy = enemy7
If gegnerzahler = 35 Then enemy = enemy1
If gegnerzahler = 36 Then enemy = enemy2
If gegnerzahler = 37 Then enemy = enemy3
If gegnerzahler = 38 Then enemy = enemy4
If gegnerzahler = 39 Then enemy = enemy5
If gegnerzahler = 41 Then enemy = enemy6
If gegnerzahler = 42 Then enemy = enemy7
If gegnerzahler = 43 Then enemy = enemy1
If gegnerzahler = 44 Then enemy = enemy2
If gegnerzahler = 45 Then enemy = enemy3
If gegnerzahler = 46 Then enemy = enemy4
If gegnerzahler = 47 Then enemy = enemy5
If gegnerzahler = 48 Then enemy = enemy6
If gegnerzahler = 49 Then enemy = enemy7
If gegnerzahler = 50 Then enemy = enemy1
If gegnerzahler = 51 Then enemy = enemy2
schussan = 0
nextenemy = 0
EndIf



;nächster level level 2
If gegnerzahler = 10 And level = 1 Then weiter = 1
If gegnerzahler = 20 And level = 2 Then weiter = 1
If gegnerzahler = 30 And level = 3 Then weiter = 1
If gegnerzahler = 40 And level = 4 Then weiter = 1
If gegnerzahler = 50 And level = 5 Then weiter = 1
If weiter = 1 Then
level = level + 1
If steuerungmenu = 1 Then lebenenemy = 5
If steuerungmenu = 2 Then lebenenemy = 10
If steuerungmenu = 3 Then lebenenemy = 25
StopChannel channel1
StopChannel channel2
StopChannel channel3
schussan = 0
If steuerungmenu = 1 Then leben = 5
If steuerungmenu = 2 Then leben = 10
If steuerungmenu = 3 Then leben = 25
minusbewegung = minusbewegung - 2
plusbewegung = plusbewegung + 2
gegnervor = gegnervor + 1
Flip:Cls
While weiter = 1
If KeyHit(1) Then
End
EndIf
Locate 300,270
Print "Juhhuuu Level "+level+""
Locate 350,300
Print "Press enter"
Locate 350,350
Print "Du hast es in den "+level+" Level geschaft"
Locate 350,380
Print "jetzt werden die gegner schneller"
If KeyHit(28) Then
weiter = 0
EndIf
Wend
EndIf


;explosionsgeräusch stop an der position wegen zeitlichem ablauf
If yenemy > 80 Then
StopChannel channel2
EndIf


;neustart alles wir resetet und wieder gestartet
If neustart = 1 Then
Flip:Cls
If steuerungmenu = 1 And rundenpunkte > lscore Then
If Not name = "" Then
If level > 1 Then
lscore = rundenpunkte
Else
lscore = rundenpunkte
EndIf
EndIf
lsname = name
EndIf
If steuerungmenu = 2 And rundenpunkte > mscore Then
If Not name = "" Then
If level > 1 Then
mscore = rundenpunkte
Else
mscore = rundenpunkte
EndIf
EndIf
msname = name
EndIf
If steuerungmenu = 3 And rundenpunkte > sscore Then
If Not name = "" Then
If level > 1 Then
sscore = rundenpunkte
Else
sscore = rundenpunkte
EndIf
EndIf
ssname = name
EndIf
rundenpunkte = 0
stream = WriteFile("score\score.txt")
WriteLine stream,lsname
WriteInt stream,lscore
WriteLine stream,msname
WriteInt stream,mscore
WriteLine stream,ssname
WriteInt stream,sscore
CloseFile stream
StopChannel channel1
StopChannel channel2
StopChannel channel3
Delay(200)
StopChannel channel4
enemy = enemy1
If steuerungsmenu = 1 Or 2 Then
gegenervor = 1
EndIf
xspieler# = 400
yspieler = 560
xschuss = ""
yschuss# =530
xenemy = Rand(730,70)
yenemy = 60
schussan = 0
nextenemy = 0
If steuerungmenu = 1 Then
leben = 5
lebenenemy = 5
EndIf
If steuerungmenu = 2 Then
leben = 10
lebenenemy = 10
EndIf
If steuerungmenu = 3 Then
leben = 25
lebenenemy = 25
EndIf
While neustart = 1
Flip:Cls
If KeyHit(1) Then End
Locate 350,300
Print "Press Enter"
Locate 350,325
Print "Du hast Level " + level + " erreicht und"
Locate 350,350
Print "Du hast " + gegnerzahler + " Gegner vernichtet"
Locate 350,375
Print "Drücke a um ins Hauptmenü zu kommen"
If KeyHit(30) Then hauptmenu
If KeyHit(28) Then
neustart = 0
gegnerzahler = 0
level = 1
EndIf
Wend
EndIf


;bild wechsel
;ende

Until KeyHit(1)
End
Was ist da nur falsch gelaufen?? O_o

Xeres

Moderator

BeitragDi, Aug 16, 2011 16:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann gleich mal vorneweg: Benutz IDEal anstatt der Standard IDE. Nicht deklarierte Variablen werden hervorgehoben (Tippfehler sind schon mal ausgeschlossen) und Einrücken passiert auf Wunsch vollautomatisch.

Was sonst beim überfliegen auffällt:
SetBuffer ist eine Funktion, keine Variable, daher.
Code: [AUSKLAPPEN]
SetBuffer(BackBuffer())

Im allgemeinen schlage ich darum vor, nirgendwo die Funktionsklammern weg zu lassen (aber man sieht's mit IDEal auch an der Farbe).
enemy1-7 - definitiv ein Array für die Bilder.
Print und Locate sind absolut veraltet, Text ist das Mittel der Wahl.
Ich seh' nicht wirklich einen Grund, mehr als einmal Flip im Code zu haben - kann ein Hinweis auf Fehler sein, z.B. in Zusammenhang mit Doublebuffering.
Der riesige Block mit Code: [AUSKLAPPEN]
If gegnerzahler = 1 Then enemy = enemy2
ist mehr als auffällig für etwas, was man mit einer Formel/Zählvariable o.ä. in 3-5 Zeilen lösen könnte, wenn man Array benutzt.

Ansonsten Gratulation! Etwas fertig bekommen ist immer schwieriger als nochmal neu an zu fangen. Das gröbste ist dir ja schon bewusst - mach weiter so!
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)
 

BlitzMalte

BeitragDi, Aug 16, 2011 18:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke!! Ja manche Sachen wie Arrays und ein paar Schleifen hier und da sind mir mittlerweile auch klar aber sonst danke für die Tipps werde ich jetzt direkt verwenden Smile
Was ist da nur falsch gelaufen?? O_o

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group