• Bruce

Let's create an MPAGD game - Part 19: The other blocks: DEADLY, CUSTOM and WATER

Updated: Oct 30, 2021

Let's finish off learning about the different types of blocks we can use to design our games screens by looking at the ones we haven't used yet:


  • DEADLYBLOCKs

  • CUSTOMBLOCKs

  • WATERBLOCKs


DEADLY BLOCKS

In general we use DEADLYBLOCKS when we want to inflict damage or kill the player if they touch them.


Let's create some deadly spikes... open up the Block Editor and press X to add a new block:


Design your DEADLYBLOCK and keep clicking the white block type selector to cycle through to DEADLYBLOCK.


Next, we'll add some deadly blocks to a screen, from the Editor menu select screens, then click your deadly block in the block bank and click to place some in your screen:





Next, take a look in your PLAYER EVENT code, you should find a statement that looks like this:



IF DEADLY                      ; am I touching something deadly?
    KILL                       ; if so, kill me
ENDIF

DEADLY is a function, it tests to see if the player is touching a DEADLYBLOCK and if so, it will run whatever is contained within the IF...ENDIF statement - as standard, this will be KILL


BUT IT DOESNT HAVE TO! you could change this, in fact you can do whatever you like with it...it doesn't even have to be something bad or damaging to the player!


For now though, we'll leave it as it is and test our game.


So now Stinky Dog will die if he touches the deadly spikes.



CUSTOMBLOCKs

In many respects CUSTOMBLOCKs operate exactly the same as DEADLYBLOCKS, they too have a corresponding function which we can test for using IF CUSTOM.


All you need to do is write some code that will activate when the player touches a CUSTOMBLOCK.


Let's create some slippery ice, that if Stinky Dog stands on he will slide across, open up the BLOCK EDITOR, hit X for a new block and design some ice. Then click through the white blocktype selector box and stop at CUSTOMBLOCK:


Let's now add a row of these custom ice blocks to our screen: (Editor > Screens )



And before we write any code for what should happen, let's see what happens by default, test your game:




As you can see, as standard, CUSTOMBLOCKs are like EMPTYBLOCKS, the player just passes through them - which kind of makes sense, as we can use them for whatever purpose we like. But in our game, ideally we want them to be like WALLBLOCKS, the player cant pass through them but can stand on them...but then have a special property that forces the player to move in the direction they are facing.


First, let's see if we can achieve this by writing some code. We could try the STOPFALL command, this will stop the player from falling through them. Then, as we are storing the players current direction in the DIRECTION variable we could write some IF DIRECTION = statements to force movement...it might look something like this:



IF CUSTOM                      ; if player touches the ice
   STOPFALL                    ; stop them falling
   IF DIRECTION = LEFT         ; if they were travelling left
      SPRITELEFT               ; go left
      SPRITELEFT               ; go left some more
   ENDIF
   IF DIRECTION = RIGHT        ; if they were going right
      SPRITERIGHT              ; go right
      SPRITERIGHT              ; go right some more
   ENDIF
ENDIF

Note that I've doubled up on the SPRITELEFT/RIGHTs - this should give the effect of faster movement when on the ice. Let's give it a test:








OK, it kind of works, the first time I jumped on the ice I slid across to the left, but when I hit the ice from beneath I slid to the right by my head. Then I jumped back on and used the LEFT and RIGHT keys and Stinky dog slid from side to side.


The IF CUSTOM function only knows I am touching a custom block, it doesn't know it is ice and that I cant slide underneath it.


The trick to solve this issue in our game is to switch the ice blocks to WALLBLOCKS and then create a new CUSTOM block that we will place above the ice WALLBLOCKS. Before we test it, we'll remove the STOPFALL command from the IF CUSTOM code that we just wrote. Let's give it a test:


Change the ice block to a WALLBLOCK:




Create a new custom block (I've added the word ICE on it so you can see it when we place it on the screen...we'll remove it later):



Add your new custom blocks above the ice


And give it a test:




OK, It's getting better, now stinky dog is sliding on the ice, he also can't slide underneath it. He can, however still move from left to right using the LEFT and RIGHT keys. This might be OK for your game, but I want to force the movement and not allow him to move or jump when on the ice.


And the solution to this is quite easy, all we need to do is wrap all of our IF KEY statements inside the ELSE part of:



IF CUSTOM
{force the sliding on the ice}
ELSE
{all the if key statements go here}
ENDIF


What this means is : as long as we are not touching a custom block you can use the keys to move. Let's give this a test (note that I have removed the word ICE from my custom block and left the single row of white pixels at the bottom of it:





To check your progress, here's what your PLAYER EVENT code should look like by now:




EVENT PLAYER
;===============STINKY DOG=================
IF CUSTOM
   IF DIRECTION = LEFT         ; if they were travelling left
      SPRITELEFT               ; go left
      SPRITELEFT               ; go left some more
   ENDIF
   IF DIRECTION = RIGHT        ; if they were going right
      SPRITERIGHT              ; go right
      SPRITERIGHT              ; go right some more
   ENDIF
