game.loop: separate delegate into tick-delegate and draw-delegate
parent
d673108518
commit
271afe3fde
|
@ -11,7 +11,20 @@ HELP: <game-loop>
|
||||||
{ "tick-interval-micros" integer } { "delegate" "a " { $link "game.loop-delegates" } }
|
{ "tick-interval-micros" integer } { "delegate" "a " { $link "game.loop-delegates" } }
|
||||||
{ "loop" game-loop }
|
{ "loop" game-loop }
|
||||||
}
|
}
|
||||||
{ $description "Constructs a new stopped " { $link game-loop } " object. When started, the game loop will call the " { $link tick* } " method on the " { $snippet "delegate" } " every " { $snippet "tick-interval-micros" } " microseconds, and " { $link draw* } " on the delegate as frequently as possible. The " { $link start-loop } " and " { $link stop-loop } " words start and stop the game loop." } ;
|
{ $description "Constructs a new stopped " { $link game-loop } " object. When started, the game loop will call the " { $link tick* } " method on the " { $snippet "delegate" } " every " { $snippet "tick-interval-micros" } " microseconds, and " { $link draw* } " on the same delegate object as frequently as possible. The " { $link start-loop } " and " { $link stop-loop } " words start and stop the game loop."
|
||||||
|
$nl
|
||||||
|
"To initialize the game loop with separate tick and draw delegates, use " { $link <game-loop*> } "." } ;
|
||||||
|
|
||||||
|
HELP: <game-loop*>
|
||||||
|
{ $values
|
||||||
|
{ "tick-interval-micros" integer } { "tick-delegate" "a " { $link "game.loop-delegates" } } { "draw-delegate" "a " { $link "game.loop-delegates" } }
|
||||||
|
{ "loop" game-loop }
|
||||||
|
}
|
||||||
|
{ $description "Constructs a new stopped " { $link game-loop } " object. When started, the game loop will call the " { $link tick* } " method on the " { $snippet "tick-delegate" } " every " { $snippet "tick-interval-micros" } " microseconds, and " { $link draw* } " on the " { $snippet "draw-delegate" } " as frequently as possible. The " { $link start-loop } " and " { $link stop-loop } " words start and stop the game loop."
|
||||||
|
$nl
|
||||||
|
"The " { $link <game-loop> } " word provides a shorthand for initializing a game loop that uses the same object for the " { $snippet "tick-delegate" } " and " { $snippet "draw-delegate" } "." } ;
|
||||||
|
|
||||||
|
{ <game-loop> <game-loop*> } related-words
|
||||||
|
|
||||||
HELP: benchmark-frames-per-second
|
HELP: benchmark-frames-per-second
|
||||||
{ $values
|
{ $values
|
||||||
|
@ -25,7 +38,7 @@ HELP: benchmark-ticks-per-second
|
||||||
{ "loop" game-loop }
|
{ "loop" game-loop }
|
||||||
{ "n" float }
|
{ "n" float }
|
||||||
}
|
}
|
||||||
{ $description "Returns the average number of times per second the game loop has called " { $link tick* } " on its delegate since the game loop was started with " { $link start-loop } " or since the benchmark counters have been reset with " { $link reset-loop-benchmark } "." } ;
|
{ $description "Returns the average number of times per second the game loop has called " { $link tick* } " on its tick delegate since the game loop was started with " { $link start-loop } " or since the benchmark counters have been reset with " { $link reset-loop-benchmark } "." } ;
|
||||||
|
|
||||||
{ reset-loop-benchmark benchmark-frames-per-second benchmark-ticks-per-second } related-words
|
{ reset-loop-benchmark benchmark-frames-per-second benchmark-ticks-per-second } related-words
|
||||||
|
|
||||||
|
@ -33,10 +46,12 @@ HELP: draw*
|
||||||
{ $values
|
{ $values
|
||||||
{ "tick-slice" float } { "delegate" "a " { $link "game.loop-delegates" } }
|
{ "tick-slice" float } { "delegate" "a " { $link "game.loop-delegates" } }
|
||||||
}
|
}
|
||||||
{ $description "This generic word is called by a " { $link game-loop } " on its " { $snippet "delegate" } " object in a tight loop while the game loop is running. The " { $snippet "tick-slice" } " value represents what fraction of the game loop's " { $snippet "tick-interval-micros" } " time period has passed since " { $link tick* } " was most recently called on the delegate." } ;
|
{ $description "This generic word is called by a " { $link game-loop } " on its " { $snippet "draw-delegate" } " object in a tight loop while the game loop is running. The " { $snippet "tick-slice" } " value represents what fraction of the game loop's " { $snippet "tick-interval-micros" } " time period has passed since " { $link tick* } " was most recently called on the " { $snippet "tick-delegate" } "." } ;
|
||||||
|
|
||||||
HELP: game-loop
|
HELP: game-loop
|
||||||
{ $class-description "Objects of the " { $snippet "game-loop" } " class manage game loops. See " { $link "game.loop" } " for an overview of the game loop library. To construct a game loop, use " { $link <game-loop> } ". To start and stop a game loop, use the " { $link start-loop } " and " { $link stop-loop } " words." } ;
|
{ $class-description "Objects of the " { $snippet "game-loop" } " class manage game loops. See " { $link "game.loop" } " for an overview of the game loop library. To construct a game loop, use " { $link <game-loop> } ". To start and stop a game loop, use the " { $link start-loop } " and " { $link stop-loop } " words."
|
||||||
|
$nl
|
||||||
|
"The " { $snippet "tick-delegate" } " and " { $snippet "draw-delegate" } " slots of a game loop object determine where the loop sends its " { $link tick* } " and " { $link draw* } " events. These slots can be changed while the game loop is running." } ;
|
||||||
|
|
||||||
HELP: game-loop-error
|
HELP: game-loop-error
|
||||||
{ $values
|
{ $values
|
||||||
|
@ -68,23 +83,26 @@ HELP: tick*
|
||||||
{ $values
|
{ $values
|
||||||
{ "delegate" "a " { $link "game.loop-delegates" } }
|
{ "delegate" "a " { $link "game.loop-delegates" } }
|
||||||
}
|
}
|
||||||
{ $description "This generic word is called by a " { $link game-loop } " on its " { $snippet "delegate" } " object at regular intervals while the game loop is running. The game loop's " { $snippet "tick-interval-micros" } " attribute determines the number of microseconds between invocations of " { $snippet "tick*" } "." } ;
|
{ $description "This generic word is called by a " { $link game-loop } " on its " { $snippet "tick-delegate" } " object at regular intervals while the game loop is running. The game loop's " { $snippet "tick-interval-micros" } " attribute determines the number of microseconds between invocations of " { $snippet "tick*" } "." } ;
|
||||||
|
|
||||||
{ draw* tick* } related-words
|
{ draw* tick* } related-words
|
||||||
|
|
||||||
ARTICLE: "game.loop-delegates" "Game loop delegate"
|
ARTICLE: "game.loop-delegates" "Game loop delegate"
|
||||||
"A " { $link game-loop } " object requires a " { $snippet "delegate" } " that implements the logic that controls the game. A game loop delegate can be any object that provides two methods for the following generic words:"
|
"A " { $link game-loop } " object requires a " { $snippet "tick-delegate" } " and " { $snippet "draw-delegate" } " that together implement the logic that controls the game. Both delegates can also be the same object. A game loop delegate can be any object that provides two methods for the following generic words:"
|
||||||
{ $subsections
|
{ $subsections
|
||||||
tick*
|
tick*
|
||||||
draw*
|
draw*
|
||||||
}
|
}
|
||||||
{ $snippet "tick*" } " will be called at a regular interval determined by the game loop's " { $snippet "tick-interval-micros" } " attribute. " { $snippet "draw*" } " will be invoked in a tight loop, updating as frequently as possible." ;
|
{ $snippet "tick*" } " will be called at a regular interval determined by the game loop's " { $snippet "tick-interval-micros" } " attribute on the tick delegate. " { $snippet "draw*" } " will be invoked on the draw delegate in a tight loop, updating as frequently as possible."
|
||||||
|
$nl
|
||||||
|
"It is possible to change the " { $snippet "tick-delegate" } " and " { $snippet "draw-delegate" } " slots of a game loop while it is running, for example, to use different delegates to control a game while it's in the menu, paused, or running the main game." ;
|
||||||
|
|
||||||
ARTICLE: "game.loop" "Game loops"
|
ARTICLE: "game.loop" "Game loops"
|
||||||
"The " { $vocab-link "game.loop" } " vocabulary contains the implementation of a game loop. The game loop supports decoupled rendering and game logic timers; given a delegate object with methods on the " { $link tick* } " and " { $link draw* } " methods, the game loop will invoke the " { $snippet "tick*" } " method at regular intervals while invoking the " { $snippet "draw*" } " method as frequently as possible. Game loop objects must first be constructed:"
|
"The " { $vocab-link "game.loop" } " vocabulary contains the implementation of a game loop. The game loop supports decoupled rendering and game logic timers; given a \"tick delegate\" object with a method on the " { $link tick* } " generic and a \"draw delegate\" with a " { $link draw* } " method, the game loop will invoke the " { $snippet "tick*" } " method on the former at regular intervals while invoking the " { $snippet "draw*" } " method on the latter as frequently as possible. Game loop objects must first be constructed:"
|
||||||
{ $subsections
|
{ $subsections
|
||||||
"game.loop-delegates"
|
"game.loop-delegates"
|
||||||
<game-loop>
|
<game-loop>
|
||||||
|
<game-loop*>
|
||||||
}
|
}
|
||||||
"Once constructed, the game loop can be started and stopped:"
|
"Once constructed, the game loop can be started and stopped:"
|
||||||
{ $subsections
|
{ $subsections
|
||||||
|
|
|
@ -6,7 +6,8 @@ IN: game.loop
|
||||||
|
|
||||||
TUPLE: game-loop
|
TUPLE: game-loop
|
||||||
{ tick-interval-micros integer read-only }
|
{ tick-interval-micros integer read-only }
|
||||||
delegate
|
tick-delegate
|
||||||
|
draw-delegate
|
||||||
{ last-tick integer }
|
{ last-tick integer }
|
||||||
thread
|
thread
|
||||||
{ running? boolean }
|
{ running? boolean }
|
||||||
|
@ -46,10 +47,10 @@ TUPLE: game-loop-error game-loop error ;
|
||||||
|
|
||||||
: redraw ( loop -- )
|
: redraw ( loop -- )
|
||||||
[ 1 + ] change-frame-number
|
[ 1 + ] change-frame-number
|
||||||
[ tick-slice ] [ delegate>> ] bi draw* ;
|
[ tick-slice ] [ draw-delegate>> ] bi draw* ;
|
||||||
|
|
||||||
: tick ( loop -- )
|
: tick ( loop -- )
|
||||||
delegate>> tick* ;
|
tick-delegate>> tick* ;
|
||||||
|
|
||||||
: increment-tick ( loop -- )
|
: increment-tick ( loop -- )
|
||||||
[ 1 + ] change-tick-number
|
[ 1 + ] change-tick-number
|
||||||
|
@ -101,10 +102,13 @@ PRIVATE>
|
||||||
f >>thread
|
f >>thread
|
||||||
drop ;
|
drop ;
|
||||||
|
|
||||||
: <game-loop> ( tick-interval-micros delegate -- loop )
|
: <game-loop*> ( tick-interval-micros tick-delegate draw-delegate -- loop )
|
||||||
system-micros f f 0 0 system-micros 0 0
|
system-micros f f 0 0 system-micros 0 0
|
||||||
game-loop boa ;
|
game-loop boa ;
|
||||||
|
|
||||||
|
: <game-loop> ( tick-interval-micros delegate -- loop )
|
||||||
|
dup <game-loop*> ; inline
|
||||||
|
|
||||||
M: game-loop dispose
|
M: game-loop dispose
|
||||||
stop-loop ;
|
stop-loop ;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue