What I think it looks like you're doing with the spikes is having it in some sort of REPEAT or WHILE loop.
When your code hits that loop, it will do everything in the loop until the loop ends. This will freeze out the other events.
As your spikes start occurring a little into the game, I'm assuming you have some sort of a timing loop (to make the spikes appear after say 2 seconds?)
what you will need to do is hook into that timing loop to advance the spikes rather than having a repeat.
So I'm assuming your code is something like
LET S = 20 ; S = spike progress
WHILE S > 0
AT S 10 ;assuming S for Y, 10 for X
PUTBLOCK [spike block]
DELAY 25 ; a little delay
SUBTRACT 1 FROM S
ENDWHILE
What you would need to do is hook into the timing loop
From my previous game, I setup a timing loop in mainloop1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; things that happen on any screen
;; TIMER LOOP TO CATCH EVERY X SECCONDS
IF J <= 12 ; often this is 24 for 25fps, I'm using 12 to make things a little quicker
ADD 1 TO J
ELSE
LET J = 0
ENDIF
I then have a condition on my block movements so it triggers on a certain value of J - so once a second
;; this sets up a trigger on J = 9. In my game I trigger on most values of J but I select a different area of the screen to look at
IF J = 9
LET OBJ = 1
; I don't use OBJ in the game so stealing the variable
LET OPT = 40 ; ditto for options
LET RND = 56 ; and RND doesn't get set - free variables :-)
ENDIF
IF OBJ = 1 ; I have seen the trigger, advance my blocks
LET M = 0 ;
LET C = RND ; Y
;;; etc
So rather than having a big repeating loop, you trigger an advancement and then exit the loop so the other events (player etc) can keep running
I hope that helps and makes some sort of sense
M.