Asteroids Klon
Übersicht BlitzBasic Codearchiv
girglBetreff: Asteroids Klon |
Mo, Jan 19, 2004 20:59 Antworten mit Zitat |
|
---|---|---|
Servus,
ich hab in den letzten Tagen einen Asteroids-Clon gemacht.Die einzelnen Bilder wurden mit createimage gemacht. Da ich anfangs selber noch probleme hatte,was die "gta-steuerung" mit sinus und cosinus angeht,will ich nun denen unter die arme greifen,die selbst mit sowas noch probleme haben in der hoffnung dieses problem aus der welt zu schaffen Hab auch noch zusätzlich eine kleine highscore mit eingebaut Ich hab versucht,den Code verständlich zu kommentieren und hoffe,zumindest ein paar programmieranfängern damit ein klein wenig zu helfen Code: [AUSKLAPPEN] Graphics 800,600,16,2
SetBuffer BackBuffer() SeedRnd MilliSecs() Global MaxLevel=20 ;Anzahl der level Dim schussimg(359) Dim schiffimg(359) Dim MaxAst(MaxLevel) ;Maximale Anzahl an Asteroiden pro Level Dim MaxAstK(MaxLevel) ;Maximale Anzahl an kleinen Asteroiden pro Level Dim HighscoreName$(11) Dim HighScorePunkte(11) For i=1 To MaxLevel MaxAst(i)=i+4 ;anzahl großer Asteroiden Next For i=1 To MaxLevel MaxAstK(i)=MaxAst(i)*2 ;da aus jedem großen 2 kleine werden,gibts von denen doppelt so viele Next Global nAsteroid=0 ;Momentane Anzahl an Asteroiden Global NewAsteroid=MilliSecs() ;Zeit,in der neue Asteroiden gemacht werden sollen Global level=1 Global nAsteroidK=MaxAstK(level) ;Maximale Anzahl an kleinen Asteroiden im jetzigen level Global Punkte=0 ;Bilder erzeugen Global schiffbild=CreateImage(32,32) SetBuffer ImageBuffer(schiffbild) Line 0,0,31,16 Line 0,31,31,16 Line 0,0,0,31 SetBuffer BackBuffer() Global asteroid1=CreateImage(60,60) ;gross SetBuffer ImageBuffer(asteroid1) Oval 0,0,60,60,0 SetBuffer BackBuffer() Global asteroid2=CreateImage(30,30) SetBuffer ImageBuffer(asteroid2) Oval 0,0,30,30,0 SetBuffer BackBuffer() Global schussbild=CreateImage(15,1) SetBuffer ImageBuffer(schussbild) Rect 0,0,13,1 SetBuffer BackBuffer() Type schiff Field x#,y# Field winkel Field speed Field leben Field schutz Field schutzzeit Field lebt End Type Type schuss Field x#,y# Field winkel Field speed Field lebt End Type Type Asteroid Field x#,y# Field speed Field dir Field typ ;1 groß 2 klein Field lebt End Type Type stern Field x#,y#,tiefe,lebt End Type For i=0 To 359 schiffimg(i)=CopyImage(schiffbild)MidHandle schiffimg(i) ;damit man das Schiff drehen kann im Spiel RotateImage schiffimg(i),-i Next For i=0 To 359 schussimg(i)=CopyImage(schussbild):MidHandle schussimg(i) ;damit der schuss auch in die richtung geht RotateImage schussimg(i),-i ;in die das schiff beim abschuss schaut Next Global schiff.schiff=New schiff schiff\x#=400 schiff\y#=300 schiff\winkel=0 schiff\speed=3 schiff\leben=3 schiff\lebt=1 Global schuss.schuss Global gAst.Asteroid Function DrawShip() For schiff.schiff=Each schiff If schiff\lebt=1 DrawImage schiffimg(schiff\winkel),schiff\x#,schiff\y# ;schiff wird im aktuellen winkel gemalt EndIf Next End Function Function MoveShip() For schiff.schiff=Each schiff If KeyDown(203) Then schiff\winkel=schiff\winkel+3 ;bei pfeiltaste links,winkel erhöhen If schiff\winkel>359 schiff\winkel=0 If KeyDown(205) Then schiff\winkel=schiff\winkel-3 ;bei pfeiltaste rechts winkel verkleinern If schiff\winkel<0 schiff\winkel=359 If KeyDown(200) schiff\x#=schiff\x#+Cos(schiff\winkel)*schiff\speed ;damit das Schiff auch in die richtige Richtung schiff\y#=schiff\y#-Sin(schiff\winkel)*schiff\speed ;fliegt EndIf ;cos bezieht sich auf die x-achse Next ;Sin auf die y-achse End Function Function Shoot() For schiff.schiff=Each schiff If KeyHit(57) ;DebugLog "Schuss" schuss.schuss=New schuss schuss\x#=schiff\x# schuss\y#=schiff\y# schuss\winkel=schiff\winkel ;schuss dem winkel des schiffs übergeben schuss\speed=6 schuss\lebt=1 EndIf Next End Function Function DrawShoot() For schuss.schuss=Each schuss If schuss\lebt=1 DrawImage schussimg(schuss\winkel),schuss\x#,schuss\y# ;das gleiche verfahren wie beim schiff schuss\x#=schuss\x#+Cos(schuss\winkel)*schuss\speed schuss\y#=schuss\y#-Sin(schuss\winkel)*schuss\speed If schuss\x#<0 Delete schuss:Exit ;fliegt der schuss über den bildschirmrand,wird er gelöscht If schuss\x#>800 Delete schuss:Exit If schuss\y#<0 Delete schuss:Exit If schuss\y#>600 Delete schuss:Exit EndIf Next End Function Function MakeAsteroid() Local OU If MilliSecs()-NewAsteroid>600 And nAsteroid<MaxAst(level) ;nach 600 ms neuen Asteroid machen DebugLog "Asteroid" ;wenn die Anzahl an großen Asteroiden gAst.Asteroid=New Asteroid ;noch nicht überschritten wurde gAst\x#=Rand(-100,900) OU=Rand(0,1) Select OU Case 0 gAst\y#=-100 Case 1 gAst\y#=700 Default End Select gAst\dir=Rand(1,4) gAst\typ=1 ;typ 1=großer Asteroid typ 2=kleiner gAst\speed=gAst\typ+1 gAst\lebt=1 nAsteroid=nAsteroid+1 ;Erhöhen damit nur so viel egroße Asteroiden gemacht werden,wie erlaubt sind NewAsteroid=MilliSecs() EndIf End Function Function DrawAsteroid() For gAst.Asteroid=Each Asteroid If gAst\lebt=1 Select gAst\typ Case 1 DrawImage Asteroid1,gAst\x#,gAst\y# ;großen Asteroiden zeichnen Case 2 DrawImage Asteroid2,gAst\x#,gAst\y# ;kleinen " " zeichnen Default End Select Select gAst\dir ;Richtung in die Der Asteroid fliegt Case 1 ;rechts oben gAst\x#=gAst\x#+gAst\speed gAst\y#=gAst\y#-gAst\speed If gAst\x#>800 gAst\x#=0 EndIf If gAst\y#<0 gAst\y#=600 EndIf Case 2 ;rechts unten gAst\x#=gAst\x#+gAst\speed gAst\y#=gAst\y#+gAst\speed If gAst\x#>800 gAst\x#=0 EndIf If gAst\y#>600 gAst\y#=0 EndIf Case 3 ;links unten gAst\x#=gAst\x#-gAst\speed gAst\y#=gAst\y#+gAst\speed If gAst\x#<0 gAst\x#=800 EndIf If gAst\y#>600 gAst\y#=0 EndIf Case 4 ;links oben gAst\x#=gAst\x#-gAst\speed gAst\y#=gAst\y#-gAst\speed If gAst\x#<0 gAst\x=800 EndIf If gAst\y#<0 gAst\y#=600 EndIf Default End Select EndIf Next End Function Function Kollision() Local gAstX,gAstY,gAstDir For schiff.schiff=Each schiff For gAst.Asteroid=Each Asteroid For schuss.schuss=Each schuss Select gAst\typ Case 1 ;wird ein großer Asteroid abgeschossen,werden 2 neue gemacht If ImagesCollide(schussimg(schuss\winkel),schuss\x#,schuss\y#,0,Asteroid1,gAst\x#,gAst\y#,0) gAstX=gAst\x# gAstY=gAst\y# gAstDir=gAst\dir Punkte=Punkte+100 Delete gAst Delete schuss gAst.Asteroid=New Asteroid gAst\x#=gAstX+40 gAst\y#=gAstY-40 gAst\typ=2 gAst\speed=gAst\typ+1 gAst\lebt=1 gAst\dir=Rand(1,4) gAst.Asteroid=New Asteroid gAst\x#=gAstX-40 gAst\y#=gAst\y#+40 gAst\typ=2 gAst\speed=gAst\typ+1 gAst\lebt=1 gAst\dir=Rand(1,4) EndIf Case 2 If ImagesCollide(schussimg(schuss\winkel),schuss\x#,schuss\y#,0,Asteroid2,gAst\x#,gAst\y#,0) Delete schuss Delete gAst Punkte=Punkte+200 nAsteroidK=nAsteroidK-1 If nAsteroidK=0 nAsteroid=0 level=level+1 nAsteroidK=MaxAstK(level) schiff\x#=400 schiff\y#=300 Text 400,300,"LEVEL "+level,True,True Flip Delay 2500 EndIf Exit EndIf Default End Select Next Next Next End Function Function Kollision2() For schiff.schiff=Each schiff For gAst.Asteroid=Each Asteroid If gAst\typ=1 ;kollision zwischen Asteroiden und schiff If ImagesCollide(schiffimg(schiff\winkel),schiff\x#,schiff\y#,0,Asteroid1,gAst\x#,gAst\y#,0) schiff\x#=400:DebugLog "bla" schiff\y#=300 schiff\leben=schiff\leben-1 If schiff\leben=-1 Delete Each Asteroid Delete Each schuss MakeHighscore() ShowHighscore() End EndIf EndIf Else If ImagesCollide(schiffimg(schiff\winkel),schiff\x#,schiff\y#,0,Asteroid2,gAst\x#,gAst\y#,0) schiff\x#=400 schiff\y#=300 schiff\leben=schiff\leben-1 If schiff\leben=-1 Delete Each Asteroid Delete Each schuss MakeHighscore() ShowHighscore() End EndIf EndIf EndIf Next Next End Function Function MakeBg() ;Hintergrund zeichnen For i=0 To 150 stern.stern=New stern stern\x#=Rand(0,800) stern\y#=Rand(0,600) stern\tiefe=Rand(1,3) stern\lebt=1 Next End Function Function DrawStar() For stern.stern=Each stern If stern\lebt=1 Select stern\tiefe Case 1 Color 255,255,255 Plot stern\x#,stern\y# Case 2 Color 125,125,125 Plot stern\x#,stern\y# Case 3 Color 95,95,95 Plot stern\x#,stern\y# Default End Select EndIf Color 255,255,255 Next End Function Function MakeHighscore() FlushKeys() Local name$ file=ReadFile("highscore") If Not file file=WriteFile("highscore") WriteLine file,"Muh" WriteLine file,"Muh" WriteLine file,"Muh" WriteLine file,"Muh" WriteLine file,"Muh" WriteLine file,"Muh" WriteLine file,"Muh" WriteLine file,"Muh" WriteLine file,"Muh" WriteLine file,"Muh" WriteInt file,15000 WriteInt file,14000 WriteInt file,13000 WriteInt file,12000 WriteInt file,11000 WriteInt file,10000 WriteInt file,9000 WriteInt file,8000 WriteInt file,7000 WriteInt file,6000 WriteInt file,5000 CloseFile file Else For i=1 To 10 HighscoreName$(i)=ReadLine(file) Next For i=1 To 10 HighScorePunkte(i)=ReadInt(file) Next Locate 400,300 name$=Input("Name:") Locate 0,0 For i=10 To 1 Step -1 If Punkte>HighScorePunkte(i) HighScorePunkte(i+1)=HighScorePunkte(i) HighscoreName$(i+1)=HighscoreName$(i) HighScorePunkte(i)=Punkte HighscoreName$(i+1)=HighscoreName$(i) Highscorename$(i)=name$ Else Exit EndIf Next file=WriteFile("highscore") For i=1 To 10 WriteLine file,HighscoreName$(i) Next For i=1 To 10 WriteInt file,HighScorePunkte(i) Next CloseFile file EndIf End Function Function ShowHighscore() Cls DrawStar() For i=1 To 10 Text 250,100+i*20,HighscoreName$(i) Next For i=1 To 10 Text 450,100+20*i,HighScorePunkte(i) Next Flip WaitKey() End Function MakeBg() While Not KeyDown(1) Cls DrawShip() MoveShip() Shoot() DrawShoot() MakeAsteroid() DrawAsteroid() Kollision() Kollision2() DrawStar() Text 400,0,"Level "+level Text 400,20,"Punkte: "+Punkte Flip Wend End |
||
- Zuletzt bearbeitet von girgl am Di, Jan 20, 2004 14:17, insgesamt einmal bearbeitet
-jc- |
Di, Jan 20, 2004 11:57 Antworten mit Zitat |
|
---|---|---|
ich hatte zunächst "array index out of bounds", weil das programm mit
[syntax="bb":1:492f3ae9a8] Dim MaxAst (AstCount) Dim MaxAstK(AstCount) [/syntax:1:492f3ae9a8] nichts anfangen kann. erst nachdem ich [syntax="bb":1:492f3ae9a8] AstCount = 50 [/syntax:1:492f3ae9a8] ergänzt hatte, lief das spiel - allerdings zu schnell, weil anscheinend nur die neuproduktion von asteroiden auf schnellen und langsamen rechnern gleich funktioniert. dein programmierstil gefällt mir (obwohl ich die funktionen lieber hinter dem hauptprogramm sähe). |
||
girgl |
Di, Jan 20, 2004 14:16 Antworten mit Zitat |
|
---|---|---|
oh,das mit AstCount hatte ich doch in MaxLevel umgeändert dachte ich.
Und das mit der Geschwindigkeit kann man ja durch nen timer beheben. Edit:Habe gerade gemerkt,dass die beiden dim-felder MaxAst und MaxAstK mit der Variable AstCount erstellt wurden und nich mit MaxLevel,dadurch gabs natürlich nur MaxAst(0) und MaxAstK(0),was auf deinen Fehler zurückführt.Hab das jetz geändert und nun sollt eigentlich alles wieder klappen |
||
pokop |
Do, Feb 12, 2004 15:32 Antworten mit Zitat |
|
---|---|---|
Ich hab nen Fehler gefunden, wenn du kaputgehst und ein Astriod ist in der Startposition, kannst du einpaken! | ||
http://www.abandonia.com/
--->Nikola Tesla<--- |
Übersicht BlitzBasic Codearchiv
Powered by phpBB © 2001 - 2006, phpBB Group