key handling for space-invaders

release
chris.double 2006-03-29 10:54:35 +00:00
parent 61e110bb75
commit 6810968be8
2 changed files with 141 additions and 28 deletions

View File

@ -2,6 +2,7 @@ IN: scratchpad
USING: kernel parser compiler words sequences io ;
"/contrib/parser-combinators/load.factor" run-resource
"/contrib/concurrency/load.factor" run-resource
{
"cpu-8080"

View File

@ -21,7 +21,8 @@
! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
! ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
USING: alien cpu-8080 errors generic io kernel kernel-internals
lists math namespaces sequences styles threads gadgets gadgets-layouts opengl arrays ;
lists math namespaces sequences styles threads gadgets gadgets-layouts opengl arrays
concurrency ;
IN: space-invaders
TUPLE: space-invaders port1 port2i port2o port3o port4lo port4hi port5o bitmap ;
@ -122,38 +123,66 @@ M: space-invaders reset ( cpu -- )
: gui-frame ( cpu -- )
dup gui-frame/2 gui-frame/2 ;
TUPLE: invaders-gadget cpu ;
TUPLE: invaders-gadget cpu process ;
C: invaders-gadget dup delegate>gadget ;
TUPLE: coin-down-msg ;
TUPLE: coin-up-msg ;
TUPLE: player1-down-msg ;
TUPLE: player1-up-msg ;
TUPLE: player2-down-msg ;
TUPLE: player2-up-msg ;
TUPLE: fire-down-msg ;
TUPLE: fire-up-msg ;
TUPLE: left-down-msg ;
TUPLE: left-up-msg ;
TUPLE: right-down-msg ;
TUPLE: right-up-msg ;
: coin-key-pressed ( process -- )
#! Workaround lack of up event from gui.
<coin-down-msg> over send [ 10 sleep <coin-up-msg> swap send ] spawn drop ;
: do-draw2 ( gadget -- )
: player1-key-pressed ( process -- )
#! Workaround lack of up event from gui.
<player1-down-msg> over send [ 10 sleep <player1-up-msg> swap send ] spawn drop ;
: player2-key-pressed ( process -- )
#! Workaround lack of up event from gui.
<player2-down-msg> over send [ 10 sleep <player2-up-msg> swap send ] spawn drop ;
: fire-key-pressed ( process -- )
#! Workaround lack of up event from gui.
<fire-down-msg> over send [ 10 sleep <fire-up-msg> swap send ] spawn drop ;
: left-key-pressed ( process -- )
#! Workaround lack of up event from gui.
<left-down-msg> over send [ 10 sleep <left-up-msg> swap send ] spawn drop ;
: right-key-pressed ( process -- )
#! Workaround lack of up event from gui.
<right-down-msg> over send [ 10 sleep <right-up-msg> swap send ] spawn drop ;
: set-key-actions ( gadget -- )
H{
{ [ "BACKSPACE" ] [ invaders-gadget-process coin-key-pressed ] }
{ [ "1" ] [ invaders-gadget-process player1-key-pressed ] }
{ [ "2" ] [ invaders-gadget-process player2-key-pressed ] }
{ [ "UP" ] [ invaders-gadget-process fire-key-pressed ] }
{ [ "LEFT" ] [ invaders-gadget-process left-key-pressed ] }
{ [ "RIGHT" ] [ invaders-gadget-process right-key-pressed ] }
} add-actions ;
C: invaders-gadget ( gadget -- )
dup delegate>gadget
dup set-key-actions ;
M: invaders-gadget pref-dim* drop { 224 256 0 0 } ;
M: invaders-gadget draw-gadget* ( gadget -- )
0 0 glRasterPos2i
1.0 -1.0 glPixelZoom
>r 224 256 GL_RGB GL_UNSIGNED_BYTE r>
invaders-gadget-cpu space-invaders-bitmap glDrawPixels ;
M: invaders-gadget draw-gadget* ( gadget -- )
do-draw2 ;
M: invaders-gadget pref-dim* drop { 224 256 0 0 } ;
: sync-frame ( millis -- millis )
#! Sleep until the time for the next frame arrives.
1000 60 / >fixnum + millis - dup 0 > [ sleep ] [ drop ] if millis ;
: (event-loop) ( millis gadget -- )
>r sync-frame r>
dup invaders-gadget-cpu gui-frame
dup relayout-1
(event-loop) ;
: event-loop ( gadget -- )
[
dup invaders-gadget-cpu space-invaders-bitmap bitmap set
millis swap (event-loop)
] with-scope ;
: black { 0 0 0 } ;
: white { 255 255 255 } ;
@ -194,8 +223,91 @@ M: space-invaders update-video ( value addr cpu -- )
3drop
] if ;
GENERIC: handle-invaders-message ( gadget message -- quit? )
! Any unknown message quits the process
M: object handle-invaders-message ( gadget message -- quit? )
2drop t ;
M: coin-down-msg handle-invaders-message ( gadget message -- quit? )
drop invaders-gadget-cpu
[ space-invaders-port1 1 bitor ] keep
set-space-invaders-port1 f ;
M: coin-up-msg handle-invaders-message ( gadget message -- quit? )
drop invaders-gadget-cpu
[ space-invaders-port1 255 1 - bitand ] keep
set-space-invaders-port1 f ;
M: player1-down-msg handle-invaders-message ( gadget message -- quit? )
drop invaders-gadget-cpu
[ space-invaders-port1 4 bitor ] keep
set-space-invaders-port1 f ;
M: player1-up-msg handle-invaders-message ( gadget message -- quit? )
drop invaders-gadget-cpu
[ space-invaders-port1 255 4 - bitand ] keep
set-space-invaders-port1 f ;
M: player2-down-msg handle-invaders-message ( gadget message -- quit? )
drop invaders-gadget-cpu
[ space-invaders-port1 2 bitor ] keep
set-space-invaders-port1 f ;
M: player2-up-msg handle-invaders-message ( gadget message -- quit? )
drop invaders-gadget-cpu
[ space-invaders-port1 255 2 - bitand ] keep
set-space-invaders-port1 f ;
M: fire-down-msg handle-invaders-message ( gadget message -- quit? )
drop invaders-gadget-cpu
[ space-invaders-port1 HEX: 10 bitor ] keep
set-space-invaders-port1 f ;
M: fire-up-msg handle-invaders-message ( gadget message -- quit? )
drop invaders-gadget-cpu
[ space-invaders-port1 255 HEX: 10 - bitand ] keep
set-space-invaders-port1 f ;
M: left-down-msg handle-invaders-message ( gadget message -- quit? )
drop invaders-gadget-cpu
[ space-invaders-port1 HEX: 20 bitor ] keep
set-space-invaders-port1 f ;
M: left-up-msg handle-invaders-message ( gadget message -- quit? )
drop invaders-gadget-cpu
[ space-invaders-port1 255 HEX: 20 - bitand ] keep
set-space-invaders-port1 f ;
M: right-down-msg handle-invaders-message ( gadget message -- quit? )
drop invaders-gadget-cpu
[ space-invaders-port1 HEX: 40 bitor ] keep
set-space-invaders-port1 f ;
M: right-up-msg handle-invaders-message ( gadget message -- quit? )
drop invaders-gadget-cpu
[ space-invaders-port1 255 HEX: 40 - bitand ] keep
set-space-invaders-port1 f ;
: sync-frame ( millis -- millis )
#! Sleep until the time for the next frame arrives.
1000 60 / >fixnum + millis - dup 0 > [ sleep ] [ drop ] if millis ;
: invaders-process ( millis gadget -- )
#! Run a space invaders gadget inside a
#! concurrent process. Messages can be sent to
#! signal key presses, etc.
[
[ sync-frame ] dip
dup invaders-gadget-cpu space-invaders-bitmap bitmap set
dup invaders-gadget-cpu gui-frame
dup relayout-1
] while-no-messages
dup receive handle-invaders-message [ invaders-process ] unless ;
: run ( -- )
<space-invaders> "invaders.rom" over load-rom
<invaders-gadget> [ set-invaders-gadget-cpu ] keep
<invaders-gadget> [ set-invaders-gadget-cpu ] keep
dup "Space Invaders" open-window
[ event-loop ] cons in-thread ;
dup [ millis swap invaders-process ] cons spawn
swap dupd set-invaders-gadget-process ;