[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Main character animations.
Quoting Steve Baker <sjbaker1@airmail.net>:
> Katie Lauren Lucas wrote:
> >
> > So I'm toying with this 2D spritey game idea. Has a main player
> character which
> > has lots of pick-upable weapons (guns, bows, swords, spears). So I'm
> wondering
> > how to handle this graphically. I can think of:
> >
> > 1) Tons of sprites, going to need each weapon X each direction X
> each frame
> > of animation.
>
> Well, modern machines have an insane amount of RAM. You should be able
> to
> do a back-of-envelope calculation to know whether this is reasonable
> for
> any given value of X and sprite size.
RAM I don't care about. It's drawing them all that's the issue...
> > 2) Layers of sprites, one to animate the main character, one to
> overlay a
> > weapon on him/her. Issues of alignment, it might end up lacking
> graphical
> > sophistication. I have a feeling this ends up needing (weapons X
> directions X
> > frames + directions X frames) images in total.
>
> I think this is the answer - although I'd probably write the code to
> rotate
> the weapon sprite on-demand. So you'd hand-paint a sword (say) laying
> horizontally
> and then when the player picks it up, have the game code generate all
> the rotations
> you need into a cache. As each new weapon is picked up, you generate
> it's sprites - and
> if your cache is full, you toss out the oldest weapon's sprites.
Hmm. That's an interesting idea.
A friend of mine's doing research into real-time volume rendering technology;
he's got 500x500x500 volumes happening... I guess creating a set of (dinky)
sprites from a volume set could happen...
> I doubt that the time to generate all those rotations would be too
> significant - but
> if it is, generate each of the rotations on-demand, remembering which
> ones you've
> done and which are missing.
>
> I don't think the "Issues of alignment" should be too significant -
> although
> you might have interesting problems when you'd like parts of the
> player's body
> to block the view of the sword - whilst the sword simultaneously blocks
> the
> view of other parts of the body.
That's the sort of thing - yeah.
> > 3) Cheat. Have the player carrying an indistinct black blob.
> >
> > 4) Sophisticated cheating. Player carries nothing, when he starts
> fighting he
> > draws a weapon. Not sure this reduces images much.
> >
> > 5) Not caring. Player carries a sword. All the time. If he's got a
> gun he,
> > erm... appears to shoot with a sword. Heck, if RPG players can cope
> with an "@"
> > being a person...
>
> Na - those all suck.
Heh.
> > In a 3D game this would be easy (attach appropriate weapon mesh to the
> player
> > character's "hand" matrix)... but how do people do this in 2D games?
>
> Well, it depends on the resolution of the sprite. If it's *very* high
> res then
> it's going to be a problem. If it's lower res then just rotating the
> sprite
> whenever you draw it isn't impossible.
They're not just top down though - they're a 3/4 view.
> You are probably thinking of sprite rotation as involving lots of sin()
> and
> cos() calls - but you can be smarter than that.
>
> Suppose you built (slowly) a set of tables - one for each position a
> weapon
> might need to be in. Each entry of each table would correspond to one
> pixel
> in the rotated image and would contain a number indicating which pixel
> within
> a UNROTATED sprite would end up at this position in a ROTATED sprite.
AH!!!
Now there's a thought... I could store the "sprites" as areas of indirections
into a volume and indirect back through them to a volume which holds the actual
appearance: this would mean creating just directions X frames of indirection
data.
The "weapons" and "characters" are volumes of pixel data.. in a neutral pose,
with the indirections giving the posing. I can then update the volume when I
need to change something... suddenly it's practical to do things like change
what a character is wearing...
> That table can then be used to render *any* weapon using a simple static
> image
> of the weapon. It could even be used to mask part of it out where the
> player's
> body occludes it in that position.
> Hence *one* (admittedly large) set of tables - one for each of your X
> positions -
> will allow fast rotation of *ANY* object that the player might need to
> hold.
Yeah...
> This would allow for interesting game play where the player can pick up
> monsters
> or selected parts of the scenery and bash other hapless creatures with
> them!
Bar stool fight!!!
> Generally this kind of crude rotation aliases nastily because there is
> a
> 1:1 relation between the 'output' pixels and the ones in the unrotated
> sprite.
>
> You could get around that (for example) by storing FOUR pixel addresses
> at
> each location in the table - along with a number to multiply each one
> by
> before adding them together and writing them to the frame buffer.
> This
> would produce quite nice antialiased sprites.
Yeah... hey this could work. Fiendishly convoluted, but it would get me the
results...
Nine pixels would be better, because then I can top-hat filter the anti-
aliasing so it doesn't blur the detail too much.
> Bear in mind that not many pixels of your output image have to go
> through
> this complicated process - so it's not much of a stretch to presume
> that
> you could rotate weapon sprites in realtime.
And they can be cached...
> It's hard to give advice without knowing:
>
> * How big is 'X' (the number of sprite positions your player has) ?
8 facings.
> * What resolution will your sprites be? (32 pixels? 100? 300?)
32x32 ideally.
> * How many weapon types do you need for each 'level' of the game?
No idea. Dozens. (I'd like to be able to change the clothing as well..)
> * What CPU speeds do you want your game to accomodate? (Does it
> have to run on 33MHz 486's? Can we assume a 266MHz CPU? Maybe
> it's going to take a year to write and only run on cutting edge
> processors at 4GHz?!)
200MHz as a low bound.
> * How much RAM are you going to require the player to have? 16Mb?
> 2Gb?
>
> The nature of the answer depends critically on these questions.
I'm going to have to sit and think about this now...
_______________________________________________________________________________
Katie Lauren Lucas, Consultant Software Engineer, Parasol Solutions
katie@fysh.org katie.lucas@parasolsolutions.com http://www.parasolsolutions.com