[PDD] Add docs for the Parrot_PMC_push_* and Parrot_PMC_pop_* functions
[parrot.git] / examples / sdl / bounce_parrot_logo.pir
blob67c26751c913264c1d64daf6442ce97c543c6df5
1 # $Id$
3 =head1 TITLE
5 bounce_parrot_logo.pir - bounce a Parrot logo with the SDL Parrot bindings
7 =head1 SYNOPSIS
9 To run this file, run the following command from the Parrot directory:
11     $ parrot examples/sdl/bounce_parrot_logo.pir
12     $
14 You'll see the happy Parrot logo in the middle of a new SDL window.  Use the
15 cursor keys to apply velocity in the appropriate directions.  Watch it bounce!
16 Use the Escape key or close the window when you've had enough.
18 =cut
20 .sub _main :main
21     load_bytecode "SDL/App.pir"
22     load_bytecode "SDL/Color.pir"
23     load_bytecode "SDL/Rect.pir"
24     load_bytecode "SDL/Image.pir"
25     load_bytecode "SDL/Sprite.pir"
26     load_bytecode "SDL/EventHandler.pir"
27     load_bytecode "SDL/Event.pir"
29     .local pmc app
30     app = new ['SDL'; 'App']
31     app.'init'( 'width' => 640, 'height' => 480, 'bpp' => 0, 'flags' => 0 )
33     .local pmc main_screen
34     main_screen = app.'surface'()
36     .local pmc black
37     black = new ['SDL'; 'Color']
38     black.'init'( 'r' => 0, 'g' => 0, 'b' => 0 )
40     .local pmc image
41     image = new ['SDL'; 'Image']
42     image.'init'( 'examples/sdl/parrot_small.png' )
44     .local pmc sprite
45     sprite = new ['SDL'; 'Sprite']
46     sprite.'init'( 'surface' => image, 'source_x' => 0, 'source_y' => 0, 'dest_x' => 270, 'dest_y' => 212, 'bgcolor' => black )
48     _main_loop( main_screen, sprite )
49     end
50 .end
52 .sub _main_loop
53     .param pmc main_screen
54     .param pmc sprite
56     .local pmc parent_class
57     .local pmc class_type
58     get_class parent_class, ['SDL'; 'EventHandler']
59     subclass class_type, parent_class, 'MoveLogo::EventHandler'
61     .local pmc event_handler
62     event_handler = new 'MoveLogo::EventHandler'
64     .local pmc event
65     event = new ['SDL'; 'Event']
66     event.'init'()
68     .local pmc handler_args
69     handler_args = new 'Hash'
70     handler_args[ 'screen' ] = main_screen
71     handler_args[ 'sprite' ] = sprite
73     .local num last_time
74     last_time = time
76     .local num counter
77     counter = 0
79     .local num current_time
80     current_time = 0
82     .local int frame_count
83     frame_count = 1
85     .local int updated
86     event_handler.'draw_screen'( main_screen, sprite )
88 loop:
89     last_time = current_time
90     updated   = event_handler.'update_position'( sprite, frame_count )
92     if updated == 0 goto increase_count
94     event_handler.'draw_screen'( main_screen, sprite )
96 increase_count:
97     inc frame_count
98     if  frame_count < 6 goto get_event
99     frame_count = 0
101 get_event:
102     event.'handle_event'( event_handler, handler_args )
104     current_time = time
105     counter      = current_time - last_time
107     if counter < 0.016 goto get_event
108     goto loop
110 .end
112 .namespace [ 'MoveLogo::EventHandler' ]
114 .sub update_position :method
115     .param pmc sprite
116     .param int frame_count
118     .local int updated
119     updated = 0
121     .local int x_velocity
122     .local int y_velocity
124     x_velocity = sprite.'x_velocity'()
125     y_velocity = sprite.'y_velocity'()
127     .local int abs_velocity
128     .local int delta
130 check_x_update:
131     if x_velocity == 0 goto check_y_update
133     abs abs_velocity, x_velocity
134     set delta, frame_count
135     sub delta, abs_velocity
137     if delta        > 0 goto check_y_update
139     updated = 1
141     if x_velocity   < 0 goto neg_x_dir
143     self.'move_sprite_x'( sprite,  1 )
144     goto check_y_update
146 neg_x_dir:
147     self.'move_sprite_x'( sprite, -1 )
149 check_y_update:
150     if y_velocity == 0 goto return
152     abs abs_velocity, y_velocity
153     set delta, frame_count
154     sub delta, abs_velocity
156     if delta      > 0 goto return
158     updated = 1
160     if y_velocity < 0 goto neg_y_dir
162     self.'move_sprite_y'( sprite,  1 )
163     goto return
165 neg_y_dir:
166     self.'move_sprite_y'( sprite, -1 )
168 return:
169     .return( updated )
170 .end
172 .sub draw_screen :method
173     .param pmc screen
174     .param pmc sprite
176     .local pmc prev_rect
177     .local pmc rect
178     .local pmc rect_array
179     rect_array = new 'ResizablePMCArray'
180     set rect_array, 2
182     (prev_rect, rect) = sprite.'draw_undraw'( screen )
183     set rect_array[ 0 ], prev_rect
184     set rect_array[ 1 ], rect
186     screen.'update_rects'( rect_array )
187 #    screen.'update_rect'( rect )
189 .end
191 .sub move_sprite_x :method
192     .param pmc sprite
193     .param int direction
195     .local int x
196     x = sprite.'x'()
198     add x, direction
200     if x >= 0 goto check_x_max
201     x = 0
202     goto x_bounce
204 check_x_max:
205     if x < 540 goto x_update
206     x = 540
208 x_bounce:
209     .local int x_velocity
210     x_velocity = sprite.'x_velocity'()
211     x_velocity = -x_velocity
212     sprite.'x_velocity'( x_velocity )
214 x_update:
215     sprite.'x'( x )
217 .end
219 .sub move_sprite_y :method
220     .param pmc sprite
221     .param int direction
223     .local int y
224     y = sprite.'y'()
226     add y, direction
228     if y >= 0 goto check_y_max
229     y = 0
230     goto y_bounce
232 check_y_max:
233     if y < 424 goto y_update
234     y = 424
236 y_bounce:
237     .local int y_velocity
238     y_velocity = sprite.'y_velocity'()
239     y_velocity = -y_velocity
240     sprite.'y_velocity'( y_velocity )
242 y_update:
243     sprite.'y'( y )
245 .end
247 .sub key_down_down :method
248     .param pmc event_args
250     .local pmc screen
251     .local pmc sprite
253     screen = event_args[ 'screen' ]
254     sprite = event_args[ 'sprite' ]
256     .local int y_vel
257     y_vel = sprite.'y_velocity'()
259     if  y_vel == 5 goto return
260     inc y_vel
262     sprite.'y_velocity'( y_vel )
264 return:
266 .end
268 .sub key_down_up :method
269     .param pmc event_args
271     .local pmc screen
272     .local pmc sprite
274     screen = event_args[ 'screen' ]
275     sprite = event_args[ 'sprite' ]
277     .local int y_vel
278     y_vel = sprite.'y_velocity'()
280     if  y_vel == -5 goto return
281     dec y_vel
283     sprite.'y_velocity'( y_vel )
285 return:
287 .end
289 .sub key_down_left :method
290     .param pmc event_args
292     .local pmc screen
293     .local pmc sprite
295     screen = event_args[ 'screen' ]
296     sprite = event_args[ 'sprite' ]
298     .local int x_vel
299     x_vel = sprite.'x_velocity'()
301     if  x_vel == -5 goto return
302     dec x_vel
304     sprite.'x_velocity'( x_vel )
306 return:
308 .end
310 .sub key_down_right :method
311     .param pmc event_args
313     .local pmc screen
314     .local pmc sprite
316     screen = event_args[ 'screen' ]
317     sprite = event_args[ 'sprite' ]
319     .local int x_vel
320     x_vel = sprite.'x_velocity'()
322     if  x_vel == 5 goto return
323     inc x_vel
325     sprite.'x_velocity'( x_vel )
327 return:
329 .end
331 .sub key_down_escape :method
332     .param pmc event_args
334     # XXX: a silly way to quit
335     end
336 .end
338 =head1 AUTHOR
340 chromatic, E<lt>chromatic at wgz dot orgE<gt>.
342 =head1 COPYRIGHT
344 Copyright (C) 2004-2008, Parrot Foundation.
346 =cut
348 # Local Variables:
349 #   mode: pir
350 #   fill-column: 100
351 # End:
352 # vim: expandtab shiftwidth=4 ft=pir: