Dank Timer bewegt sich RetroSnake nicht sauber

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

FunctionBauer

Betreff: Dank Timer bewegt sich RetroSnake nicht sauber

BeitragFr, Jul 23, 2010 23:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich arbeite an einem kleinen Retro-Snake Projekt und will dementsprechend auch den Timer zur Simulation niedriger Frameraten nutzen. Da mein Spielfeld auf 32 mal so grosse einzelfelder aufgeteilt ist, passiert es manchmal, dass die (noch sehr kleine) Snake sich nicht sauber auf die Y-Achse bewegt sondern noch ein "Tile" auf der X-Achse weiterfaehrt. Ich hoffe ihr versteht was ich meine. hier der Code: Code: [AUSKLAPPEN]
;Variablen
Const gwidth = 1024
Const gheight = 768
Const tile=32
x=1 : y=1 : length=1

;Voreinstellungen
Graphics gwidth, gheight, 32, 1
SetBuffer BackBuffer()
timer=CreateTimer (5)

;Hauptschleife
Repeat
WaitTimer(timer)
Cls


;kasten
Rect 0,0, 1024, 30
Rect 0,0, 30, 768
Rect 994,0, 30, 768
Rect 0,738, 1024, 30

;keyabfragen
If KeyHit(205) Or dire=1 Then x = x + 1 : dire = 1
If KeyHit(203) Or dire=2 Then x = x - 1 : dire = 2

If KeyHit(208) Or dire=3 Then y = y + 1 : dire = 3
If KeyHit(200) Or dire=4 Then y = y - 1 : dire = 4
;kollision
If x <= 1 Then x = 1
If x => 30 Then x = 30
If y <= 1 Then y = 1
If y => 22 Then y = 22

;aufmalen
Rect x*tile, y*tile, tile*length, tile

Flip
Until KeyHit(1)
Intel Quad Core 6600 Geforce 9500 GT
4 GB DDR-2 RAM 500 GB-Samsung

Pummelie

BeitragFr, Jul 23, 2010 23:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein Timer von 5 ist einfach zu wenig, um ein Spiel gute Eingabe zu gewähren...

Versuch es mal ohne Timer, und mit Millisecs
Da kannst du zb. festlegen das das Bild nur 5 mal die Sekunde gemalt wird, wenn du folgenden Pseudocode verwendest:
BlitzBasic: [AUSKLAPPEN]
;grafik zeug
;lade zeug
Local ms=MilliSecs()+200 ;millisecs +200 senden, da es ja 5 mal die sekunde aktualisieren soll
Repeat ;start der main schleife
;keyabfragen, und berechnungszeug
If MilliSecs()>ms Then ;hier überprüfen ob die zeit abgelaufen ist, wenn ja das zeichenzeug machen
Cls
Rect 0,0, 1024, 30
Rect 0,0, 30, 768
Rect 994,0, 30, 768
Rect 0,738, 1024, 30
Rect x*tile, y*tile, tile*length, tile
Flip
ms=MilliSecs()+200 ;timer wirder setzen
EndIf
Until KeyDown(1)
It's done when it's done.

Megamag

BeitragFr, Jul 23, 2010 23:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit Timer benutzt man eigentlich Flip 0.
Mein DeviantArt Profil
Gewinner des BAC #136
 

Blitzjockey

BeitragFr, Jul 23, 2010 23:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Oder, um den Belastung der Processor zu minimieren, eine Kombination.

Pummelie hat recht, ein Timer von (5) bedeutet das dass ganze Programm nur 5 mal pro Sekunde Sachen wie Tastatur abfragen erledigt. Das ist, wie Du gesehen hast, zu wenig.
Allerdings läuft Pummelies Version mit maximale Geschwindigkeit. Das heisst, er kontrolliert 100.000 mal pro Sekunde ob er schon wieder ein Bild malen darf. Dass ist übertrieben, das würde bedeuten das er nur alle 20.000 durchläufen 1 mal malen muss.
Stattdessen kann man Timer (60) benutzen. Dann wird der Hauptschleife 60 mal pro Sekunde durchlaufen, dass ist schon mal eine gute Richtwert was Tasten eingabe auslesen angeht.