ELSE
   IF KEY LEFT                    ; Is the left key pressed?
       LET DIRECTION = LEFT       ; if so, remember I am going LEFT
       LET IMAGE = 1              ; display the left facing image
       IF X <= LEFTEDGE           ; are we at the left edge of the screen?
           SCREENLEFT             ; if so, go to the screen to left on the map
           LET X = RIGHTEDGE      ; and put me at the right edge of that screen
           EXIT                   ; and stop processing this event
       ELSE                       ; if I'm not at the left edge
           IF CANGOLEFT           ; is there space to the left of me?
               SPRITELEFT         ; if so move me left
               ANIMATE            ; and animate me
	       ELSE
		      DIG LEFT
           ENDIF
       ENDIF
   ENDIF

   IF KEY RIGHT                   ; Is the right key pressed?
      LET DIRECTION = RIGHT      ; if so, remember I am going RIGHT
      LET IMAGE = 0              ; display the right facing image
      IF X >= RIGHTEDGE          ; Am I at the right edge of the screen?
         SCREENRIGHT            ; if so go to the screen to right on the map
         LET X = LEFTEDGE       ; and put me at the left edge
         EXIT                   ; and stop processing this event
      ELSE                       ; if I'm not at the right edge
         IF CANGORIGHT          ; is there space to the right of me?
            SPRITERIGHT         ; if so, move me right
            ANIMATE             ; and animate me?
	     ELSE
		    DIG RIGHT 
         ENDIF
      ENDIF
   ENDIF

   IF KEY UP                      ; is the UP key pressed?
      ANIMATE SLOW                ; if so, animate me slowly
      IF LADDERABOVE              ; is there a ladder above me?
         IF CANGOUP               ; can I go up?
            LET IMAGE = 3         ; display the image of me climbing
    	    SPRITEUP              ; move me up
            LET DIRECTION = UP    ; remember I am going up
         ELSE                     ; if there is a ladder above me, but I cant go up
            ADD 1 TO Y            ; nudge me 1 pixel to the right
         ENDIF
      ELSE                        ; if there isn't a ladder above me
         SPRITELEFT               ; move me left
         IF LADDERABOVE           ; now is there a ladder above me?
         ELSE                     ; if not
            SPRITERIGHT           ; move me back where I was
            SPRITERIGHT           ; then a bit more to the right
            IF LADDERABOVE        ; now is there a ladder above me?
      	    ELSE                  ; if not
               SPRITELEFT         ; move me back where I was
            ENDIF
         ENDIF
      ENDIF
   ENDIF


   IF KEY DOWN                    ; is the DOWN key pressed?
      ANIMATE SLOW                ; if so, animate me slowly
      IF LADDERBELOW              ; is there a ladder below me?
         LET IMAGE = 3            ; if so, set my image to the climbing one
         SPRITEDOWN               ; move me down
         LET DIRECTION = DOWN     ; remember I am going down
      ELSE                        ; if there isn't a ladder below me
         SPRITELEFT               ; move me left
         IF LADDERBELOW           ; is there a ladder below me now?   
         ELSE                     ; if not
            SPRITERIGHT           ; move me back where I was
            SPRITERIGHT           ; then a bit more to the right
            IF LADDERBELOW        ; now is there a ladder below me?
            ELSE                  ; if not
               SPRITELEFT         ; move me back where I was
            ENDIF
         ENDIF
      ENDIF
   ENDIF


   IF KEY FIRE                    ; is the Fire key being pressed?
      JUMP 7                     ; if so, make me Jump to height 7
   ENDIF
 ENDIF                          ; end of the movement code  
 IF KEY FIRE2                    ; is the FIRE2 key being pressed?
   IF F = 0                     ; if there is no fart in play
      IF DIRECTION = LEFT       ; if Stinky Dog is facing Left
         ADD 16 TO X            ; set X 16 pixels to the right
         SPAWN 2 4              ; SPAWN a fart (TYPE 2, IMAGE 4)
         SUBTRACT 16 FROM X     ; reset X to its original position
         LET F = 1              ; there is now a fart in play
      ELSE
         IF DIRECTION = RIGHT   ; if Stinky Dog is facing Right
            SUBTRACT 16 FROM X  ; set X 16 pixels to the left
            SPAWN 2 4           ; SPAWN a fart (TYPE 2, IMAGE 4)
            ADD 16 TO X         ; reset X to its original position
            LET F = 1           ; there is now a fart in play
         ENDIF
      ENDIF               
   ENDIF
ENDIF



FALL                           ; make me fall if there is nothing below me

IF DEADLY                      ; am I touching something deadly?
    KILL                       ; if so, kill me
ENDIF



GETBLOCKS                      ; if I touch any collectible blocks, run the Collected Block script

WATERBLOCKS

As of MPAGD 0.7.10 WATERBLOCKs have not been implemented fully, you can create waterblocks but they wont have any special features, they'll be like EMPTYBLOCKS. When they get implemented fully I will update this tutorial. NEXT: PART 20: SCOREs, LIVES and DISPLAYing stuff.






126 views0 comments

Want to support my work?....Buy my games!

aboutME

Hello, I'm Bruce and I write games for old 8bit computers using Jonathan Cauldwell's excellent Multi-Platform Arcade Games Designer (MPAGD)

I've written a few successful* games for the Sinclair ZX Spectrum and MSX platforms that have been (largely) well received with my most recent game - Twenty Four Hour Parsley People scoring a 10 out of 10 on Planeta Sinclair.

In my blog I am sharing lots of the code that I wrote for my games, in a way that you can use in your own games.   I've commented it so that you'll learn some of the techniques I use to create interesting new mechanics and help your games stand out from the pack.

MPAGD includes lots of standard scripts, they're great to get you started, but if you're new (or just rusty) when it comes to writing code, hopefully my tutorials will help you get started and  turn your imagination into awesome 8 bit games!

All my code is free to use and do with as you please, but if you find them useful please feel free to buy me a coffee ...or better still - buy or download my games :)

*successful is a very relative term in 8bit computer games