5 bounce_parrot_logo.pir - bounce a Parrot logo with the SDL Parrot bindings
9 To run this file, run the following command from the Parrot directory:
11 $ parrot examples/sdl/bounce_parrot_logo.pir
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.
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"
31 app.'init'( 'width' => 640, 'height' => 480, 'bpp' => 0, 'flags' => 0 )
33 .local pmc main_screen
34 main_screen = app.'surface'()
37 black = new 'SDL::Color'
38 black.'init'( 'r' => 0, 'g' => 0, 'b' => 0 )
41 image = new 'SDL::Image'
42 image.'init'( 'examples/sdl/parrot_small.png' )
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 )
53 .param pmc main_screen
56 .local pmc parent_class
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'
65 event = new 'SDL::Event'
68 .local pmc handler_args
69 handler_args = new 'Hash'
70 handler_args[ 'screen' ] = main_screen
71 handler_args[ 'sprite' ] = sprite
79 .local num current_time
82 .local int frame_count
86 event_handler.'draw_screen'( main_screen, sprite )
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 )
98 if frame_count < 6 goto get_event
102 event.'handle_event'( event_handler, handler_args )
105 counter = current_time - last_time
107 if counter < 0.016 goto get_event
112 .namespace [ 'MoveLogo::EventHandler' ]
114 .sub update_position :method
116 .param int frame_count
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
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
141 if x_velocity < 0 goto neg_x_dir
143 self.'move_sprite_x'( sprite, 1 )
147 self.'move_sprite_x'( sprite, -1 )
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
160 if y_velocity < 0 goto neg_y_dir
162 self.'move_sprite_y'( sprite, 1 )
166 self.'move_sprite_y'( sprite, -1 )
172 .sub draw_screen :method
178 .local pmc rect_array
179 rect_array = new 'Array'
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 )
191 .sub move_sprite_x :method
200 if x >= 0 goto check_x_max
205 if x < 540 goto x_update
209 .local int x_velocity
210 x_velocity = sprite.'x_velocity'()
211 x_velocity = -x_velocity
212 sprite.'x_velocity'( x_velocity )
219 .sub move_sprite_y :method
228 if y >= 0 goto check_y_max
233 if y < 424 goto y_update
237 .local int y_velocity
238 y_velocity = sprite.'y_velocity'()
239 y_velocity = -y_velocity
240 sprite.'y_velocity'( y_velocity )
247 .sub key_down_down :method
248 .param pmc event_args
253 screen = event_args[ 'screen' ]
254 sprite = event_args[ 'sprite' ]
257 y_vel = sprite.'y_velocity'()
259 if y_vel == 5 goto return
262 sprite.'y_velocity'( y_vel )
268 .sub key_down_up :method
269 .param pmc event_args
274 screen = event_args[ 'screen' ]
275 sprite = event_args[ 'sprite' ]
278 y_vel = sprite.'y_velocity'()
280 if y_vel == -5 goto return
283 sprite.'y_velocity'( y_vel )
289 .sub key_down_left :method
290 .param pmc event_args
295 screen = event_args[ 'screen' ]
296 sprite = event_args[ 'sprite' ]
299 x_vel = sprite.'x_velocity'()
301 if x_vel == -5 goto return
304 sprite.'x_velocity'( x_vel )
310 .sub key_down_right :method
311 .param pmc event_args
316 screen = event_args[ 'screen' ]
317 sprite = event_args[ 'sprite' ]
320 x_vel = sprite.'x_velocity'()
322 if x_vel == 5 goto return
325 sprite.'x_velocity'( x_vel )
331 .sub key_down_escape :method
332 .param pmc event_args
334 # XXX: a silly way to quit
340 chromatic, E<lt>chromatic at wgz dot orgE<gt>.
344 Copyright (C) 2004-2008, Parrot Foundation.
352 # vim: expandtab shiftwidth=4 ft=pir: