Asteroids Klon

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

 

girgl

Betreff: Asteroids Klon

BeitragMo, Jan 19, 2004 20:59
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink

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-

BeitragDi, Jan 20, 2004 11:57
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Jan 20, 2004 14:16
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Wink

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

BeitragDo, Feb 12, 2004 15:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab nen Fehler gefunden, wenn du kaputgehst und ein Astriod ist in der Startposition, kannst du einpaken!
http://www.abandonia.com/

--->Nikola Tesla<---

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group