factor/examples/factoroids/actors.factor

95 lines
2.5 KiB
Factor
Raw Normal View History

2005-11-15 03:19:57 -05:00
USING: arrays gadgets generic hashtables io kernel math
2005-11-15 23:25:22 -05:00
namespaces opengl prettyprint sdl sequences threads ;
2005-11-15 03:19:57 -05:00
IN: factoroids
SYMBOL: player
SYMBOL: actors
: add-actor dup actors get push ;
: remove-actor actors get delete ;
2005-11-15 23:25:22 -05:00
TUPLE: actor model colors up expiry ;
2005-11-15 03:19:57 -05:00
2005-11-15 23:25:22 -05:00
C: actor ( model colors position angle size -- actor )
[ >r <body> r> set-delegate ] keep
[ set-actor-colors ] keep
[ set-actor-model ] keep ;
2005-11-15 03:19:57 -05:00
2005-11-15 23:25:22 -05:00
TUPLE: projectile owner ;
2005-11-15 03:19:57 -05:00
2005-11-15 23:25:22 -05:00
C: projectile ( actor owner -- projectile )
[ set-projectile-owner ] keep
[ set-delegate ] keep ;
2005-11-15 03:19:57 -05:00
2005-11-15 23:25:22 -05:00
GENERIC: can-collide* ( actor actor -- ? )
2005-11-15 03:19:57 -05:00
2005-11-15 23:25:22 -05:00
M: projectile can-collide* ( actor actor -- ? )
over projectile? >r projectile-owner eq? r> or not ;
2005-11-15 03:19:57 -05:00
2005-11-15 23:25:22 -05:00
M: actor can-collide* ( actor actor -- ) 2drop t ;
2005-11-15 03:19:57 -05:00
2005-11-15 23:25:22 -05:00
GENERIC: collision
2005-11-15 03:19:57 -05:00
2005-11-15 23:25:22 -05:00
M: actor collision ( actor actor -- ) drop remove-actor ;
2005-11-15 03:19:57 -05:00
2005-11-15 23:25:22 -05:00
: can-collide? ( actor actor -- ? )
2dup eq? [
2drop f
] [
2dup can-collide* >r swap can-collide* r> and
] if ;
2005-11-15 03:19:57 -05:00
2005-11-15 23:25:22 -05:00
: collidable ( actor -- seq )
actors get [ can-collide? ] subset-with ;
2005-11-15 03:19:57 -05:00
2005-11-15 23:25:22 -05:00
: ?collision ( actor actor -- )
2dup [ body-position ] 2apply v- norm 2 <=
[ 2dup collision 2dup swap collision ] when 2drop ;
2005-11-15 03:19:57 -05:00
2005-11-15 23:25:22 -05:00
: ?collisions ( actor -- )
dup collidable [ ?collision ] each-with ;
2005-11-15 03:19:57 -05:00
2005-11-15 23:25:22 -05:00
: ?expire-actor
dup actor-expiry
[ millis <= [ dup remove-actor ] when ] when* drop ;
2005-11-15 03:19:57 -05:00
2005-11-15 23:25:22 -05:00
: actor-tick ( time actor -- )
dup ?expire-actor dup ?collisions body-tick ;
2005-11-15 03:19:57 -05:00
: draw-actor ( actor -- )
GL_MODELVIEW [
dup body-position gl-translate
dup body-angle over body-up gl-rotate
dup body-size gl-scale
dup actor-colors swap actor-model draw-model
] do-matrix ;
2005-11-15 23:25:22 -05:00
: spawn-big-block ( position -- )
>r cube { { 1/2 1/2 1 1 } } r> 360 random-int { 3 3 3 } <actor> add-actor ;
2005-11-15 03:19:57 -05:00
: init-actors
V{ } clone actors set
2005-11-15 23:25:22 -05:00
{ 15 3 25 } spawn-big-block
{ 20 2 25 } spawn-big-block
{ 30 1 20 } spawn-big-block
{ 30 1/2 15 } spawn-big-block
factoroid { { 1 0 0 1 } { 2/3 0 0 1 } } { 25 1/2 25 } 0 { 3/4 1/4 2 } <actor> player set
2005-11-15 03:19:57 -05:00
player get add-actor ;
: draw-actors
actors get [ draw-actor ] each ;
: tick-actors ( time -- )
2005-11-15 23:25:22 -05:00
actors get clone [ actor-tick ] each-with ;
2005-11-15 03:19:57 -05:00
: add-expiring-actor ( actor time-to-live -- )
millis + over set-actor-expiry add-actor ;
2005-11-15 23:25:22 -05:00
: <rocket> ( position angle owner -- rocket )
>r >r >r rocket { { 1 1 0 1 } { 1 1 1 1 } } r> r> { 1/2 1/2 5 }
<actor> r> <projectile> 1/2000 over set-body-acceleration ;
: spawn-rocket ( position angle owner -- )
<rocket> 1000 add-expiring-actor ;