Vernünftige Tastatursteuerung

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

hectic

Sieger des IS Talentwettbewerb 2006

Betreff: Vernünftige Tastatursteuerung

BeitragSa, Feb 07, 2009 15:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Immer wieder werden zum Teil wirklich gute Spiele veröffentlicht, doch die Steuerung wird bei vielen einfach vernachlässigt. Auch wenn das Thema keine große Sache ist, möchte ich hier einen Vorschlag, mit der Hoffnung auf bessere Spiele, unterbreiten.

Was das alles soll, will ich mal im folgenden Fehlerbeispielen nennen:

Fehler 1: Oft werden einfache If KeyDown() -Abfragen hintereinander gestellt. In manchen Spielen kann man aber nur nach Links/Rechts (X) oder Oben/Unten (Y) gehen. Unweigerlich wird dann immer die letzte Abfrage die höhere Priorität haben. Das ist immer dann hinderlich, wenn man in einem engem Gang (zum Beispiel ''Pac-Man'') von einem Gegner verfolgt wird und schnell davon fliehen möchte. Daher sollte immer die Richtung eine höhere Priorität haben, in welcher man gerade nicht gegangen ist. So lässt sich auch realisieren, dass man automatisch im Zick-Zack-Muster eine Diagonale durchläuft, ohne ständig akrobatische Hochkünste auf der Tastatur abzulegen.

Fehler 2: Hat man nun den Fehler 1 umgeschrieben, gibt es noch weiteren Optimierungsbedarf. Wenn nun in einer Variable immer die letzte Richtung gespeichert wurde, dann kann es passieren, wenn man zum Beispiel an einer Stelle verweilt ist und plötzlich schräg loslaufen will (zwei Tasten werden innerhalb eines Loops gedrückt), dass nun gerade die nicht bevorzugte Richtung zuerst eingeschlagen wird. Daher spielt man oft auch unbewusst die eine Richtungstaste etwas früher an. Wenn aber beide Tasten innerhalb eines Loops gedrückt werden, kommt das Programm mit einfachen If KeyDown() -Abfragen nicht klar. Lösung dazu ist, das zusätzliche einholen des Tastaturpuffers über GetKey. Leider wird hier kein Dauerdrücken erkannt. Also muß eine Lösung her.

Folgende Logik macht einfach ausgedrückt folgendes: Es wird jedem Programmloop der Tastaturpuffer abgefragt. Wurde in diesem eine gültige Richtung festgestellt, so hat das abarbeiten dieser die höhste Priorität. Erst wenn keine Tastendruck-Informationen im Puffer gefunden wurden, wird über einfaches If KeyDown() die Richtung (Dauerdrücken) abgearbeitet. Allerdings bekommt die Richtung eine höhere Priorität, die bei der letzten Richtung nicht eingeschlagen wurde. So kann man auch in taktgeberischen Spielen geschmeidig und ohne Stress die kompliziertesten Labyrinthe durchlaufen. Die Spieler werden dankbar sein. Außerdem kann man komplizierte Wege im vorwege auf der Tastatur antippen, und die Spielfigur läuft immer erst die zuvor gedrückte Tastenfolge ab (Beispiel: 3* rechts, 2* hoch, 1* runter und dauer-rechts kein Problem). Damit das alles nachvollziehbar ist, habe ich den Timer auf 3 FPS gestellt. Aber auch in schnellen Spielen macht sich eine solche Logik bemerkbar.

Code:
Graphics 800,600,0,2
SetBuffer BackBuffer()

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

Local Timer=CreateTimer(3)

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 Richtung=NACHR Then X=X+1
   If Richtung=NACHO Then Y=Y-1
   If Richtung=NACHU Then Y=Y+1
   
   Rect X*10,Y*10,10,10,1
   
   WaitTimer Timer
   Flip 0
   Cls
Wend
End


Sollte das nicht Codearchiv würdig sein, so bitte löschen. Habe kein Problem damit.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

aMul

Sieger des Minimalist Compo 01/13

BeitragSa, Feb 07, 2009 16:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde das erste Else durch folgendes ersetzen:
Code:
End If
   If Richtung = KEINE Then

Ansonsten kann man indem man auf anderen Tastern hämmert die Bewegung anhalten.

Abgesehen von dieser Kleinigkeit aber wirklich ein toller Code, auf die Idee mit GetKey muss man erstmal kommen.
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group