Implement time-based lerp, footer animation

This commit is contained in:
Jeremy Penner 2019-02-11 23:23:00 -05:00
parent e9e8fa804a
commit 835a5159cf
7 changed files with 88 additions and 6 deletions

View file

@ -8,8 +8,9 @@ s" jorth.log" open const LOGFILE
: 2dup over over ; : 2dup over over ;
: noop ; : noop ;
: defer word new-word docolon , ' noop , ' ret , ; : defer word new-word docolon , ' noop , ' ret , ;
: is ( cp -- ) word lookup drop cell + ! ; : redefine ( cp cpdeferred ) cell + ! ;
: decompile : decompile
word lookup if 1 begin ( cp i ) word lookup if 1 begin ( cp i )

BIN
game.exe

Binary file not shown.

View file

@ -1,6 +1,8 @@
: blah : blah
' seremit task-emit ! ' seremit task-emit !
' log-emit task-echo ! ; ' log-emit task-echo ! ;
blah
' seremit task-emit !
: start-repl activate blah : start-repl activate blah
s" .:: J O R T H ( jean forth) ::." type cr s" .:: J O R T H ( jean forth) ::." type cr
@ -51,6 +53,30 @@ defentity player
100 player entity.x ! 100 player entity.x !
100 player entity.y ! 100 player entity.y !
( timer + lerping )
: clamp0 ( range val -- i )
2dup <= if drop else
dup 0 <= if drop drop 0 else
swap drop then then ;
: >ratio ( range value -- f )
over swap clamp0 >fix swap >fix fix/ ;
: <ratio ( range ratio -- v )
swap >fix fix* <fix ;
: >range ( start end -- start range ) over - ;
: <range ( start range -- start end ) over + ;
: lerpr ( start end ratio ) r> >range r< <ratio + ;
: lerpn ( start1 end1 start2 end2 val )
r> >range r< rot - >ratio lerpr ;
: lerp ( start end duration timer -- i )
@ ticks udelta ( start end duration delta )
>ratio lerpr ;
: triggered ( duration timer -- b )
dup r> @ ticks udelta ( duration delta )
2dup <= if drop r< +! 1 else drop drop 0 then ;
: now! ( timer -- ) ticks swap ! ;
: tick-player : tick-player
0 ^LEFT key-down if 3 - W player entity.dir ! then 0 ^LEFT key-down if 3 - W player entity.dir ! then
^RIGHT key-down if 3 + E player entity.dir ! then ^RIGHT key-down if 3 + E player entity.dir ! then
@ -59,6 +85,33 @@ defentity player
^DOWN key-down if 3 + S player entity.dir ! then ^DOWN key-down if 3 + S player entity.dir ! then
player entity.y +! ; player entity.y +! ;
var MODE-TRAVEL
var MODE-TEXT
var split-timer
: enter-mode-text
split-timer now!
MODE-TEXT @ ' tick redefine ;
: mode-travel
tick-player
^SPACE key-pressed if
enter-mode-text
then ;
' mode-travel MODE-TRAVEL !
: mode-text-hide
24 0 10 split-timer lerp dup split-screen
0 = if ' mode-travel ' tick redefine then ;
: mode-text-show
0 24 10 split-timer lerp split-screen
^SPACE key-pressed if
split-timer now!
' mode-text-hide ' tick redefine
then ;
' mode-text-show MODE-TEXT !
: draw-player : draw-player
player entity.x @ player entity.x @
player entity.y @ player entity.y @
@ -75,5 +128,5 @@ defentity player
600 600 2 draw-sprite 600 600 2 draw-sprite
draw-screen ; draw-screen ;
' tick-player is tick MODE-TRAVEL @ ' tick redefine
' full-draw is draw ' full-draw ' draw redefine

BIN
game.prj

Binary file not shown.

27
jorth.c
View file

@ -93,6 +93,23 @@ BINOP(f_or, u, ||)
BINOP(f_bitand, u, &) BINOP(f_bitand, u, &)
BINOP(f_bitor, u, |) BINOP(f_bitor, u, |)
BINOP(f_bitxor, u, ^) BINOP(f_bitxor, u, ^)
BINOP(f_shr, u, >>)
BINOP(f_shl, u, <<)
void f_itofix() {
TOP().i = TOP().i << FIX_FRACTIONAL_BITS;
}
void f_fixtoi() {
TOP().i = TOP().i >> FIX_FRACTIONAL_BITS;
}
void f_fixmul() {
ST1().i = ((long)ST1().i * (long)TOP().i) / (1 << FIX_FRACTIONAL_BITS);
DROP(1);
}
void f_fixdiv() {
ST1().i = ((long)ST1().i * (1 << FIX_FRACTIONAL_BITS)) / TOP().i;
DROP(1);
}
void f_eq0() { void f_eq0() {
TOP().i = (TOP().i == 0); TOP().i = (TOP().i == 0);
@ -217,13 +234,13 @@ void f_word() {
int key = ' '; int key = ' ';
int ibuf = 0; int ibuf = 0;
while (key == ' ' || key == '\n' || key == '\r') { while (key == ' ' || key == '\t' || key == '\n' || key == '\r') {
f_key(); f_key();
key = TOP().i; key = TOP().i;
DROP(1); DROP(1);
} }
while (key != ' ' && key != '\n' && key != '\r' && key != 0) { while (key != ' ' && key != '\t' && key != '\n' && key != '\r' && key != 0) {
buf[ibuf++] = key; buf[ibuf++] = key;
f_key(); f_key();
key = TOP().i; key = TOP().i;
@ -794,6 +811,12 @@ void f_init() {
CDEF("&", f_bitand); CDEF("&", f_bitand);
CDEF("|", f_bitor); CDEF("|", f_bitor);
CDEF("^", f_bitxor); CDEF("^", f_bitxor);
CDEF("<<", f_shl);
CDEF(">>", f_shr);
CDEF(">fix", f_itofix);
CDEF("<fix", f_fixtoi);
CDEF("fix*", f_fixmul);
CDEF("fix/", f_fixdiv);
CDEF("@", f_get); CDEF("@", f_get);
CDEF("!", f_set); CDEF("!", f_set);
CDEF("+!", f_addset); CDEF("+!", f_addset);

View file

@ -3,6 +3,7 @@
#define MEM_SIZE 16384 #define MEM_SIZE 16384
#define STACK_SIZE 64 #define STACK_SIZE 64
#define RSTACK_SIZE 32 #define RSTACK_SIZE 32
#define FIX_FRACTIONAL_BITS 5
void f_init(); void f_init();

View file

@ -175,7 +175,10 @@ void f_scroll() { // ( x y -- )
void f_ticks() { void f_ticks() {
PUSHU(timer_counter); PUSHU(timer_counter);
} }
void f_splitscreen() {
setSplitScreen(399 - (TOP().i << 1));
DROP(1);
}
void game_f_init() { void game_f_init() {
f_init(); f_init();
CDEF("seremit", f_seremit); CDEF("seremit", f_seremit);
@ -184,6 +187,7 @@ void game_f_init() {
CDEF("draw-sprite", f_drawSprite); CDEF("draw-sprite", f_drawSprite);
CDEF("scroll", f_scroll); CDEF("scroll", f_scroll);
CDEF("draw-screen", drawScreen); CDEF("draw-screen", drawScreen);
CDEF("split-screen", f_splitscreen);
CDEF("ticks", f_ticks); CDEF("ticks", f_ticks);
f_loadfile("game.jor"); f_loadfile("game.jor");