ClipSprite()

Advanced game related topics
wolfwood2x
User
User
Posts: 76
Joined: Sun Oct 02, 2005 5:08 am

ClipSprite()

Post by wolfwood2x »

Anyone know some good tutorials on this? All the ones I have found are in the code archive and are kind of obscure.

I understand the basics of this command enough to know that I can set which part is visible at a given time. But how do i scroll that to show an animation as i move. For example in the helicopter game tutorial refferenced in this forum a sprite strip is used with mutiple frames.
Is there a reccommended number of frames in a strip if you are animating it? like If i wanted to do something 35fps or 60 fps how many frames would i need? Does it even matter or is it all personal preference.

So in this case lets just say I have a sprite with only 2 frames for examples sake in a 40x80 strip.

So

Code: Select all

 ClipSprite(#example, 0, 40, 40, 80)
would only show the first fram of the sprite but doing an if condition on a movement of the sprite to clip to the next section doesnt seem to display frame 2 however just a single command for frame 2 with no reference at all to the prior code seems to call frame 2 properly.

Code: Select all

 ClipSprite(#example, 40, 40, 40, 80)
So how would you animate between the 2 frames in a loop for movement?
User avatar
Comtois
Addict
Addict
Posts: 1432
Joined: Tue Aug 19, 2003 11:36 am
Location: Doubs - France

Post by Comtois »

It's in french , but may be can help ?

http://www.games-creators.org/wiki/Pure ... remiersPas
Please correct my english
http://purebasic.developpez.com/
wolfwood2x
User
User
Posts: 76
Joined: Sun Oct 02, 2005 5:08 am

Post by wolfwood2x »

Thanks for trying at least but i do not speak a word of french let alone read it. :(

If i spoke french or german i do not think i would be having this problem as there are far more sites in those languages
User avatar
netmaestro
PureBasic Bullfrog
PureBasic Bullfrog
Posts: 8452
Joined: Wed Jul 06, 2005 5:42 am
Location: Fort Nelson, BC, Canada

Post by netmaestro »

There is an excellent animsprite library included in the PBOSL lib, simple to use and good documentation with examples is supplied with it.
BERESHEIT
wolfwood2x
User
User
Posts: 76
Joined: Sun Oct 02, 2005 5:08 am

Post by wolfwood2x »

Isnt it written in C?
"PBOSL_SRC/PBOSL/LIBS/C/PBOSL_AnimSprite"

Like what im looking for is how to do this myself not use a ready out of the box lib function that someone else has written. These files are not ".pb" can i still open them with the editor?

I just want someone to in simple terms for a beginner to understand explain how to move from frame one to frame 2. The french tutorial looked great if some can translate the important parts hehe.

I am going to try babel fish now

Im sure if i have not annoyed the users on this forum yet, I will soon. I am very inquisitive ^_^
wolfwood2x
User
User
Posts: 76
Joined: Sun Oct 02, 2005 5:08 am

Post by wolfwood2x »

Well babel fish sucks. Google was a little more help. Bust some of the finer pooints are still lost on me. I get that you use a structure

Code: Select all

Structure Sprite
  Direction.l
  Column.l
  line.l
  Progress?
  Max
  Cutx
  cuty
  X 
  Y
  Speed

but i fail to understand from the translation how it works it seems like a ton of factors just to move 3 frames over and over
dracflamloc
Addict
Addict
Posts: 1648
Joined: Mon Sep 20, 2004 3:52 pm
Contact:

Re: ClipSprite()

Post by dracflamloc »

wolfwood2x wrote:Anyone know some good tutorials on this? All the ones I have found are in the code archive and are kind of obscure.

I understand the basics of this command enough to know that I can set which part is visible at a given time. But how do i scroll that to show an animation as i move. For example in the helicopter game tutorial refferenced in this forum a sprite strip is used with mutiple frames.
Is there a reccommended number of frames in a strip if you are animating it? like If i wanted to do something 35fps or 60 fps how many frames would i need? Does it even matter or is it all personal preference.

So in this case lets just say I have a sprite with only 2 frames for examples sake in a 40x80 strip.

So

Code: Select all

 ClipSprite(#example, 0, 40, 40, 80)
would only show the first fram of the sprite but doing an if condition on a movement of the sprite to clip to the next section doesnt seem to display frame 2 however just a single command for frame 2 with no reference at all to the prior code seems to call frame 2 properly.

Code: Select all

 ClipSprite(#example, 40, 40, 40, 80)
So how would you animate between the 2 frames in a loop for movement?
From what I can tell you're function calls are wrong. Can you post the code you are using with the "if"

If each frame is 40x40, and you have a 40x80 strip (thats vertical):

Do this:

Code: Select all


Repeat

Delay(1000)

if frame=0
  frame=1
else
  frame=0
endif

ClipSprite(#Example,0,frame*40,40,40)
DisplaySprite(#Example,0,0)

Forever
User avatar
netmaestro
PureBasic Bullfrog
PureBasic Bullfrog
Posts: 8452
Joined: Wed Jul 06, 2005 5:42 am
Location: Fort Nelson, BC, Canada

Post by netmaestro »

OK, here is a small example for you. You can't run this code without the bmp file containing the sprite image. It is a strip of 8 images in sequence and you can download it from here:

http://www.networkmaestro.com/sonic.bmp

Make a folder, put this image in it, and load this code into PB:

Code: Select all


InitSprite()

Enumeration
  #sonic
  #window
EndEnumeration

OpenWindow(#window,0,0,400,400,#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget,"Sprite animation example by Network Maestro")
OpenWindowedScreen(WindowID(#window),0,0,400,400,0,0,0)
LoadSprite(#sonic,"sonic.bmp")

x=0
Repeat
  Event=WindowEvent()
  ClipSprite(#sonic,x,0,40,40)
  ClearScreen(255,0,255)
  DisplaySprite(#sonic,200,200)
  FlipBuffers()
  Delay(100)
  x+40:If x>280:x=0:EndIf
Until Event=#PB_Event_CloseWindow
Save the program as "testsprite" or whatever in the SAME folder with the image so that the program will find the image when it runs

Run the test program and watch Sonic stride purposefully to the nearest computer to register a copy of PureBasic.
BERESHEIT
wolfwood2x
User
User
Posts: 76
Joined: Sun Oct 02, 2005 5:08 am

Post by wolfwood2x »

That was a great example
Thanks so much
wolfwood2x
User
User
Posts: 76
Joined: Sun Oct 02, 2005 5:08 am

Post by wolfwood2x »

One question though. Using Similar code my pic animates properly but if i have it constanly animating movement around the map seems very sluggish and choppy compared to moving with no animation. Is there a way to speed this up or is there a problem with my code?

Code: Select all

;--Variable Declarations--
imagex.l=800
imagey.l=600
points.l=0

;--pointer section--
Structure POINT 
X.l 
Y.L 
EndStructure 

NewList Burger.Point() 

AddElement(burger()) 
Burger()\x=125
Burger()\y=115

AddElement(burger()) 
Burger()\x=160
Burger()\y=115

If InitSprite() = 0 Or InitKeyboard() = 0 Or InitSound() = 0
 MessageRequester("error", "Can't open", 0)
 End
EndIf

If OpenScreen(1024,768,16,"Gut Check")
   
   ;--Sound Loader--
   UseOGGSoundDecoder()
   LoadSound(2, "Chomp.wav") 
   LoadSound(1, "opening.wav")
   ;PlaySound(1, 0)                  ;commented out during alpha phase  
    UseJPEGImageDecoder()
       
    ;--Sprite Loader--
    LoadSprite(0,"level.jpg",0)
    LoadSprite(2, "walls.jpg",0)
    
    LoadSprite(1,"anim.jpg",0)
    StartDrawing(SpriteOutput(1)) 
    StopDrawing() 
    
    LoadSprite(1000, "smburger2.jpg", 0) 
    StartDrawing(SpriteOutput(1000))  
    StopDrawing() 
    
    LoadFont(1,"Arial",20,#PB_Font_Underline)
    
      ;--Game Engine--  
      Repeat
         FlipBuffers()
         ClearScreen(0,0,0)
         
         ExamineKeyboard()
         
          If KeyboardPushed(#PB_Key_A) Or KeyboardPushed(#PB_Key_Left)
            Imagex= imagex-3
            Gosub WallCheck
          EndIf
          
          If KeyboardPushed(#PB_Key_D) Or KeyboardPushed(#PB_Key_Right)
            Imagex= imagex+3
            Gosub WallCheck
          EndIf

          If KeyboardPushed(#PB_Key_W) Or KeyboardPushed(#PB_Key_Up)
            Imagey= imagey-3
            Gosub WallCheck
          EndIf
          
          If KeyboardPushed(#PB_Key_S) Or KeyboardPushed(#PB_Key_Down)
            Imagey= imagey+3
            Gosub WallCheck
          EndIf
        
        Gosub Update_back 
        Gosub animate    
        Gosub Burger_count
        Gosub Check_score
            
      
      Until KeyboardPushed(#PB_Key_Escape)
EndIf

End

;--Update Screen Functions--

Update_back:
   
   DisplaySprite(0,0,0)
Return

animate:
        ClipSprite(1,x,0,31,32) 
        DisplayTransparentSprite(1,imagex, imagey) 
        Delay(110) 
        x+31:If x>61:x=0:EndIf
Return

;--burger checking--

Burger_count:                
  
  ForEach  Burger() 
    DisplayTransparentSprite(1000,burger()\x,Burger()\y)      
    If SpriteCollision(1, imagex, imagey, 1000, burger()\x, burger()\y)  
     LoadSound(2, "chomp.wav")
     ;PlaySound(2, 0)
      points + 25 
      DeleteElement(Burger())    
      Continue    
    EndIf 
Next      
Return     



;--Wall Checking Procedure
WallCheck:
    ;If SpritePixelCollision(1, imagex,imagey, 2, 262,415)
    ;    imagex= imagex+2
    ;EndIf
    Return



;--Scoring Algorithm--
Check_score:

        StartDrawing(ScreenOutput()) 
          DrawingMode(1)
          DrawingFont(UseFont(1)) 
          FrontColor(255,255,255):Locate(700,100):DrawText("HIGH SCORE: " + Str(points)) 
          FrontColor(255,255,255):Locate(700,200):DrawText("1UP: " + Str(points)) 
        StopDrawing()
Return
just an fyi this game is made soley to poke fun a t a co-worker
User avatar
netmaestro
PureBasic Bullfrog
PureBasic Bullfrog
Posts: 8452
Joined: Wed Jul 06, 2005 5:42 am
Location: Fort Nelson, BC, Canada

Post by netmaestro »

I can see a couple problems off the bat, but post your images so I can test changes, that would be the best way to help you.
BERESHEIT
User avatar
Comtois
Addict
Addict
Posts: 1432
Joined: Tue Aug 19, 2003 11:36 am
Location: Doubs - France

Post by Comtois »

I replace delay(110) by ElapsedMilliseconds()

And post your images to test !

Code: Select all

;--Variable Declarations--
imagex.l=800
imagey.l=600
points.l=0

#TimeMax = 110 ; 110 ms
Tps=ElapsedMilliseconds()

;--pointer section--
Structure POINT
X.l
Y.L
EndStructure

NewList Burger.Point()

AddElement(burger())
Burger()\x=125
Burger()\y=115

AddElement(burger())
Burger()\x=160
Burger()\y=115

If InitSprite() = 0 Or InitKeyboard() = 0 Or InitSound() = 0
 MessageRequester("error", "Can't open", 0)
 End
EndIf

If OpenScreen(1024,768,16,"Gut Check")
   
   ;--Sound Loader--
   UseOGGSoundDecoder()
   LoadSound(2, "Chomp.wav")
   LoadSound(1, "opening.wav")
   ;PlaySound(1, 0)                  ;commented out during alpha phase 
    UseJPEGImageDecoder()
       
    ;--Sprite Loader--
    LoadSprite(0,"level.jpg",0)
    LoadSprite(2, "walls.jpg",0)
    LoadSprite(1,"anim.jpg",0)
    LoadSprite(1000, "smburger2.jpg", 0)

   
    LoadFont(1,"Arial",20,#PB_Font_Underline)
   
      ;--Game Engine-- 
      Repeat
         FlipBuffers()
         ClearScreen(0,0,0)
         
         ExamineKeyboard()
         
          If KeyboardPushed(#PB_Key_A) Or KeyboardPushed(#PB_Key_Left)
            Imagex - 3
            
          EndIf
         
          If KeyboardPushed(#PB_Key_D) Or KeyboardPushed(#PB_Key_Right)
            Imagex + 3
            
          EndIf

          If KeyboardPushed(#PB_Key_W) Or KeyboardPushed(#PB_Key_Up)
            Imagey - 3
            
          EndIf
         
          If KeyboardPushed(#PB_Key_S) Or KeyboardPushed(#PB_Key_Down)
            Imagey + 3
            
          EndIf
       
   	  DisplaySprite(0,0,0)
  	   
        Gosub animate   
        Gosub Burger_count
        Gosub Check_score
           
     
      Until KeyboardPushed(#PB_Key_Escape)
EndIf

End

animate:
        If ElapsedMilliseconds()-Tps>#TimeMax
        	   x+31:If x>61:x=0:EndIf
	        Tps=ElapsedMilliseconds()
        EndIf 
        ClipSprite(1,x,0,31,32)
        DisplayTransparentSprite(1,imagex, imagey)
Return

;--burger checking--

Burger_count:               
 
  ForEach  Burger()
    DisplayTransparentSprite(1000,burger()\x,Burger()\y)     
    If SpriteCollision(1, imagex, imagey, 1000, burger()\x, burger()\y) 
      PlaySound(2, 0)
      points + 25
      DeleteElement(Burger())   
    EndIf
Next     
Return     


;--Scoring Algorithm--
Check_score:

        StartDrawing(ScreenOutput())
          DrawingMode(1)
          DrawingFont(UseFont(1))
          FrontColor(255,255,255):Locate(700,100):DrawText("HIGH SCORE: " + Str(points))
          FrontColor(255,255,255):Locate(700,200):DrawText("1UP: " + Str(points))
        StopDrawing()
Return
Please correct my english
http://purebasic.developpez.com/
wolfwood2x
User
User
Posts: 76
Joined: Sun Oct 02, 2005 5:08 am

Post by wolfwood2x »

http://purebasic.myftp.org/?filename=fi ... tCheck.zip]GutCheck.zip

theres my file with the images and sounds so you can get a feel for it. It animates when you hit right or left and moves very slowly compared to when you hit up or down with no animation. I am open to both constructive and destructive criticism as I am just learning right now. If you want to tell me I am coding all wrong go right ahead, It will help me in the long run :D
User avatar
Comtois
Addict
Addict
Posts: 1432
Joined: Tue Aug 19, 2003 11:36 am
Location: Doubs - France

Post by Comtois »

Please correct my english
http://purebasic.developpez.com/
Post Reply