2008-10-01 21:12:46 -04:00
|
|
|
! Copyright (C) 2006, 2007, 2008 Alex Chapman
|
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2010-06-10 17:39:13 -04:00
|
|
|
USING: accessors timers arrays calendar kernel make math math.rectangles
|
|
|
|
math.parser namespaces sequences system tetris.game tetris.gl ui.gadgets
|
|
|
|
ui.gadgets.labels ui.gadgets.worlds ui.gadgets.status-bar ui.gestures
|
|
|
|
ui.render ui ;
|
2008-10-01 21:12:46 -04:00
|
|
|
IN: tetris
|
|
|
|
|
2010-06-10 17:39:13 -04:00
|
|
|
TUPLE: tetris-gadget < gadget { tetris tetris } { timer } ;
|
2008-10-01 21:12:46 -04:00
|
|
|
|
|
|
|
: <tetris-gadget> ( tetris -- gadget )
|
2009-02-16 05:04:32 -05:00
|
|
|
tetris-gadget new swap >>tetris ;
|
2008-10-01 21:12:46 -04:00
|
|
|
|
|
|
|
M: tetris-gadget pref-dim* drop { 200 400 } ;
|
|
|
|
|
|
|
|
: update-status ( gadget -- )
|
|
|
|
dup tetris>> [
|
2020-02-11 16:57:19 -05:00
|
|
|
[ "Level: " % level # ]
|
2009-11-30 18:51:29 -05:00
|
|
|
[ " Score: " % score>> # ]
|
|
|
|
[ paused?>> [ " (Paused)" % ] when ] tri
|
2008-10-01 21:12:46 -04:00
|
|
|
] "" make swap show-status ;
|
|
|
|
|
|
|
|
M: tetris-gadget draw-gadget* ( gadget -- )
|
|
|
|
[
|
2009-02-05 04:28:41 -05:00
|
|
|
[ dim>> first2 ] [ tetris>> ] bi draw-tetris
|
2008-10-01 21:12:46 -04:00
|
|
|
] keep update-status ;
|
|
|
|
|
|
|
|
: new-tetris ( gadget -- gadget )
|
|
|
|
[ <new-tetris> ] change-tetris ;
|
|
|
|
|
2009-11-30 18:51:29 -05:00
|
|
|
: unless-paused ( tetris quot -- )
|
|
|
|
over tetris>> paused?>> [
|
|
|
|
2drop
|
|
|
|
] [
|
|
|
|
call
|
|
|
|
] if ; inline
|
|
|
|
|
2008-10-01 21:12:46 -04:00
|
|
|
tetris-gadget H{
|
2008-12-15 21:31:55 -05:00
|
|
|
{ T{ button-down f f 1 } [ request-focus ] }
|
2009-11-30 18:51:29 -05:00
|
|
|
{ T{ key-down f f "UP" } [ [ tetris>> rotate-right ] unless-paused ] }
|
|
|
|
{ T{ key-down f f "d" } [ [ tetris>> rotate-left ] unless-paused ] }
|
|
|
|
{ T{ key-down f f "f" } [ [ tetris>> rotate-right ] unless-paused ] }
|
|
|
|
{ T{ key-down f f "e" } [ [ tetris>> rotate-left ] unless-paused ] }
|
|
|
|
{ T{ key-down f f "u" } [ [ tetris>> rotate-right ] unless-paused ] }
|
|
|
|
{ T{ key-down f f "LEFT" } [ [ tetris>> move-left ] unless-paused ] }
|
|
|
|
{ T{ key-down f f "RIGHT" } [ [ tetris>> move-right ] unless-paused ] }
|
|
|
|
{ T{ key-down f f "DOWN" } [ [ tetris>> move-down ] unless-paused ] }
|
|
|
|
{ T{ key-down f f " " } [ [ tetris>> move-drop ] unless-paused ] }
|
2008-10-01 21:12:46 -04:00
|
|
|
{ T{ key-down f f "p" } [ tetris>> toggle-pause ] }
|
|
|
|
{ T{ key-down f f "n" } [ new-tetris drop ] }
|
|
|
|
} set-gestures
|
|
|
|
|
|
|
|
: tick ( gadget -- )
|
|
|
|
[ tetris>> ?update ] [ relayout-1 ] bi ;
|
|
|
|
|
|
|
|
M: tetris-gadget graft* ( gadget -- )
|
2010-06-10 17:39:13 -04:00
|
|
|
[ [ tick ] curry 100 milliseconds every ] keep timer<< ;
|
2008-10-01 21:12:46 -04:00
|
|
|
|
|
|
|
M: tetris-gadget ungraft* ( gadget -- )
|
2010-06-10 17:39:13 -04:00
|
|
|
[ stop-timer f ] change-timer drop ;
|
2008-10-01 21:12:46 -04:00
|
|
|
|
2015-06-29 19:43:15 -04:00
|
|
|
: tetris-window ( -- )
|
2008-10-01 21:12:46 -04:00
|
|
|
[
|
|
|
|
<default-tetris> <tetris-gadget>
|
|
|
|
"Tetris" open-status-window
|
|
|
|
] with-ui ;
|
|
|
|
|
|
|
|
MAIN: tetris-window
|