On Mon, 2004-03-29 at 23:33, chromatic wrote:

> With the improved object system in place, I've been porting the existing
> SDL Parrot bindings.

Here's a quick status update.  With helpful suggestions from Jens and
Allison, I've just finished porting the existing files in examples/sdl
to the new libraries.  They're a lot nicer.

I've still some documentation to write (as well as a long list of rough
edges to smooth), but I'll fix that up shortly and check in some new
code.  To whet your appetites, here's the new version of
examples/sdl/move_parrot_logo.imc.

Suggestions always welcome.

-- c
=head1 TITLE

move_parrot_logo.imc - move a Parrot logo with the SDL Parrot bindings

=head1 SYNOPSIS

To run this file, be in the Parrot directory and run the following command:

        $ parrot examples/sdl/move_parrot_logo.imc
        $

=cut

.sub _main @MAIN
        load_bytecode "library/SDL/App.imc"
        load_bytecode "library/SDL/Color.imc"
        load_bytecode "library/SDL/Rect.imc"
        load_bytecode "library/SDL/Image.imc"
        load_bytecode "library/SDL/Sprite.imc"
        load_bytecode "library/SDL/EventHandler.imc"
        load_bytecode "library/SDL/Event.imc"

        .local pmc app_args
        new app_args, .PerlHash
        set app_args[ 'width'  ], 640
        set app_args[ 'height' ], 480
        set app_args[ 'bpp'    ],   0
        set app_args[ 'flags'  ],   0

        .local pmc app
        .local int app_type

        find_type app_type, 'SDL::App'
        app = new app_type

        .local pmc main_screen
        main_screen = app.'BUILD'( app_args )

        .local pmc black
        .local int color_type

        find_type color_type, 'SDL::Color'
        black = new color_type

        .local pmc color_args
        color_args = new PerlHash

        color_args[ 'r' ] = 0
        color_args[ 'g' ] = 0
        color_args[ 'b' ] = 0

        black.'_new'( color_args )

        .local pmc image
        .local int image_type

        find_type image_type, 'SDL::Image'
        image = new image_type

        image.'_new'( 'examples/sdl/parrot_small.png' )

        .local pmc sprite
        .local int sprite_type

        find_type sprite_type, 'SDL::Sprite'
        sprite = new sprite_type

        .local pmc sprite_args
        sprite_args = new PerlHash
        sprite_args[ 'surface'  ] = image
        sprite_args[ 'source_x' ] =     0
        sprite_args[ 'source_y' ] =     0
        sprite_args[ 'dest_x'   ] =   270
        sprite_args[ 'dest_y'   ] =   212
        sprite_args[ 'width'    ] =   100
        sprite_args[ 'height'   ] =    56
        sprite_args[ 'bgcolor'  ] = black

        sprite.'_new'( sprite_args )

        .local pmc parent_class
        .local pmc class_type
        getclass parent_class, 'SDL::EventHandler'
        subclass class_type, parent_class, 'MoveLogo::EventHandler'

        .local pmc event_handler
        .local int handler_type

        find_type handler_type, 'MoveLogo::EventHandler'
        event_handler = new handler_type

        .local pmc event
        .local int event_type

        find_type event_type, 'SDL::Event'
        event = new event_type

        event.'_new'()
        .local pmc handler_args
        handler_args = new .PerlHash
        handler_args[ 'screen' ] = main_screen
        handler_args[ 'sprite' ] = sprite

        event_handler.draw_screen( main_screen, sprite )
        event.wait_event( event_handler, handler_args )

.end

.namespace [ 'MoveLogo::EventHandler' ]

.sub draw_screen method
        .param pmc screen
        .param pmc sprite

        .local pmc prev_rect
        .local pmc rect
        (prev_rect, rect) = sprite.draw_undraw( screen )
        screen.'update_rects'( prev_rect, rect )

.end

.sub key_down_down method
        .param pmc event_args

        .local pmc screen
        .local pmc sprite

        screen = event_args[ 'screen' ]
        sprite = event_args[ 'sprite' ]

        .local int y
        y = sprite.'y'()
        if y == 480 goto _draw
        inc y
        sprite.'y'( y )

_draw:
        self.'draw_screen'( screen, sprite )

.end

.sub key_down_up method
        .param pmc event_args

        .local pmc screen
        .local pmc sprite

        screen = event_args[ 'screen' ]
        sprite = event_args[ 'sprite' ]

        .local int y
        y = sprite.'y'()
        if y == 0 goto _draw
        dec y
        sprite.'y'( y )

_draw:
        self.'draw_screen'( screen, sprite )

.end

.sub key_down_left method
        .param pmc event_args

        .local pmc screen
        .local pmc sprite

        screen = event_args[ 'screen' ]
        sprite = event_args[ 'sprite' ]

        .local int x
        x = sprite.'x'()
        if x == 0 goto _draw
        dec x
        sprite.'x'( x )

_draw:
        self.'draw_screen'( screen, sprite )

.end

.sub key_down_right method
        .param pmc event_args

        .local pmc screen
        .local pmc sprite

        screen = event_args[ 'screen' ]
        sprite = event_args[ 'sprite' ]

        .local int x
        x = sprite.'x'()
        if x == 640 goto _draw
        inc x
        sprite.'x'( x )

_draw:
        self.'draw_screen'( screen, sprite )

.end

=head1 AUTHOR

chromatic, E<lt>chromatic at wgz dot orgE<gt>.

=head1 COPYRIGHT

Copyright (c) 2004, The Perl Foundation.

=cut

Reply via email to