1 ! (c)2009 Joe Groff bsd license
2 USING: accessors combinators fry game.input game.loop generic kernel math
3 parser sequences ui ui.gadgets ui.gadgets.worlds ui.gestures threads
4 words audio.engine destructors ;
7 TUPLE: game-world < world
10 { tick-interval-nanos integer }
11 { use-game-input? boolean }
12 { use-audio-engine? boolean }
13 { audio-engine-device initial: f }
14 { audio-engine-voice-count initial: 16 }
15 { tick-slice float initial: 0.0 } ;
17 GENERIC: begin-game-world ( world -- )
18 M: object begin-game-world drop ;
20 GENERIC: end-game-world ( world -- )
21 M: object end-game-world drop ;
23 GENERIC: tick-game-world ( world -- )
24 M: object tick-game-world drop ;
28 [ audio-engine>> [ update-audio ] when* ] bi ;
31 swap >>tick-slice relayout-1 yield ;
35 : open-game-audio-engine ( game-world -- audio-engine )
37 [ audio-engine-device>> ]
38 [ audio-engine-voice-count>> ]
39 } cleave <audio-engine>
40 [ start-audio* ] keep ; inline
44 M: game-world begin-world
45 dup use-game-input?>> [ open-game-input ] when
46 dup use-audio-engine?>> [ dup open-game-audio-engine >>audio-engine ] when
47 dup [ tick-interval-nanos>> ] [ ] bi <game-loop>
48 [ >>game-loop begin-game-world ] keep start-loop ;
50 M: game-world end-world
51 [ [ stop-loop ] when* f ] change-game-loop
53 [ audio-engine>> [ dispose ] when* ]
54 [ use-game-input?>> [ close-game-input ] when ] tri ;
56 TUPLE: game-attributes < world-attributes
57 { tick-interval-nanos fixnum }
58 { use-game-input? boolean initial: f }
59 { use-audio-engine? boolean initial: f }
60 { audio-engine-device initial: f }
61 { audio-engine-voice-count initial: 16 } ;
63 M: game-world apply-world-attributes
65 [ tick-interval-nanos>> >>tick-interval-nanos ]
66 [ use-game-input?>> >>use-game-input? ]
67 [ use-audio-engine?>> >>use-audio-engine? ]
68 [ audio-engine-device>> >>audio-engine-device ]
69 [ audio-engine-voice-count>> >>audio-engine-voice-count ]
75 game-attributes parse-main-window-attributes