**tclsdl: SDL tcl binding** * Author: inhak.min@gmail.com * Homepage: http://tcltk.co.kr * Demo: http://archive.tcltk.co.kr/index.php?dir=tclsdl/demo * Download: http://archive.tcltk.co.kr/index.php?dir=tclsdl/win32-ix86 * Document: http://www.libsdl.org/cgi/docwiki.cgi [http://www.libsdl.org/images/SDL_logo.png] **Supported** ***SDL*** 1. audio 1. cdrom 1. cpuinfo 1. error 1. events 1. keyboard 1. keysym 1. mouse 1. rwops 1. timer 1. version 1. video ***SDL_mixer*** **To Do** ***SDL*** 1. opengl 1. loadso 1. mutex 1. syswm 1. stdinc 1. joystick 1. thread ***SDL_image*** ***SDL_net*** ***SDL_rtf*** ***SDL_ttf*** **Example** [http://archive.tcltk.co.kr/tclsdl/demo/animation.png] ====== package require tclsdl 0.1 set SCREEN_WIDTH 640 set SCREEN_HEIGHT 480 set SPRITE_SIZE 32 set ::rcSprite [new_Rect 0 0 0 0] set ::rcSrc [new_Rect 0 0 0 0] proc HandleEvent {event} { set event_type [get_type_Event $event] if { $event_type == "$::SDL_QUIT" } { exit } if { $event_type == "$::SDL_KEYDOWN" } { set key_event [get_key_Event $event] set keysym_event [get_keysym_Event $key_event] set key_name [SDL_GetKeyName \ [get_int [get_var_keysym $keysym_event -sym]]] if { $key_name == "escape" } { exit } if { $key_name == "left" } { set x [get_int [get_var_Rect $::rcSrc -x]] if { $x == 192 } { set_var_Rect $::rcSrc -x 224 } else { set_var_Rect $::rcSrc -x 192 } set x [get_int [get_var_Rect $::rcSprite -x]] set_var_Rect $::rcSprite -x [expr $x-5] } if { $key_name == "right" } { set x [get_int [get_var_Rect $::rcSrc -x]] if { $x == 64 } { set_var_Rect $::rcSrc -x 96 } else { set_var_Rect $::rcSrc -x 64 } set x [get_int [get_var_Rect $::rcSprite -x]] set_var_Rect $::rcSprite -x [expr $x+5] } if { $key_name == "up" } { set x [get_int [get_var_Rect $::rcSrc -x]] if { $x == 0 } { set_var_Rect $::rcSrc -x 32 } else { set_var_Rect $::rcSrc -x 0 } set y [get_int [get_var_Rect $::rcSprite -y]] set_var_Rect $::rcSprite -y [expr $y-5] } if { $key_name == "down" } { set x [get_int [get_var_Rect $::rcSrc -x]] if { $x == 128 } { set_var_Rect $::rcSrc -x 160 } else { set_var_Rect $::rcSrc -x 128 } set y [get_int [get_var_Rect $::rcSprite -y]] set_var_Rect $::rcSprite -y [expr $y+5] } } } proc SDL_LoadBMP {filename} { set loadedimage [SDL_LoadBMP_RW [SDL_RWFromFile $filename "r"] 1] set optimizedImage [SDL_DisplayFormat $loadedimage] SDL_FreeSurface $loadedimage return $optimizedImage } SDL_Init [expr $SDL_INIT_VIDEO|$SDL_INIT_AUDIO] SDL_WM_SetCaption "SDL Animation" "SDL Animation" set screen [SDL_SetVideoMode $SCREEN_WIDTH $SCREEN_HEIGHT 0 0] Mix_OpenAudio 44100 $MIX_DEFAULT_FORMAT 2 4096 Mix_AllocateChannels 16 set music [Mix_LoadMUS "2nd_pm.s3m"] Mix_PlayMusic $music 0 if { [Mix_GetMusicType $music] == $MUS_MOD } { puts "Playing MOD format..." } SDL_EnableKeyRepeat 30 30 # load sprite set temp [SDL_LoadBMP "sprite.bmp"] set sprite [SDL_DisplayFormat $temp] SDL_FreeSurface $temp set format [get_PixelFormat [get_var_Surface $screen -format]] set colorkey [SDL_MapRGB $format 255 0 255] SDL_SetColorKey $sprite [expr $SDL_SRCCOLORKEY|$SDL_RLEACCEL] $colorkey # load grass set temp [SDL_LoadBMP "grass.bmp"] set grass [SDL_DisplayFormat $temp] SDL_FreeSurface $temp set_var_Rect $::rcSprite -x 150 set_var_Rect $::rcSprite -y 150 set_var_Rect $::rcSrc -x 128 set_var_Rect $::rcSrc -y 0 set_var_Rect $::rcSrc -w $SPRITE_SIZE set_var_Rect $::rcSrc -h $SPRITE_SIZE set gameover 0 set event [new_Event] while { 1 } { if { [SDL_PollEvent $event] } { HandleEvent $event } # collide with edges of screen set x [get_int [get_var_Rect $::rcSprite -x]] if { $x <= 0 } { set_var_Rect $::rcSprite -x 0 } if { $x >= [expr $SCREEN_WIDTH - $SPRITE_SIZE] } { set_var_Rect $::rcSprite -x [expr $SCREEN_WIDTH - $SPRITE_SIZE] } set y [get_int [get_var_Rect $::rcSprite -y]] if { $y <= 0 } { set_var_Rect $::rcSprite -y 0 } if { $y >= [expr $SCREEN_HEIGHT - $SPRITE_SIZE] } { set_var_Rect $::rcSprite -y [expr $SCREEN_HEIGHT - $SPRITE_SIZE] } set rcGrass [new_Rect 0 0 0 0] # draw the grass for {set x 0} {$x < [expr $SCREEN_WIDTH / $SPRITE_SIZE]} {incr x} { for {set y 0} {$y < [expr $SCREEN_HEIGHT / $SPRITE_SIZE]} {incr y} { set_var_Rect $rcGrass -x [expr $x * $SPRITE_SIZE] set_var_Rect $rcGrass -y [expr $y * $SPRITE_SIZE] SDL_UpperBlit $grass NULL $screen $rcGrass } } # draw the sprite SDL_UpperBlit $sprite $::rcSrc $screen $::rcSprite # update the screen SDL_UpdateRect $screen 0 0 0 0 } Mix_HaltMusic Mix_FreeMusic $music SDL_FreeSurface $sprite SDL_FreeSurface $grass SDL_Quit ====== ---- ---- !!!!!! %| [SDL] | [Category Multimedia] |% !!!!!!