I had a similar problem a long time ago with play sprite and finally gave up. To get around the issue I wrote my own code to update the sprite image. I'll try to see if i can revisit play sprite and see what I can come up with.
It takes a lot more code to keep track of the animation frames on your own, but I think you will get better results. I'll post the basics of what I did. Keep in mind that It would be easier to have the character and animation frames in a user-defined-type. I wrote some of this code while experimenting with DBC.
chupmov:
if anim>3 then anim=1
if Ar_World(PWLocX,PWLocY-1,2)=0 then FL_Walkable=1
if PGridLocY=MaxUp and FL_Walkable=1
TopMost=TopMost-1
BottomMost=BottomMost-1
PWLocY=PWLocY-1
sprite CurrSpr,PLocX,PLocY,anim
rem sprite CurrSpr,PLocX,PLocY, 2
endif
if FL_Walkable=1 and PGridLocY>MaxUp
PLocY=PLocY-39
sprite CurrSpr,PLocX,PLocY,anim
PWLocY=PWLocY-1
PGridLocY=PGridLocY-1
rem sprite CurrSpr,PLocX,PLocY, 2
endif
inc anim
FL_Walkable=0
FL_Moved=1
return
rem **** Verify that player can move down ****
chdwmov:
if anim<7 or anim>9 then anim=7
if Ar_World(PWLocX,PWLocY+1,2)=0 then FL_Walkable=1
if PGridLocY=MaxDown and FL_Walkable=1
TopMost=TopMost+1
BottomMost=BottomMost+1
PWLocY=PWLocY+1
sprite CurrSpr,PLocX,PLocY,anim
endif
if FL_Walkable=1 and PGridLocY<MaxDown
PLocY=PLocY+39
sprite CurrSpr,PLocX,PLocY,anim
PWLocY=PWLocY+1
PGridLocY=PGridLocY+1
endif
inc anim
FL_Walkable=0
FL_Moved=1
return
rem **** Verify that player can move left ****
chltmov:
if anim<10 or anim>12 then anim=10
if Ar_World(PWLocX-1,PWLocY,2)=0 then FL_Walkable=1
if PGridLocX=MaxLeft and FL_Walkable=1
sprite CurrSpr,PLocX,PLocY,anim
LeftMost=LeftMost-1
RightMost=RightMost-1
PWLocX=PWLocX-1
endif
if FL_Walkable=1 and PGridLocX>MaxLeft
PLocX=PLocX-39
sprite CurrSpr,PLocX,PLocY,anim
PWLocX=PWLocX-1
PGridLocX=PGridLocX-1
endif
inc anim
FL_Walkable=0
FL_Moved=1
return
rem **** Verify that player can move right ****
chrtmov:
if anim<4 or anim>6 then anim=4
if Ar_World(PWLocX+1,PWLocY,2)=0 then FL_Walkable=1
if PGridLocX=MaxRight and FL_Walkable=1
LeftMost=LeftMost+1
RightMost=RightMost+1
PWLocX=PWLocX+1
sprite CurrSpr,PLocX,PLocY,anim
endif
if FL_Walkable=1 and PGridLocX<MaxRight
PLocX=PLocX+39
sprite CurrSpr,PLocX,PLocY,anim
PWLocX=PWLocX+1
PGridLocX=PGridLocX+1
endif
inc anim
FL_Walkable=0
FL_Moved=1
return
the anim variable keeps track of the current animation frame. I increment the animation frame in my movement code. If anim equals the last frame I reset it to the first frame.
Hope that helps...
~zen