Weekly Qbasic and Qb64 Lesson Topics
April 19, 2024, 03:55:28 am
Welcome, Guest. Please login or register.
Did you miss your activation email?

Login with username, password and session length
News: Want to see a specific Tutorial? ASK!
 
  Home Help Search Arcade Links Staff List Login Register  

Duke Nukem Game Rewrite.

Pages: [1] 2 3
  Print  
Author Topic: Duke Nukem Game Rewrite.  (Read 2124 times)
none
Guest
« on: May 31, 2011, 11:54:45 am »

Hi all,
    On discussion with Unseen about how we would handle the keyboard routine , we pondered over the existing GDK idea of a type and dim.
Quote
TYPE KeyBoardState
    Left AS LONG
    Right AS LONG
    Down AS LONG
    Up AS LONG
    CTRL AS LONG
    SHIFT AS LONG
    ALT AS LONG
    SPACE AS LONG
    ENTER AS LONG
    ESC AS LONG
    Num1 AS LONG
    Num2 AS LONG
    Num3 AS LONG
    Num4 AS LONG
    Num5 AS LONG
    Num6 AS LONG
    Num7 AS LONG
    Num8 AS LONG
    Num9 AS LONG
    Num0 AS LONG
    PLUS AS LONG
    MINUS AS LONG
    BACKSPACE AS LONG
    TAB AS LONG
    A AS LONG
    B AS LONG
    C AS LONG
    D AS LONG
    E AS LONG
    F AS LONG
    G AS LONG
    H AS LONG
    I AS LONG
    J AS LONG
    K AS LONG
    L AS LONG
    M AS LONG
    N AS LONG
    O AS LONG
    P AS LONG
    Q AS LONG
    R AS LONG
    S AS LONG
    T AS LONG
    U AS LONG
    V AS LONG
    W AS LONG
    X AS LONG
    Y AS LONG
    Z AS LONG
END TYPE

SUB GDK_Keyboard_GetState (KeyboardRef AS KeyBoardState)
FOR x% = 1 TO 88 'read each key scancode from array
    IF x% = 1 THEN KeyboardRef.ESC = scankey%(x%)
    IF x% = 2 THEN KeyboardRef.Num1 = scankey%(x%)
    IF x% = 3 THEN KeyboardRef.Num2 = scankey%(x%)
    IF x% = 4 THEN KeyboardRef.Num3 = scankey%(x%)
    IF x% = 5 THEN KeyboardRef.Num4 = scankey%(x%)
    IF x% = 6 THEN KeyboardRef.Num5 = scankey%(x%)
    IF x% = 7 THEN KeyboardRef.Num6 = scankey%(x%)
    IF x% = 8 THEN KeyboardRef.Num7 = scankey%(x%)
    IF x% = 9 THEN KeyboardRef.Num8 = scankey%(x%)
    IF x% = 10 THEN KeyboardRef.Num9 = scankey%(x%)
    IF x% = 11 THEN KeyboardRef.Num0 = scankey%(x%)
    IF x% = 12 THEN KeyboardRef.PLUS = scankey%(x%)
    IF x% = 13 THEN KeyboardRef.MINUS = scankey%(x%)
    IF x% = 14 THEN KeyboardRef.BACKSPACE = scankey%(x%)
    IF x% = 15 THEN KeyboardRef.TAB = scankey%(x%)
    IF x% = 30 THEN KeyboardRef.A = scankey%(x%)
    IF x% = 48 THEN KeyboardRef.B = scankey%(x%)
    IF x% = 46 THEN KeyboardRef.C = scankey%(x%)
    IF x% = 32 THEN KeyboardRef.D = scankey%(x%)
    IF x% = 18 THEN KeyboardRef.E = scankey%(x%)
    IF x% = 33 THEN KeyboardRef.F = scankey%(x%)
    IF x% = 34 THEN KeyboardRef.G = scankey%(x%)
    IF x% = 35 THEN KeyboardRef.H = scankey%(x%)
    IF x% = 23 THEN KeyboardRef.I = scankey%(x%)
    IF x% = 36 THEN KeyboardRef.J = scankey%(x%)
    IF x% = 37 THEN KeyboardRef.K = scankey%(x%)
    IF x% = 38 THEN KeyboardRef.L = scankey%(x%)
    IF x% = 50 THEN KeyboardRef.M = scankey%(x%)
    IF x% = 49 THEN KeyboardRef.N = scankey%(x%)
    IF x% = 24 THEN KeyboardRef.O = scankey%(x%)
    IF x% = 25 THEN KeyboardRef.P = scankey%(x%)
    IF x% = 16 THEN KeyboardRef.Q = scankey%(x%)
    IF x% = 19 THEN KeyboardRef.R = scankey%(x%)
    IF x% = 31 THEN KeyboardRef.S = scankey%(x%)
    IF x% = 20 THEN KeyboardRef.T = scankey%(x%)
    IF x% = 22 THEN KeyboardRef.U = scankey%(x%)
    IF x% = 47 THEN KeyboardRef.V = scankey%(x%)
    IF x% = 17 THEN KeyboardRef.W = scankey%(x%)
    IF x% = 45 THEN KeyboardRef.X = scankey%(x%)
    IF x% = 21 THEN KeyboardRef.Y = scankey%(x%)
    IF x% = 44 THEN KeyboardRef.Z = scankey%(x%)
    IF x% = 72 THEN KeyboardRef.Up = scankey%(x%)
    IF x% = 75 THEN KeyboardRef.Left = scankey%(x%)
    IF x% = 77 THEN KeyboardRef.Right = scankey%(x%)
    IF x% = 80 THEN KeyboardRef.Down = scankey%(x%)
    IF x% = 28 THEN KeyboardRef.ENTER = scankey%(x%)
    IF x% = 57 THEN KeyboardRef.SPACE = scankey%(x%)
    IF x% = 29 THEN KeyboardRef.CTRL = scankey%(x%)
    IF x% = 56 THEN KeyboardRef.ALT = scankey%(x%)
    IF x% = 42 THEN KeyboardRef.SHIFT = scankey%(x%)
