Genereller Aufbau eines Spieles

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Retro

Betreff: Genereller Aufbau eines Spieles

BeitragDo, Aug 05, 2004 20:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm, sollte man Spiele wie unten aufbauen?

Ich dachte immer eine Schleife in der verschiedene Funktionen abgefragt werden und bei Bedarf weitere Funktionen aufgerufen werden.

Außerdem dürfte doch untenstehendes Beispiel nicht gleichschnell auf allen Maschinen laufen oder?



Repeat

DrawImage schiff, X,Y

; Schuß-Test

If KeyHit(57) Then
Schuss = Schuss + 1
If Schuss = 101 Then Schuss = 1
Rak(Schuss,0) = 1
Rak(Schuss,1) = X+10
Rak(Schuss,2) = Y-19
PlaySound(schusston)
EndIf

; ggf. 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) - 10
EndIf
Next

; Pfeiltasten abfragen
If KeyDown(205) = 1 Then X = X + 2
If KeyDown(203) = 1 Then X = X - 2

; Rand-Überschreitung verhindern
If X < 0 Then X = 0
If X > 609 Then X = 609

; Kollision testen
For I=1 To 100
If Rak(I,0) <> 0 Then
For J=1 To 5
If ImagesOverlap(alienbild, Alien(J,1), Alien(J,2), rakete, Rak(I,1),Rak(I,2)) Then
PlaySound(trefferton)
Alien(J,0) = -1
EndIf
Next
EndIf
Next

; Explosion Alien zeichnen
For I=1 To 5
If Alien(I,0) = -1 Then
If AlienExplodiert(I,1) + 100 < MilliSecs() Then
AlienExplodiert(I,0) = AlienExplodiert(I,0) + 1
AlienExplodiert(I,1) = MilliSecs()

If AlienExplodiert(I,0) = 6 Then
AlienExplodiert(I,0) = 0
AlienExplodiert(I,1) = 0
Alien(I,0) = 0
EndIf
EndIf
DrawImage explosion, Alien(I,1), Alien(I,2), AlienExplodiert(I,0)
EndIf
Next

; Alien-Steuerung
For I=1 To 5
If Alien(I,0) = 0 Then
Alien(I,0) = Rand(100,400)
Alien(I,1) = Rand(-20,640)
Alien(I,2) = Rand(-100,0)
EndIf

If Alien(I,0) <> -1 Then
Alien(I,2) = Alien(I,2) + 1
Alien(I,1) = 320 + Sin( Alien(I,2) ) * Alien(I,0)
EndIf

If Alien(I,2) > 480 Then Alien(I,0) = 0

If Alien(I,0) <> -1 Then DrawImage alienbild, Alien(I,1),Alien(I,2)
Next

Flip
Until KeyDown(1)

MVB

BeitragDo, Aug 05, 2004 21:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist Code aus Rene's Buch, oder? Dann lese mal weiter, ... dann weißt du wie man das Problem mit den Geschwindigkeitsunterschieden lösst.
PS: Ich glaub das Problem wird sogar schon vorher behandelt.
aquamonit.de|BlitzMax|MaxGUI
 

Retro

BeitragDo, Aug 05, 2004 21:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Richtig, mir ist nur unklar, warum er das trotz falschen Zeitmanagement und Aufbau als "Spielgerüst" anbietet... zum Lernen der Steuerung sicherlich hilfreich, aber danach müßte man ja alles nochmal umprogrammieren.

Markus2

BeitragDo, Aug 05, 2004 23:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Ne,
so ist doof und das wird unübersichtlich ,
also wenn dann die Blöcke in Unterfunktionen packen .
Wenn man die Framerate limitiert auf 50 oder mehr Frames
und auf vielen Rechnern diese Rate erreichst kannst du so arbeiten .
Und generell immer mit einer Hauptfunktion beginnen die
wiederum unterteilt ist in Menü,Options,Spielen etc.
 

René Meyer

BeitragDo, Aug 05, 2004 23:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Im Buch sind ja keine fertigen Spiele, sondern sehr einfache Gerüste, die 1-2 Seiten lang sind. Daher habe ich dort auf Funktionen verzichtet.

Im Shooter sind aber in der Tat keine Timer-Befehle, die habe ich wohl vergessen. :) Allerdings wird das Thema ja ausgiebig beschrieben.
www.blitzbasic.de | Das Buch zu Blitz Basic: www.schreibfabrik.de/txt/bbb
 

Retro

BeitragDo, Aug 05, 2004 23:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay, dann werde ich mir das mal zu Gemüte führen.

"Wenn man die Framerate limitiert auf 50 oder mehr Frames"

Kleines Beispiel?

Für ein grobes (!) Gerüst nur betreffs der Zeit wär ich trotzdem dankbar...

Jolinah

BeitragFr, Aug 06, 2004 2:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Kleines Beispiel wie man die FPS limitieren könnte.

Code: [AUSKLAPPEN]

Graphics 1024,768,0,1
SetBuffer BackBuffer()

