Beginner's Sprite Tutorial
Re: Beginner's Sprite Tutorial
Cheers Bob & Mat,
I agree about the masking, better in binary, but also a diagram explaining why the xcor cycles 0-7 and why we mask them would be a good idea.
I've still Xmas shopping to do, might not get round to it tomorrow.
I agree about the masking, better in binary, but also a diagram explaining why the xcor cycles 0-7 and why we mask them would be a good idea.
I've still Xmas shopping to do, might not get round to it tomorrow.
Re: Beginner's Sprite Tutorial
Don't get anything too big for me Dave!I've still Xmas shopping to do, might not get round to it tomorrow.
Re: Beginner's Sprite Tutorial
I hope you like those chocolates shaped liked shellfish, I've got a box left over from last year :-p
- MatGubbins
- Dynamite Dan
- Posts: 1239
- Joined: Mon Nov 13, 2017 11:45 am
- Location: Kent, UK
Re: Beginner's Sprite Tutorial
But they were given to you from someone else that had them left over from the year before that! They must be Vintage!
- bob_fossil
- Manic Miner
- Posts: 659
- Joined: Mon Nov 13, 2017 6:09 pm
Re: Beginner's Sprite Tutorial
Been playing around with R-Tape's posted source today and managed to knock this up with z88dk. The main loop is in C but the sprite erasing and drawing is all in assembly.
All the graphics I've done so far have been basic block printing so having some example code to work from has been helpful to see how animated sprites works with the 'interesting' Spectrum screen layout - so thanks again for doing this!
All the graphics I've done so far have been basic block printing so having some example code to work from has been helpful to see how animated sprites works with the 'interesting' Spectrum screen layout - so thanks again for doing this!
Re: Beginner's Sprite Tutorial
how are you avoiding flickering?
also could you give a verbal description of the erasing, because an 8x8 sprite could be in 4 atrributes at once, are you basically erasing all 4 close attributes every time?
also could you give a verbal description of the erasing, because an 8x8 sprite could be in 4 atrributes at once, are you basically erasing all 4 close attributes every time?
Re: Beginner's Sprite Tutorial
There's no flickering because the ULA draws the entire screen sequentially, 50 times a second. If, in between those 50th second points, you write different values into the display memory multiple times (blank, redraw, blank, redraw, etc), the ULA will just draw the final result of that when it comes to the next drawing time.
It’s a bit like a strobe light flashing 50 times a second. Someone runs fast, but the strobe doesn’t capture all the movement, so you see big jumps in between. The movement is still happening, but you only see snapshots at regular intervals.
Everyone is used to flickering in basic because printing happens an awful lot slower. Erasing a character and reprinting it wouldn't happen in the same 1/50th second frame. The ROM is trying to do a lot of whole bunch of operating system stuff in every frame, not just printing, and none of it is particularly optimised for speed.
It’s a bit like a strobe light flashing 50 times a second. Someone runs fast, but the strobe doesn’t capture all the movement, so you see big jumps in between. The movement is still happening, but you only see snapshots at regular intervals.
Everyone is used to flickering in basic because printing happens an awful lot slower. Erasing a character and reprinting it wouldn't happen in the same 1/50th second frame. The ROM is trying to do a lot of whole bunch of operating system stuff in every frame, not just printing, and none of it is particularly optimised for speed.
Last edited by Seven.FFF on Sun Dec 24, 2017 6:27 pm, edited 3 times in total.
Robin Verhagen-Guest
SevenFFF / Threetwosevensixseven / colonel32
NXtel • NXTP • ESP Update • ESP Reset • CSpect Plugins
SevenFFF / Threetwosevensixseven / colonel32
NXtel • NXTP • ESP Update • ESP Reset • CSpect Plugins
Re: Beginner's Sprite Tutorial
Use a hollow box graphic, not a filled one. That black smear going down your first image isn't at all clear. Maybe add a grid on 8 pixel boundaries so it's clearer that there's 3 bytes of width, not 2. It took me a while to work out why the bottom block of the graphic has a white line down the right edge.
You should probably define the term "preshifted" rather than just using it as if the reader is expected to know what it means.
The term "therefore each sprite is 48 bytes" might be better as "therefore each preshifted position of the sprite is 48 bytes".
Use more meaningful labels. I presume "xcor" is an abbreviation of "X coordinate"? Make it, say, "x_position". I don't know what "delp" might be an abbreviation of.
I don't think the LD BC,(xcor) is helpful at this level, even with the comment. Load B and C separately.
Otherwise, very good. I think a better graphic which more clearly describes how the preshifted sprite gets put into the bytes of the display would help. If someone hasn't grasped the concept of what you're doing I don't think reading that code will help them. Once they have grasped it, I think it should be clear.
You should probably define the term "preshifted" rather than just using it as if the reader is expected to know what it means.
The term "therefore each sprite is 48 bytes" might be better as "therefore each preshifted position of the sprite is 48 bytes".
Use more meaningful labels. I presume "xcor" is an abbreviation of "X coordinate"? Make it, say, "x_position". I don't know what "delp" might be an abbreviation of.
I don't think the LD BC,(xcor) is helpful at this level, even with the comment. Load B and C separately.
Otherwise, very good. I think a better graphic which more clearly describes how the preshifted sprite gets put into the bytes of the display would help. If someone hasn't grasped the concept of what you're doing I don't think reading that code will help them. Once they have grasped it, I think it should be clear.
Derek Fountain, author of the ZX Spectrum C Programmer's Getting Started Guide and various open source games, hardware and other projects, including an IF1 and ZX Microdrive emulator.
- Ast A. Moore
- Rick Dangerous
- Posts: 2641
- Joined: Mon Nov 13, 2017 3:16 pm
Re: Beginner's Sprite Tutorial
The routine takes very little time and is completed entirely while the ULA is drawing the top border. By the time the beam reaches the active screen area, all the drawing and redrawing had long been finished. Hence, no flickering.
If you introduce a delay after the HALT, you can make the sprite flicker, or disappear entirely:
Code: Select all
ld bc,$220
wait dec bc
ld a,b
or c
jp nz,wait
To visualize where the electron beam is during code execution, it’s a good idea to changed the border color for that period. Modify the main loop as shown below, and you’ll see what I mean.
Code: Select all
main: halt
ld bc,$220
wait dec bc
ld a,b
or c
jp nz,wait
xor a ;border black
out (254),a
call deletesprit
call movesprite
call drawsprite
ld a,7 ;border white
out (254),a
jr main
Every man should plant a tree, build a house, and write a ZX Spectrum game.
Author of A Yankee in Iraq, a 50 fps shoot-’em-up—the first game to utilize the floating bus on the +2A/+3,
and zasm Z80 Assembler syntax highlighter.
Author of A Yankee in Iraq, a 50 fps shoot-’em-up—the first game to utilize the floating bus on the +2A/+3,
and zasm Z80 Assembler syntax highlighter.
Re: Beginner's Sprite Tutorial
ohhh theres a halt, so the sprites are drawn when the raster beam is at the top, ok thanks
Re: Beginner's Sprite Tutorial
Agreed, I was tempted to show a walking sprite but a hollow box it is.dfzx wrote: ↑Sun Dec 24, 2017 6:20 pm Use a hollow box graphic, not a filled one. That black smear going down your first image isn't at all clear. Maybe add a grid on 8 pixel boundaries so it's clearer that there's 3 bytes of width, not 2. It took me a while to work out why the bottom block of the graphic has a white line down the right edge.
Yep, and compared to rotated.
Yup.
I think most will get xcor as x coordinate, but no harm in hammering it home. "delp" is delete loop,, and would be better described as such (or loop1, loop2 etc), I fell into my regular shorthand there.
I almost did that. Agreed.
Cheers.dfzx wrote: ↑Sun Dec 24, 2017 6:20 pm Otherwise, very good. I think a better graphic which more clearly describes how the preshifted sprite gets put into the bytes of the display would help. If someone hasn't grasped the concept of what you're doing I don't think reading that code will help them. Once they have grasped it, I think it should be clear.
Re: Beginner's Sprite Tutorial
That warms me cockles bob!bob_fossil wrote: ↑Sun Dec 24, 2017 5:50 pm Been playing around with R-Tape's posted source today and managed to knock this up with z88dk. The main loop is in C but the sprite erasing and drawing is all in assembly.
All the graphics I've done so far have been basic block printing so having some example code to work from has been helpful to see how animated sprites works with the 'interesting' Spectrum screen layout - so thanks again for doing this!
Re: Beginner's Sprite Tutorial
I believe the only thinkg missing, is a graphical schema of what is going on, before actually diving into the code.
People like to see an overview, that prepares them for what comes next. Makes it easier to grasp.
Also, the concept of animation, and how it works in consecutive frames, might be worth a small intro.
People like to see an overview, that prepares them for what comes next. Makes it easier to grasp.
Also, the concept of animation, and how it works in consecutive frames, might be worth a small intro.
Last edited by RMartins on Mon Dec 25, 2017 9:42 pm, edited 1 time in total.
Re: Beginner's Sprite Tutorial
Having thought about it a bit more, what you could do is split it into 2 lessons. The first could use a sprite one pixel high, which would allow the focus to remain solely on how the horizontal preshifting works. Then make the second lesson add the other 15 rows of the sprite, which is what you have now.
Derek Fountain, author of the ZX Spectrum C Programmer's Getting Started Guide and various open source games, hardware and other projects, including an IF1 and ZX Microdrive emulator.
Re: Beginner's Sprite Tutorial
Something that I would change/add, would be to split the several shifted sprite versions, into actual distinct sprites.
i.e. having the 8 sprite versions, in order in memory is an optimization that might not be clear for a beginner.
If instead, we had a simple table, with the address of all those 8 pre-shifted sprites, we can still mutiple A by 2, and the get the Sprite address from the table.
From a beginners perspective, it's easier to grasp that we have a table of sprites (8 in this case), and we get one from there using an index.
(Coincidently, it's also faster, but that is not the point here)
Getting the sprite we want by multiplying the index by 48 (sprite total length in bytes), and then add the base address, because they are in sequence in memory, is not immediate to understand for a beginner.
i.e. having the 8 sprite versions, in order in memory is an optimization that might not be clear for a beginner.
If instead, we had a simple table, with the address of all those 8 pre-shifted sprites, we can still mutiple A by 2, and the get the Sprite address from the table.
From a beginners perspective, it's easier to grasp that we have a table of sprites (8 in this case), and we get one from there using an index.
(Coincidently, it's also faster, but that is not the point here)
Getting the sprite we want by multiplying the index by 48 (sprite total length in bytes), and then add the base address, because they are in sequence in memory, is not immediate to understand for a beginner.
Re: Beginner's Sprite Tutorial
The following is an updated example that I hope addresses everyone's suggestions (even the ones I ignored :-p).
Re: Beginner's Sprite Tutorial
This is a relatively simple and unoptimised routine to draw one sprite on the screen. For the purposes of this exercise, the routines nextlinedown, yx2pix and getsprite do not need to be understood yet.
This assumes the beginner already knows how to assemble the code (though do ask if not sure), and knows the rudiments of the language.
In this example we draw the same sprite (a 16 x 16 pixel blob on legs) stored in memory, shifted in all 8 possible positions (that's why we call these 'preshifted' sprites), moving left to right, like this:
As the sprite moves sideways it straddles more than 16 pixels, so we need to store the graphic with a space for it to move into. For this reason each sprite position is 3 bytes wide and 16 pixels high, therefore each sprite position is 48 bytes.
Also notice that the sprite graphic is slightly different in each position, to give a walking animation.
If you assemble the code and RANDOMIZE USR 32768 you should see this:
And for additional info, in this slowed down animation below, see how the lowest 3 bits of the x coordinate cycles 0 - 7 (decimal). So whatever the x coordinate is, we can grab the lowest 3 bits and get the correct sprite graphic.
And finally, here's the code:
;
This assumes the beginner already knows how to assemble the code (though do ask if not sure), and knows the rudiments of the language.
In this example we draw the same sprite (a 16 x 16 pixel blob on legs) stored in memory, shifted in all 8 possible positions (that's why we call these 'preshifted' sprites), moving left to right, like this:
As the sprite moves sideways it straddles more than 16 pixels, so we need to store the graphic with a space for it to move into. For this reason each sprite position is 3 bytes wide and 16 pixels high, therefore each sprite position is 48 bytes.
Also notice that the sprite graphic is slightly different in each position, to give a walking animation.
If you assemble the code and RANDOMIZE USR 32768 you should see this:
And for additional info, in this slowed down animation below, see how the lowest 3 bits of the x coordinate cycles 0 - 7 (decimal). So whatever the x coordinate is, we can grab the lowest 3 bits and get the correct sprite graphic.
And finally, here's the code:
Code: Select all
org 32768 ;we can ORG (or assemble) this code anywhere really
;a beginner's, unoptimised sprite routine
main: halt ;this stops the program until the Spectrum is about to refresh the TV screen
;the HALT is important to avoid sprite flicker, and it slows down the program
call deletesprite ;we need to delete the old position of the sprite
call movesprite ;move the sprite! Could be based on player key input or baddy AI
call drawsprite ;get correct preshifted graphic, and draw it on the screen
jr main ;loop!
;
deletesprite: ;we need to delete the old sprite before we draw the new one. The sprite is 3 bytes wide & 16 pixels high
ld a,(x_coordinate) ;make C=xcor and B=ycor
ld c,a
ld a,(y_coordinate)
ld b,a
call yx2pix ;point DE at the corresponding screen address
ld b,16 ;sprite is 16 lines high
deleteloop:
ld a,0 ;empty A to delete
ld (de),a ;repeat a total of 3 times
inc e ;next column along
ld (de),a
inc e
ld (de),a
dec e
dec e ;move DE back to start of line
call nextlinedown ;move DE down one line
djnz deleteloop ;repeat 16 times
ret
;
movesprite: ;very simple routine that just increases the x coordinate
ld a,(x_coordinate)
inc a
ld (x_coordinate),a
cp 232 ;check if the sprite has moved all the way to the right (256-24)
ret c ;return if not
ld a,0 ;if yes then back to left
ld (x_coordinate),a
ret
;
drawsprite:
ld a,(x_coordinate) ;make C=xcor and B=ycor
ld c,a
ld a,(y_coordinate)
ld b,a
call yx2pix ;point DE at corresponding screen position
ld a,(x_coordinate) ;but we still need to find which preshifted sprite to draw
and 00000111b ;we have 8 preshifted graphics to choose from, cycled 0-7 in the right hand 3 bits of the x coordinate
call getsprite ;point HL at the correct graphic
ld b,16 ;sprite is 16 lines high
drawloop:
ld a,(hl) ;take a byte of graphic
ld (de),a ;and put it on the screen
inc hl ;next byte of graphic
inc e ;next column on screen
ld a,(hl) ;repeat for 3 bytes across
ld (de),a
inc hl
inc e
ld a,(hl)
ld (de),a
inc hl
dec e
dec e ;move DE back to left hand side of sprite
call nextlinedown
djnz drawloop ;repeat for all 16 lines
ret
;
x_coordinate: db 0
y_coordinate: db 0
;
nextlinedown: ;don't worry about how this works yet!
inc d ;just arrive with DE in the display file
ld a,d ;and it gets moved down one line
and 7
ret nz
ld a,e
add a,32
ld e,a
ret c
ld a,d
sub 8
ld d,a
ret
;
yx2pix: ;don't worry about how this works yet! just arrive with arrive with B=y 0-192, C=x 0-255
ld a,b ;return with DE at corresponding place on the screen
rra
rra
rra
and 24
or 64
ld d,a
ld a,b
and 7
or d
ld d,a
ld a,b
rla
rla
and 224
ld e,a
ld a,c
rra
rra
rra
and 31
or e
ld e,a
ret
;
getsprite: ;don't worry much about how this works! for an alternative method that
;uses a table see 'getsprite_alternativemethod'
;Arrive A holding which pixel within a byte (0-7), point HL at correct graphic
ld h,0 ;we need to multiply A by 48, do it in HL
ld l,a
add hl,hl ;x2
add hl,hl ;x4
add hl,hl ;x8
add hl,hl ;x16
ld b,h
ld c,l ;BC = x 16
add hl,hl ;x32
add hl,bc ;x48
ld bc,spritegraphic0
add hl,bc ;HL now pointing at correct sprite frame
ret
;
getsprite_alternativemethod:
;arrive A holding which sprite position 0 - 7
;this method uses a table to find the correct graphic
add a,a ;multiplay a by 2, this converts a single byte number 0-7 into a 2 byte table entry
ld h,0
ld l,a
ld bc,sprite_table_addresses
add hl,bc ;HL is now pointing at the correct table entry
ld c,(hl)
inc hl
ld b,(hl) ;get table address spritegraphic0, spritegraphic1 etc in BC
ld l,c
ld h,b ;now HL is pointing at the correct sprite graphic
ret
;
sprite_table_addresses:
dw spritegraphic0
dw spritegraphic1
dw spritegraphic2
dw spritegraphic3
dw spritegraphic4
dw spritegraphic5
dw spritegraphic6
dw spritegraphic7
;
spritegraphic0: ;8 preshifted graphics, each one 3 bytes wide and 16 pixels high, this one a simple square
db 0, 0, 0 ;frame 0
db 7, 224, 0
db 31, 248, 0
db 127, 254, 0
db 127, 214, 0
db 255, 215, 0
db 255, 255, 0
db 255, 255, 0
db 255, 187, 0
db 127, 198, 0
db 127, 254, 0
db 31, 248, 0
db 7, 224, 0
db 0, 0, 0
db 7, 96, 0
db 15, 176, 0
;
spritegraphic1:
db 0, 0, 0 ;frame 1
db 3, 240, 0
db 15, 252, 0
db 63, 255, 0
db 63, 235, 0
db 127, 235, 128
db 127, 255, 128
db 127, 255, 128
db 127, 221, 128
db 63, 227, 0
db 63, 255, 0
db 15, 252, 0
db 3, 240, 0
db 0, 0, 0
db 3, 176, 0
db 7, 216, 0
;
spritegraphic2:
db 0, 0, 0 ;frame 2
db 1, 248, 0
db 7, 254, 0
db 31, 255, 128
db 31, 245, 128
db 63, 245, 192
db 63, 255, 192
db 63, 255, 192
db 63, 238, 192
db 31, 241, 128
db 31, 255, 128
db 7, 254, 0
db 1, 248, 0
db 0, 0, 0
db 7, 158, 0
db 3, 204, 0
;
spritegraphic3:
db 0, 0, 0 ;frame 3
db 0, 252, 0
db 3, 255, 0
db 15, 255, 192
db 15, 250, 192
db 31, 250, 224
db 31, 255, 224
db 31, 255, 224
db 31, 247, 96
db 15, 248, 192
db 15, 255, 192
db 3, 255, 0
db 0, 252, 0
db 0, 0, 0
db 3, 207, 0
db 1, 230, 0
;
spritegraphic4:
db 0, 126, 0 ;frame 4
db 1, 255, 128
db 7, 255, 224
db 7, 253, 96
db 15, 253, 112
db 15, 255, 240
db 15, 255, 240
db 15, 251, 176
db 7, 252, 96
db 7, 255, 224
db 1, 255, 128
db 0, 126, 0
db 1, 128, 192
db 1, 195, 192
db 0, 225, 128
db 0, 0, 0
;
spritegraphic5:
db 0, 63, 0 ;frame 5
db 0, 255, 192
db 3, 255, 240
db 3, 254, 176
db 7, 254, 184
db 7, 255, 248
db 7, 255, 248
db 7, 253, 216
db 3, 254, 48
db 3, 255, 240
db 0, 255, 192
db 0, 63, 0
db 0, 192, 96
db 0, 225, 224
db 0, 112, 192
db 0, 0, 0
;
spritegraphic6:
db 0, 0, 0 ;frame 6
db 0, 31, 128
db 0, 127, 224
db 1, 255, 248
db 1, 255, 88
db 3, 255, 92
db 3, 255, 252
db 3, 255, 252
db 3, 254, 236
db 1, 255, 24
db 1, 255, 248
db 0, 127, 224
db 0, 31, 128
db 0, 0, 0
db 0, 14, 128
db 0, 31, 64
;
spritegraphic7:
db 0, 0, 0 ;frame 7
db 0, 15, 192
db 0, 63, 240
db 0, 255, 252
db 0, 255, 172
db 1, 255, 174
db 1, 255, 254
db 1, 255, 254
db 1, 255, 118
db 0, 255, 140
db 0, 255, 252
db 0, 63, 240
db 0, 15, 192
db 0, 0, 0
db 0, 7, 64
db 0, 15, 160
;
Re: Beginner's Sprite Tutorial
Vast improvement.
I need to look at the code more carefully, but the graphical content is immediately understandable.
I need to look at the code more carefully, but the graphical content is immediately understandable.
Derek Fountain, author of the ZX Spectrum C Programmer's Getting Started Guide and various open source games, hardware and other projects, including an IF1 and ZX Microdrive emulator.
Re: Beginner's Sprite Tutorial
Just a small tip on the animation frames, since t looks a bit odd.
Either you are trying to make it look, like the character is jumping, but then a single pixel is not enough.
Or you are doing a regular walk, but the vertical movement is reversed.
i.e. when legs are wide spread apart (doing a large step), it's when we go lower in height on our walk cycle.
When both feet are together, it's when height is highest.
Phytagoras theorem ?
You can also benefit the character, by adding more positions on legs, since they mostly seem to be paired each 2 frames.
If possible take into account feet position, while moving, so that character doesn't seem to be sliding.
with 8 frames, walk can look a lot nicer.
P.S.
The bits gif animation, looks great, and simple.
Either you are trying to make it look, like the character is jumping, but then a single pixel is not enough.
Or you are doing a regular walk, but the vertical movement is reversed.
i.e. when legs are wide spread apart (doing a large step), it's when we go lower in height on our walk cycle.
When both feet are together, it's when height is highest.
Phytagoras theorem ?
You can also benefit the character, by adding more positions on legs, since they mostly seem to be paired each 2 frames.
If possible take into account feet position, while moving, so that character doesn't seem to be sliding.
with 8 frames, walk can look a lot nicer.
P.S.
The bits gif animation, looks great, and simple.
Re: Beginner's Sprite Tutorial
I agree the walk looks weird, it's my usual animation for a 4 frame, 2 pixel walk hastily doubled up. At twice the speed I usually get away with it.
Does anyone have a decent 8 frame 16px walking sprite I could use? Ideally the sprite needs to fill most of the box.
Or even better, could someone improve the animation of this blob? I like the idea of showing how a walking animation can be done simply.
Does anyone have a decent 8 frame 16px walking sprite I could use? Ideally the sprite needs to fill most of the box.
Or even better, could someone improve the animation of this blob? I like the idea of showing how a walking animation can be done simply.
Re: Beginner's Sprite Tutorial
I'm assuming you want an 8px char.
Does it need to be 16px width ?
I have 2 simple ones, with 16px character, in 24px width.
and
Interested ?
Does it need to be 16px width ?
I have 2 simple ones, with 16px character, in 24px width.
and
Interested ?
Re: Beginner's Sprite Tutorial
They look a bit too good for purposes here! They are 2 sexy looking sprites.
Could you post the frames here and perhaps I can modify the blob?
Could you post the frames here and perhaps I can modify the blob?
-
- Manic Miner
- Posts: 390
- Joined: Sun Nov 12, 2017 3:54 pm
Re: Beginner's Sprite Tutorial
Yeah is it possible to see the frames for the 2nd one?
The 1st looks sound but the right leg in the 2nd one looks a bit weird at times. It could just be trying to view a small image in my phone, though.
The 1st looks sound but the right leg in the 2nd one looks a bit weird at times. It could just be trying to view a small image in my phone, though.
Re: Beginner's Sprite Tutorial
I think it is because of the first (standing) frame and the frame after it.
In the standing frame the two legs do not fully overlap, and in the following frame the two feet are drawn differently, so that the forward foot is the left one. It creates the impression that only the left leg makes forwards steps. If both feet overlapped in the middle frame, so they looked like only one foot, and the stepping frames made the left and right feet look the same, the steps would look a little better (though it would then be inconsistent with the perspective on the face).
Nice sprites!
Re: Beginner's Sprite Tutorial
Here are Zoom versions of them.
And
I also have the SevenUp Editor .SEV files somewhere in my drive, I'll have a look and post them when found.
The issue you see is related with a bunch of pixels that are together on the left leg, when it's up in front.
It comes out as a brighter spot due to that, and that's what makes it feel a bit odd.
But if we remove those pixels, it seems the leg never crossed over, or the right leg might seem too bulky.
Maybe there are better solutions, but it's not easy at this size, in my opinion.
but feel free to change or update them, they can always be improved.
Thank you for all the positive comments, for my first walk animation studies, done quite a few months ago.
And
I also have the SevenUp Editor .SEV files somewhere in my drive, I'll have a look and post them when found.
I could try that, when I have a half an hour or so free.
There is something there yes, but I believe there isn't much that can be done about it, without looking funny, or having to change the whole sprite.redballoon wrote: ↑Fri Dec 29, 2017 10:41 am ...
The 1st looks sound but the right leg in the 2nd one looks a bit weird at times. It could just be trying to view a small image in my phone, though.
The issue you see is related with a bunch of pixels that are together on the left leg, when it's up in front.
It comes out as a brighter spot due to that, and that's what makes it feel a bit odd.
But if we remove those pixels, it seems the leg never crossed over, or the right leg might seem too bulky.
Maybe there are better solutions, but it's not easy at this size, in my opinion.
but feel free to change or update them, they can always be improved.
Thank you for all the positive comments, for my first walk animation studies, done quite a few months ago.