Daneben kann man dann, für das Auffrischen der Monitor-inhalt, der von Pummelie verwendete MacGyver-Timer benutzen.
Der sorgt dafür das Dein Programm dann innerhalb den Schleife der 60 mal pro Sekunde läuft, nur 5 mal pro Sekunde das Bild auffrischt. Damit hast Du den ersparnissen von eine reduzierte Leistung regelmäßige abfrage der Tastatur, und zusätzlich eine sehr ruhige Update vom angezeigtem Bild.
  • Zuletzt bearbeitet von Blitzjockey am Fr, Jul 23, 2010 23:41, insgesamt einmal bearbeitet

FunctionBauer

BeitragFr, Jul 23, 2010 23:40
Antworten mit Zitat
Benutzer-Profile anzeigen
@pummelchen
Sieht nach einer guten Loesung aus.. Wink
Hab es bei mir nur noch nicht verwendbar einsetzen koennen. es flackert nur alles und laeuft nicht mehr stabil. irgendeine idee?
Intel Quad Core 6600 Geforce 9500 GT
4 GB DDR-2 RAM 500 GB-Samsung
 

Blitzjockey

BeitragFr, Jul 23, 2010 23:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Hast Du "Flip" jetzt innerhalb Pummelchens If-abfrage gestellt, oder steht der auch noch mal in der Hauptschleife?

FunctionBauer

BeitragFr, Jul 23, 2010 23:46
Antworten mit Zitat
Benutzer-Profile anzeigen
noch innerhalb der normalschleife
Code: [AUSKLAPPEN]
;Variablen
Const gwidth = 1024
Const gheight = 768
Const tile=32
x=1 : y=1 : length=1

;Voreinstellungen
Graphics gwidth, gheight, 32, 1
SetBuffer BackBuffer()

millisekunden=MilliSecs() + 200

;Hauptschleife
Repeat
WaitTimer(timer)
Cls
;keyabfragen
If KeyHit(205) Or dire=1 Then x = x + 1 : dire = 1
If KeyHit(203) Or dire=2 Then x = x - 1 : dire = 2

If KeyHit(208) Or dire=3 Then y = y + 1 : dire = 3
If KeyHit(200) Or dire=4 Then y = y - 1 : dire = 4
;kollision
If x <= 1 Then x = 1
If x => 30 Then x = 30
If y <= 1 Then y = 1
If y => 22 Then y = 22

If MilliSecs()>millisekunden Then
;kasten
Rect 0,0, 1024, 30
Rect 0,0, 30, 768
Rect 994,0, 30, 768
Rect 0,738, 1024, 30
;aufmalen
Rect x*tile, y*tile, tile*length, tile

millisekunden=MilliSecs() + 200

End If
Intel Quad Core 6600 Geforce 9500 GT
4 GB DDR-2 RAM 500 GB-Samsung

FunctionBauer

BeitragFr, Jul 23, 2010 23:55
Antworten mit Zitat
Benutzer-Profile anzeigen
ach geil jetzt kommt auch noch "memory access violation" hinzu Very Happy
Intel Quad Core 6600 Geforce 9500 GT
4 GB DDR-2 RAM 500 GB-Samsung

Pummelie

BeitragFr, Jul 23, 2010 23:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Du must cls und Flip schon wie in meinem beispiel in die if abfrage rein hauen.

Du kannst dir das ganze so vorstellen, das die Grafik erstmal zu Nebenache gemaht wird, und der Rest die CPU-Leistung bekommt.

PS: Doppelpost sind böse, nutze den Edit Buton Evil or Very Mad
It's done when it's done.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, Jul 24, 2010 0:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Du tust ja förmlich so, als ob BlitzBasic nur scheiße wäre und keine Fehler von dir aus gingen...

Hier mal ein Beispiel einer möglichen Steuerung:

Code: [AUSKLAPPEN]
Graphics 1024,768,0,2
SetBuffer BackBuffer()

Const TILE=32

Const KEINE=0 ;Keine
Const NACHL=1 ;Links
Const NACHR=2 ;Rechts
Const NACHO=3 ;Oben
Const NACHU=4 ;Unten

Local Timer=CreateTimer(6)

Local Richtung
Local Letzte
Local KCode
Local X=10
Local Y=10




While Not KeyHit(1)
   
   KCode=GetKey()
   Letzte=Richtung
