I thought I'd take a look at something a bit different in this part, and that's how can we make the controls for the game redefinable. As standard, MPAGD will generate an Intro Menu for your game that offers the player a choice of controls:
KEYBOARD
KEMPSTON JOYSTICK
SINCLAIR JOYSTICK
REDEFINE
But, pressing 4 for REDEFINE only allows the player to define a PAUSE key. So far, our game has keys for:
UP
DOWN
LEFT
RIGHT JUMP
FART
So, how do we make them redefinable?
First, let's recall how we set the default keys for the game. We do this in the KEYBOARD CONTROLS in the EDITORS menu:
So these are the keys that the player will use by default.
If we want to make them redefinable we need to add some code to the INTRO MENU EVENT. This is what ours looks like so far:
EVENT INTROMENU
BORDER 0 ; black border
COLOUR 5 ; cyan ink on black paper
LET CONTROL = 99 ; initialise control with 99
WHILE CONTROL >= 99 ; for as long as control is >= 99
CLS ; clear the screen
PRINTMODE 1 ; print the following text in double height
AT 4 10 ; at line 4 column 10
MESSAGE 0 ; display the game title
CHR 33 ; '!'
PRINTMODE 0 ; revert back to normal height text.
AT 8 10 ; display the menu:
PRINT "1. KEYBOARD"
AT 10 10
PRINT "2. KEMPSTON"
AT 12 10
PRINT "3. SINCLAIR"
AT 14 10
PRINT "4. REDEFINE"
LET CONTROL = 99
WHILE CONTROL = 99
IF KEY OPTION1 ; if the 1 key is pressed
LET CONTROL = 0 ; control 0 = KEYBOARD
ENDIF
IF KEY OPTION2 ; if the 2 key is pressed
LET CONTROL = 1 ; control 1 = KEMPSTON
ENDIF
IF KEY OPTION3 ; if the 3 key is pressed
LET CONTROL = 2 ; control 3 is sinclair joystick
ENDIF
IF KEY OPTION4 ; if the 4 Key is pressed
CLS ; clear the screen
AT 3 9
PRINT "PRESS KEY FOR:"
AT 6 12
WHILE KEY OPTION4 ; wait for the 4 key to be released
ENDWHILE
PRINT "PAUSE"
DEFINEKEY FIRE3 ; the key pressed will be the new FIRE3 key
LET CONTROL = 100 ; set control to 100 which will end this
ENDIF
ENDWHILE
ENDWHILE
CLS ; clear the screen
CONTROL is a special MPAGD variable the defines which of the control methods the player will be using, the only values that make a difference are 0 (Keyboard) 1 (Kempston Joystick) or 2 (Sinclair Joystick)
That's why the code above initialises the CONTROL with the value 99, and the player wont leave the intro menu until they press either the 1 key (sets control to 0 for Keyboard), 2 key (sets the control to 1 for Kempston) or 3 key (sets the control to 2 for sinclair joystick)
The IF KEY statements are looking for OPTION1 (which if you look up at the Keyboard controls screenshot above is by default the '1' key), OPTION2, OPTION3 or OPTION4 key being pressed.
So, if you change your keyboard controls in the editor such that OPTION1 is the A key you would need to edit your menu so that it said A. KEYBOARD.
Confused? Hopefully not!
Back to the code.
The part we need to change is the IF KEY OPTION4 statement, change it to the code below (highlighted)
EVENT INTROMENU
BORDER 0 ; black border
COLOUR 5 ; cyan ink on black paper
LET CONTROL = 99 ; initialise control with 99
WHILE CONTROL >= 99 ; for as long as control is >= 99
CLS ; clear the screen
PRINTMODE 1 ; print the following text in double height
AT 4 10 ; at line 4 column 10
MESSAGE 0 ; display the game title
CHR 33 ; '!'
PRINTMODE 0 ; revert back to normal height text.
AT 8 10 ; display the menu:
PRINT "1. KEYBOARD"
AT 10 10
PRINT "2. KEMPSTON"
AT 12 10
PRINT "3. SINCLAIR"
AT 14 10
PRINT "4. REDEFINE"
LET CONTROL = 99
WHILE CONTROL = 99
IF KEY OPTION1 ; if the 1 key is pressed
LET CONTROL = 0 ; control 0 = KEYBOARD
ENDIF
IF KEY OPTION2 ; if the 2 key is pressed
LET CONTROL = 1 ; control 1 = KEMPSTON
ENDIF
IF KEY OPTION3 ; if the 3 key is pressed
LET CONTROL = 2 ; control 3 is sinclair joystick
ENDIF
IF KEY OPTION4 ; if the 4 Key is pressed
CLS ; clear the screen
AT 3 9
PRINT "PRESS KEY FOR:"
AT 6 12
WHILE KEY OPTION4 ; wait for the 4 key to be released
ENDWHILE
PRINT "UP"
DEFINEKEY UP ; the key pressed will be the new UP key
AT 8 12
PRINT "DOWN"
DEFINEKEY DOWN ; the key pressed will be the new down key
AT 10 12
PRINT "LEFT"
DEFINEKEY LEFT ; the key pressed will be the new left key
AT 12 12
PRINT "RIGHT"
DEFINEKEY RIGHT ; the key pressed will be the new RIGHT key
AT 14 12
PRINT "JUMP"
DEFINEKEY FIRE1 ; the key pressed will be the new JUMP key
AT 16 12
MESSAGE 3 ; message #3 is FART
DEFINEKEY FIRE2 ; the key pressed will be the new FART key
AT 18 12
PRINT "PAUSE"
DEFINEKEY FIRE3 ; this will be the PAUSE key
LET CONTROL = 100 ; set control to 100 which will end this and will return us to the menu
ENDIF
ENDWHILE
ENDWHILE
CLS ; clear the screen
So here, we use the DEFINEKEY command to ask for a keypress and whatever key is pressed becomes the new key for whichever key type we require. We are limited to only using and redefining the 11 key types that MPAGD allows:
UP
DOWN
LEFT
RIGHT
FIRE1
FIRE2
FIRE3
OPTION1
OPTION2
OPTION3
OPTION4
Note that if you make the OPTIONx keys redefinable they WILL affect your control selection menu! so if your menu displays 1.KEYBOARD but someone redefines OPTION1 to say the T key, when they try to select keyboard with the 1 key, it wont work, they would have to press T!
Hopefully you also noticed that rather than use PRINT "FART" I used MESSAGE 3 as I already have the word FART stored as a reusable message...just saved you a few bytes there!
Let's give it a test...
Cool, now we have redefinable keys!
Yorumlar