;Vars zum limitieren
Const SET_FPS# = 50
Const FPS_PERIOD# = 1000 / SET_FPS#  ;Wie fleissig wird gezeichnet (ms)
Global DRAW_TIME# = millisecs()    ;wann wird gezeichnet

;Vars zum zählen der tatsächlichen Frames
Global FPS = SET_FPS#   ;Am Anfang auch 50, Fehlervermeidung
Global FPS_COUNTER = 0  ;Zählt pro Zeichnungsdurchgang 1 dazu
Global COUNT_TIME = millisecs() + 1000  ;In 1 Sekunde Frames zählen.


Repeat

  ms = millisecs()

  If ms >= DRAW_TIME# then
 
    Cls
    ;Zeichnen...
    Flip
 
    DRAW_TIME# = Float#(ms) + FPS_PERIOD# ;Wann wieder zeichnen?
    FPS_COUNTER = FPS_COUNTER + 1   ;Wir haben 1 Frame mehr

  Endif

  If ms >= COUNT_TIME then
   
    FPS = FPS_COUNTER  ;Die gezählten Frames in FPS speichern
    FPS_COUNTER = 0     ;Wieder von Vorne beginnen mit zählen
    COUNT_TIME = ms + 1000   ;Das nächste mal in 1 sek. wieder in FPS speichern.

  Endif

Until Keyhit(1)

EndGraphics
End



Vor dem Zeichnen kommt dann deine Eingabe und Verarbeitung. Die Eingabe wird dann öfters abgefragt als ein Bild gezeichnet wird. Also könntest du auf 10 FPS limitieren und trotzdem läuft die Tastatureingabe flüssig.

Wenn du Flip 0 statt Flip schreibst wird VSync deaktiviert und du kannst viel höhere Frameraten erreichen. VSync wartet auf den Bildschirm bis er mit dem derzeitigen Bildaufbau fertig ist soviel ich weiss. Dabei wird das ganze Programm für diese Dauer angehalten. Folglich läuft deshalb alles schneller wenn er nicht extra darauf warten muss.

Markus2

BeitragFr, Aug 06, 2004 12:38
Antworten mit Zitat
Benutzer-Profile anzeigen
@René Meyer
Ich kenn dein Buch zwar nicht aber denke das es so ok
ist wie du es dargestellt hast und bei kleinen Quelltexten
zum lernen ist es ja auch so besser zum verstehen .

@Jolinah
Wenn du die synchronisation weg nimmst sieht der
Fensterinhalt beim bewegen aber ziemlich fusselig aus .

@Retro
Meine kurz Version Smile
Das ABS ist dafür da wenn der Zähler wieder von 0 anfängt .
Code: [AUSKLAPPEN]

  t1=MilliSecs()

  ...

  While Abs(t1-MilliSecs())<10 ;10ms=100 FPS Max.
  Wend
  Flip

Jan_

Ehemaliger Admin

BeitragFr, Aug 06, 2004 13:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, so baue ich das ungefähr auf.

Code: [AUSKLAPPEN]
;Deklerationen
   Const Title$ = "Spiel Aufbau"
   Const Step_Menu_load = 0,Step_Menu = 1,Step_Menu_unload = 2
   Const Step_Game_Load = 3,Step_Game = 4,Step_Game_Unload = 5

   Global fenster
   Global canvas
   Global Buffer
   Global Timer
   Global Steps
   
   Global Map_Pos_Y
   
   Dim down(255)
   Dim Hit(255)

Main()
End

Function Main()
   ende = 0
   Create_Scene()
   Repeat
      Repeat
         weiter=0
         Select WaitEvent()
            Case $803 : Ende=1
            Case $4001 : weiter = 1
         End Select
      Until weiter
      
      ;Wich Part of the Program
         If Steps = Step_Game Then Game()
      
      
      ;Updates
         FlipCanvas Canvas,False
      
   Until ende = 1
End Function

Function Game()
   Update_Steuerung()
End Function

Function Update_Steuerung()
   Local i,h
   For i = 0 To 255
   
      h = down(i)
      down(i) = KeyDown(i)
      
      If h=0
         hit(i)=Down(i)
      Else
         hit(i)=0
      EndIf
      
   Next
   
End Function


Function Graph()
   fenster=CreateWindow(Title$,GadgetWidth(Desktop())/2-320,GadgetHeight(Desktop())/2-240,320,240,0,1+2+8)
   Canvas=CreateCanvas(2,2,306,200,fenster)
   SetGadgetLayout Canvas,1,1,1,1
   SetStatusText fenster,Title$+" - By Jan Kuhnert"
   SetBuffer CanvasBuffer(Canvas)
End Function

Function Create_Scene()
   Timer=CreateTimer (60)
   Graph()
End Function
between angels and insects
 

Retro

BeitragFr, Aug 06, 2004 14:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Sollte man das generell in die Hauptschleife packen oder lieber nur dort die FPS-Abfrage einbauen wo es wirklich nötig ist?

Jan_

Ehemaliger Admin

BeitragFr, Aug 06, 2004 14:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Gernerell
between angels and insects

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group