;   Richtung=KEINE
   
   If KCode>0 Then
      Select KCode
         Case 28 Richtung=NACHO
         Case 29 Richtung=NACHU
         Case 30 Richtung=NACHR
         Case 31 Richtung=NACHL
      End Select
      
   Else
      If Letzte=NACHL Or Letzte=NACHR Then
         If KeyDown(205) Then Richtung=NACHR
         If KeyDown(203) Then Richtung=NACHL
         If KeyDown(200) Then Richtung=NACHO
         If KeyDown(208) Then Richtung=NACHU
         
      Else
         If KeyDown(200) Then Richtung=NACHO
         If KeyDown(208) Then Richtung=NACHU
         If KeyDown(205) Then Richtung=NACHR
         If KeyDown(203) Then Richtung=NACHL
      End If
   End If
   
   If Richtung=NACHL Then X=X-1: If X<01 Then X=01
   If Richtung=NACHR Then X=X+1: If X>30 Then X=30
   If Richtung=NACHO Then Y=Y-1: If Y<01 Then Y=01
   If Richtung=NACHU Then Y=Y+1: If Y>22 Then Y=22
   
   Rect 0,0,1024,30
   Rect 0,0,30,768
   Rect 994,0,30,768
   Rect 0,738,1024,30
   
   Rect X*TILE,Y*TILE,TILE,TILE,1
   
   WaitTimer Timer
   Flip 0
   Cls
Wend
End
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

Blitzjockey

BeitragSa, Jul 24, 2010 0:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Und der MAV kommt vielleicht wegen der Timer den Du benutzt in der Schleife, den ich aber in Deine gepostete Code nicht initiert sehe? Aber ich glaube Du hast ohnehin nur eine Abschnitt gezeigt?

Pummelie

BeitragSa, Jul 24, 2010 0:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Leute, wir stehen doch gerade wieder mal an so einer Situation (oder kanpp davor):
user posted image

SO jetzt mal an FunctionBauer:
Du solltest dich wirklich noch ein bisschen mehr mit BB auseinadersetzen (damit mein ich die Tuts).
It's done when it's done.

rambo256

BeitragSa, Jul 24, 2010 1:22
Antworten mit Zitat
Benutzer-Profile anzeigen
OT:Klasse Pic, kannte ich ja noch gar nicht. Es spiegelt aber genau meine Erfahrungen mit ihm wieder *G*

@Topic:
Normalerweise zeigt dir der Compiler auch an, wo genau der MAV auftritt, dann sucht man im Regelfall in dieser Zeile nach Objekten btw eher Referenzen und überprüft, ob man diese im vorherigen Ablauf entweder nicht initialisiert oder sogar gelöscht hat.
Asus F53z

Das Leben ist eine reine Konkatenation...

FunctionBauer

BeitragSa, Jul 24, 2010 9:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Also jetzt regt euch mal ab Leute . Very Happy
Ich mein klar hat mich das aufgeregt mit der MAV, aber dennoch muss (!) dieses Problem ja wohl vom Benutzer ausgehen, da eine Maschine keine Fehler macht. Es war wohl einfach nur ein bisschen zu spaet gestern. Und zu der (witzigen) Illustration: Ich weiss gar nicht warum das ploetzlich auf alle so gewirkt hat, als habe ich einen wutausbruch. Ich danke Hectic fuer seinen Loeungsvorschlag, funktioniert sehr gut.
Smile

Und Pummelie ist ja schoen, dass du dieses tolle Bild den anderen Mitgliedern zeigen musstest, nur denke ich war das hier in diesem Moment wohl nicht zwingend angebracht.

Und klar bin ich noch ein Lernender aber es lag gestern echt an der Uhrzeit, zumal wir in Indien noch 3 einhalb Stunden + haben.

Okay trotzdem Danke an alle.
Intel Quad Core 6600 Geforce 9500 GT
4 GB DDR-2 RAM 500 GB-Samsung
 

Blitzjockey

BeitragSa, Jul 24, 2010 10:25
Antworten mit Zitat
Benutzer-Profile anzeigen
FunctionBauer hat Folgendes geschrieben:

Und Pummelie ist ja schoen, dass du dieses tolle Bild den anderen Mitgliedern zeigen musstest, nur denke ich war das hier in diesem Moment wohl nicht zwingend angebracht.


Stimmt, aber es war richtig witzig! (Ausser für Dich vielleicht, aber nimm's bitte nicht al zu persönlich..)

Hubsi

BeitragSa, Jul 24, 2010 11:50
Antworten mit Zitat
Benutzer-Profile anzeigen
FunctionBauer hat Folgendes geschrieben:
...das ploetzlich auf alle so gewirkt hat, als habe ich einen wutausbruch...
Nein, nein. Du bist dieser niedliche Noob links vorne Mr. Green
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group