From 98d143fde11d7e4360a95c93d46fa3bb32bce5c0 Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Sat, 16 Jan 2010 13:13:13 -0800 Subject: [PATCH] document game.worlds, tweak GAME: syntax --- extra/game/worlds/authors.txt | 1 + extra/game/worlds/summary.txt | 1 + extra/game/worlds/worlds-docs.factor | 35 ++++++++++++++++++++++++ extra/game/worlds/worlds.factor | 24 ++++++++++++---- extra/gpu/demos/bunny/bunny.factor | 2 +- extra/gpu/demos/raytrace/raytrace.factor | 2 +- extra/terrain/terrain.factor | 2 +- 7 files changed, 59 insertions(+), 8 deletions(-) create mode 100644 extra/game/worlds/authors.txt create mode 100644 extra/game/worlds/summary.txt create mode 100644 extra/game/worlds/worlds-docs.factor diff --git a/extra/game/worlds/authors.txt b/extra/game/worlds/authors.txt new file mode 100644 index 0000000000..f13c9c1e77 --- /dev/null +++ b/extra/game/worlds/authors.txt @@ -0,0 +1 @@ +Joe Groff diff --git a/extra/game/worlds/summary.txt b/extra/game/worlds/summary.txt new file mode 100644 index 0000000000..6a65cd7436 --- /dev/null +++ b/extra/game/worlds/summary.txt @@ -0,0 +1 @@ +World class that integrates game loop and game input diff --git a/extra/game/worlds/worlds-docs.factor b/extra/game/worlds/worlds-docs.factor new file mode 100644 index 0000000000..e021ed5718 --- /dev/null +++ b/extra/game/worlds/worlds-docs.factor @@ -0,0 +1,35 @@ +! (c)2009 Joe Groff bsd license +USING: game.loop help.markup help.syntax kernel math ui ui.gadgets.worlds words ; +IN: game.worlds + +HELP: GAME: +{ $syntax """GAME: word { attributes } + attribute-code ;""" } +{ $description "Similar to " { $link POSTPONE: MAIN-WINDOW: } ", defines a main entry point " { $snippet "word" } " for the current vocabulary that opens a UI window with the provided " { $snippet "attributes" } ". In addition to the standard " { $link world-attributes } ", additional " { $link game-attributes } " can be specified to specify game-specific attributes. Unlike " { $link POSTPONE: MAIN-WINDOW: } ", the " { $snippet "attributes" } " for " { $snippet "GAME:" } " must provide values for the " { $snippet "world-class" } " and " { $snippet "tick-interval-micros" } " slots." } ; + +HELP: game-attributes +{ $class-description "Extends the " { $link world-attributes } " tuple class with extra attributes for " { $link game-world } "s:" } +{ $list +{ { $snippet "tick-interval-micros" } " specifies the number of microseconds between consecutive calls to the world's " { $link tick* } " method by the game loop." } +} ; + +HELP: game-world +{ $class-description "" } ; + +HELP: tick-interval-micros +{ $values + { "world" game-world } + { "micros" integer } +} +{ $description "Subclasses of " { $link game-world } " can override this class to specify the number of microseconds between consecutive calls to the game world's " { $link tick* } " method by the game loop. Using the " { $link POSTPONE: GAME: } " syntax will define this method for you." } ; + +ARTICLE: "game.worlds" "Game worlds" +"The " { $vocab-link "game.worlds" } " vocabulary provides a " { $link world } " subclass that integrates with " { $vocab-link "game.loop" } " and " { $vocab-link "game.input" } " to quickly provide game infrastructure." +{ $subsections + game-world + game-attributes + POSTPONE: GAME: +} +; + +ABOUT: "game.worlds" diff --git a/extra/game/worlds/worlds.factor b/extra/game/worlds/worlds.factor index f614943f04..1fd7f53905 100644 --- a/extra/game/worlds/worlds.factor +++ b/extra/game/worlds/worlds.factor @@ -1,3 +1,4 @@ +! (c)2009 Joe Groff bsd license USING: accessors combinators fry game.input game.loop generic kernel math parser sequences ui ui.gadgets ui.gadgets.worlds ui.gestures threads words ; @@ -25,9 +26,19 @@ M: game-world end-world TUPLE: game-attributes < world-attributes { tick-interval-micros fixnum read-only } ; +> { f world } member? - [ "GAME: must be given a custom world-class" throw ] when ; + { + [ + world-class>> { f world } member? + [ "GAME: must be given a custom world-class" throw ] when + ] + [ + tick-interval-micros>> 0 <= + [ "GAME: must be given a nonzero tick-interval-micros" throw ] when + ] + } cleave ; : define-game-tick-interval-micros ( attributes -- ) [ world-class>> \ tick-interval-micros create-method ] @@ -40,11 +51,14 @@ TUPLE: game-attributes < world-attributes [ define-game-tick-interval-micros ] } cleave ; -: define-game ( word attributes -- ) - [ [ ] define-main-window ] - [ nip define-game-methods ] 2bi ; +: define-game ( word attributes quot -- ) + [ define-main-window ] + [ drop nip define-game-methods ] 3bi ; + +PRIVATE> SYNTAX: GAME: CREATE game-attributes parse-main-window-attributes + parse-definition define-game ; diff --git a/extra/gpu/demos/bunny/bunny.factor b/extra/gpu/demos/bunny/bunny.factor index 067e934453..e18d76ed8d 100644 --- a/extra/gpu/demos/bunny/bunny.factor +++ b/extra/gpu/demos/bunny/bunny.factor @@ -308,4 +308,4 @@ GAME: bunny-game { { grab-input? t } { pref-dim { 1024 768 } } { tick-interval-micros $[ 1,000,000 60 /i ] } - } + } ; diff --git a/extra/gpu/demos/raytrace/raytrace.factor b/extra/gpu/demos/raytrace/raytrace.factor index 8883609bce..b474ca1f09 100644 --- a/extra/gpu/demos/raytrace/raytrace.factor +++ b/extra/gpu/demos/raytrace/raytrace.factor @@ -104,4 +104,4 @@ GAME: raytrace-game { { grab-input? t } { pref-dim { 1024 768 } } { tick-interval-micros $[ 1,000,000 60 /i ] } - } + } ; diff --git a/extra/terrain/terrain.factor b/extra/terrain/terrain.factor index adbeb9c441..39bc7f3ec8 100644 --- a/extra/terrain/terrain.factor +++ b/extra/terrain/terrain.factor @@ -298,4 +298,4 @@ GAME: terrain-game { { grab-input? t } { pref-dim { 1024 768 } } { tick-interval-micros $[ 1,000,000 60 /i ] } - } + } ;