Genereller Aufbau eines Spieles
Übersicht

RetroBetreff: Genereller Aufbau eines Spieles |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Gernerell | ||
between angels and insects |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group