NEXT
END SUB

FUNCTION scankey% (scancode%)
STATIC Ready%, keyflags%()
IF NOT Ready% THEN REDIM keyflags%(0 TO 127): Ready% = -1 'the keyboard states
i% = INP(&H60)
IF (i% AND 128) THEN keyflags%(i% XOR 128) = 0
IF (i% AND 128) = 0 THEN keyflags%(i%) = -1
WHILE INKEY$ <> "": WEND
scankey% = keyflags%(scancode%)
END FUNCTION

I disclosed that i believe that Galleon's efforts with _KEYDOWN were suppose to be faster. He agreed in the sense that if its faster then we would go with that idea. And so this routine was born. Any comments?
Code:
REM    KeyBoard1.bas
DEFLNG A-Z

CONST True = -1, False = 0

TYPE KeyBoardState
  Left AS LONG
  Right AS LONG
  Down AS LONG
  Up AS LONG
  CTRL AS LONG
  SHIFT AS LONG
  ALT AS LONG
  SPACE AS LONG
  ENTER AS LONG
  ESC AS LONG
END TYPE

DIM KeyRef AS KeyBoardState
'------------------------------------------------------------------------------------------------------------------------------------
SCREEN 12
DO
  _LIMIT 30

  KeyState KeyRef
  LOCATE 9, 1: PRINT "Left", "Up", "Down", "Right"
  LOCATE 10, 1
  PRINT KeyRef.Left, KeyRef.Up, KeyRef.Down, KeyRef.Right
  LOCATE 12, 1: PRINT "CTRL", "ALT", "Shift", "Space"
  LOCATE 13, 1
  PRINT KeyRef.CTRL, KeyRef.ALT, KeyRef.SHIFT, KeyRef.SPACE

  _DISPLAY
LOOP UNTIL Done = 1
SLEEP
SYSTEM
'------------------------------------------------------------------------------------------------------------------------------------

SUB KeyState (KeyRef AS KeyBoardState)
KeyRef.ESC = _KEYDOWN(27)
KeyRef.SPACE = _KEYDOWN(32)
KeyRef.Left = _KEYDOWN(19200)
KeyRef.Right = _KEYDOWN(19712)
KeyRef.Down = _KEYDOWN(20480)
KeyRef.Up = _KEYDOWN(18432)

IF _KEYDOWN(100305) OR _KEYDOWN(100306) THEN KeyRef.CTRL = True ELSE KeyRef.CTRL = False
IF _KEYDOWN(100307) OR _KEYDOWN(100308) THEN KeyRef.ALT = True ELSE KeyRef.ALT = False
IF _KEYDOWN(100303) OR _KEYDOWN(100304) THEN KeyRef.SHIFT = True ELSE KeyRef.SHIFT = False
KeyRef.ENTER = _KEYDOWN(13)
END SUB

Compared to the existing key routine this seems it may be faster on paper. This routine can be expanded to cover more keys later. At the moment this routine treats the separate R + L shift , alt and ctrl keys as only one of each. The idea is in a game we only interested if a key is down or up and not so much which of the two keys it is. Although this can be changed later.

« Last Edit: September 08, 2011, 11:10:31 pm by GarrisonRicketson » Report Spam   Logged

Pages: [1] 2 3
  Print  
 
Jump to:  

Powered by EzPortal
Bookmark this site! | Upgrade This Forum
SMF For Free - Create your own Forum


Powered by SMF | SMF © 2016, Simple Machines
Privacy Policy