Vernünftige Tastatursteuerung
Übersicht

![]() |
hecticSieger des IS Talentwettbewerb 2006Betreff: Vernünftige Tastatursteuerung |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() |
aMulSieger des Minimalist Compo 01/13 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich würde das erste Else![]() 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 ![]() |
||
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group