Jump to content
IGNORED

Anyone thirsty for some PoP?


salstadt

Recommended Posts

Don't want to flood the tread with my wip sprites, but this animation was hard to do.

Jaffar animation from the intro, all frames is here. Poor Jaffar, all he wants is some fun times with the princess. I think if he buy flowers the thing could be more easy. He not make sucess with women, The problem is women aren't atracted by guys with pink clothes.

post-10940-125181212648.gif

Edited by LS_Dracon
Link to comment
Share on other sites

Jaffar animation from the intro, all frames is here. Poor Jaffar, all he wants is some fun times with the princess. I think if he buy flowers the thing could be more easy. He not make sucess with women, The problem is women aren't atracted by guys with pink clothes.

This looks gorgeous. :thumbsup:

 

I wonder how you create those animations? Any tools you use? Maybe you could describe and even illustrate the process with an example animation?

Link to comment
Share on other sites

Sure.

 

I don't like to copy, personally I preffer draw from scratch, but I'm trying to be most precise as possible.

 

The trick I created now and it's very usefull, is a kind of axis under the sprites, this axis help me to move the pixels better.

 

The process is - Run the game under DosBox emu, them recorder the screen as avi, then cut the sprites and paste into a bmp, clean background using photoshop and finally, using ms paint (for pixel drawing you don't need better) I draw frame by frame.

 

You see I did the animation by steps, first I did the walking animation, then save each sprite as gif and create the animated gif, this is very usefull to know how the animation is going. I do some fixes, then create another animated gif to see if everthing is ok.

 

Looks complicated but for me it's easy, I do this since end of 90's so I'm very familiar whit this process.

 

Here's the example of Jaffar "sprite sheet" (all sprites in one image). Also you notice how many resolution I lost :(

 

PS: this image contain the hourglass sprite too.

post-10940-125181738029_thumb.gif

Edited by LS_Dracon
Link to comment
Share on other sites

About 3 minutes per frame...

I think all these frames I did in 2 hours. 1 hour yesterday (walking and stand pose), 1 today (the others). Like I said, when animated, I need retouch some pixels. Jaffar turn animation was the most hard do finish.

 

I tried to scale down the sprites (the perfect value is 35%) but for me, this not help much, because first I need "clean" the scaled down sprite, removing wrong pixels, then convert to 2600 style. Is way faster for me already start on 2600 style from scratch, I think (and by the feedbacks), the result is good.

post-10940-12518241848_thumb.gif

Link to comment
Share on other sites

One frame from jump animation require 12 pixels wide. There's no way to fit in 8 pixels, with good results.

 

My suggestion is use 2x wide sprite only for this frame. Below you can check how it looks. The first sprite is original, red area is the over pixels. Second sprite is double wide. It lost resolution, but the frame is displayed very fast and I think there's no problem (hell it's Atari 2600). Another possibility, to use a missile, I think double wide is the best solution. The code is something like (on jumping code) :

 

lda #0        
ldx #5         ;Frame to be scaled
cpx FrameNo    ;Assuming there will be an animation frame counter, is frame number 5?
bne SetSize    ;No, A = 0, set to NUSIZ0
txa            ;Set double wide (x = 5 = 00000101)
SetSize
sta NUSIZ0

post-10940-125202034388.gif

Edited by LS_Dracon
Link to comment
Share on other sites

One frame from jump animation require 12 pixels wide. There's no way to fit in 8 pixels, with good results.

 

I anticipated this in the PoP kernel and so it draws a missile sprite on every line. The size of the missile can be modified (1, 2, 4, or 8 pixels wide) and the position shifted (up to 8 pixels in left or right) on each line. I previously used this technique to draw the bells in Hunchy 2, and it is described in this thread. I was intending to use this to extend the player and to draw the players sword.

 

Chris

Edited by cd-w
Link to comment
Share on other sites

For this sprite the missile must be positioned in back of the player, because an impossible 1 bit combination if displayed in front (see the yellow pixels). Assuming the missile is always positioned in front.

 

I would prefer to use the missile rather than making the player double-width if possible. Unfortunately in your example there are several 3-pixel blocks at the back of the player that can't be displayed using the missile. The missile can only be resized to 1,2,4,or 8 pixels wide, so some reworking will be required. Incidentally, the sprites that you have posted are looking amazing!

 

Chris

Link to comment
Share on other sites

The missile can only be resized to 1,2,4,or 8 pixels wide, so some reworking will be required.

I know.

I have plans to create one bin to test animation, and convert sprites to binnary. This kind of problem will be solved then.

Here's how I can fix the problem in this sprite :

 

PS: Chris, the kernel support ball object?

post-10940-125210639251.gif

Edited by LS_Dracon
Link to comment
Share on other sites

I know.

I have plans to create one bin to test animation, and convert sprites to binary. This kind of problem will be solved then.

Here's how I can fix the problem in this sprite

That looks good. Having binary versions of the sprite animations will be very useful for putting them into the game. One of the main issues that I can see is ensuring that the jump distances are correct.

 

PS: Chris, the kernel support ball object?

The kernel does support the ball object, but only for switching on/off, not varying the size. I'm going to have another look at the kernel soon and see if any further optimisations are possible.

 

Chris

Link to comment
Share on other sites

Yesterday, when I get the first guardian sprites, I discovered one amazing thing : This game is like stop motion animation!

Is hard to explan, let me try....

I'm not talking about how the animation frames was created. I'm talking about global timer for the animation and position changes.

 

Let uses the example of Pitfall. If you press left or right the character obviously run. The animation and speed are the same. Let's say, if you press the button, the character run faster. A good programmer will bost up the timer for animation, to keep animation and speed synchronized. Here's the point! I have 2 distinct things : Animation and motion speed. Don't care the animation timer, if I change the speed, the animation keeps the same. The character will run far, but the animation will looks the same.

 

On PoP there's not a motion speed! The position changes by animation frames, and it's uses a global timer. I notice the guardian changes the animation frames at exactly same time of the flames in torch. And the prince moves under this rule too. It's a trick created by Jordan Mechner to give a illusion of a movie. And this is the reason that PoP looks like a movie!

 

Here's a graphical example of what I'm trying to say.

You see Jaffar walking in two rows. There's 2 frames of animation (legs in, legs out). The first row is like a common game motion, every "game" frame the character moves 4 pixels, don't care what animation frame the character is. On second frame, he moves 4 pixels to right, but still in the first animation frame.

 

On the second row display how the characters moves in prince of persia.

Note like the first row, Jaffar start in point A (white line) and finish on point B (yellow line) and in both is needed 4 frames to reach point B. The "speed" are the same. But in this row, Jaffar only moves when the animation frame is changed. And in every changes, he "jump" 8 pixels, instead 4 like the first row.

And in PoP this happen under a global timer rule. All characters, animation and position, changes at exactly same timer. Dude it's Stop Motion animation! Hats off for Jordan Mechner!

So you think it's bad, because there's is a brocken fluence. But it's masked by the huge number of animation frames, turning the motion smooth.

 

Every frame must have own X & Y coordinates. I have plans to test it, but let me finish the sprites, first.

post-10940-125233167646_thumb.gif

Edited by LS_Dracon
Link to comment
Share on other sites

On PoP there's not a motion speed! The position changes by animation frames, and it's uses a global timer. I notice the guardian changes the animation frames at exactly same time of the flames in torch. And the prince moves under this rule too. It's a trick created by Jordan Mechner to give a illusion of a movie. And this is the reason that PoP looks like a movie!

 

Yes, when you move the player you are basically selecting a sequence of animation frames to be played. These frames will continue until the end of the animation unless further input is received. Only certain sequences can be "interrupted" by further input, e.g. clinging onto an edge when falling. It is a nice way of doing things, but requires a lot more art effort than a normal game!

 

Incidentally, I've begin to look at the PoP code again - it has been several years since I touched it and I've mostly forgotten how it works. I think I'll probably rewrite the kernel as I've learned a lot more about 2600 optimisation since I wrote it.

 

Chris

Link to comment
Share on other sites

Chris, the gravity also run under this rule.

I've made a quick AVI demonstrate better what I'm trying to say. Note the prince animation and position is changed at sime time of the torch animation, using global timer. I don't know exactly the timer, but let's say every 5 tv frames, you change the animation and position, freeze the screen in 4 frames, then change the animation frame and position again.

5 frames / 60 = 12 frames per second, the game frame rate.

 

Roland, yes! But I'm thinking how to implement this. I figure using 1 byte to send the X and Y coordinate, left nibble for X and right nibble for Y, I have 15 options for position shifting, enough. The problem is I need change between negative or positive (lef/right, up/down). I could set 1 byte for this, but reduce the position shift for at maximun 7 pixels. I need to see if there's an animation that move more than 7 pixels per frame (falling are the faster one I think), if not, I can use this. (The sprites are smaller than original, this means less pixels range to be movimented also).

As all the changes happen at same time, is not required an individual timer for each object, turning the things a bit easier.

 

Chris I could do this job if you want.

Or... synchronized the animation and speed like a normal game, but the game will lost the "stop motion" looking.

 

Edit : 1 byte per frame, if the run animation uses 6 frames, I need 6 bytes to move the character. It's a reasonable rom usage. I think I'll not require more than 150 bytes for all characters animation.

PoPteste.zip

Edited by LS_Dracon
Link to comment
Share on other sites

Chris I could do this job if you want.

Or... synchronized the animation and speed like a normal game, but the game will lost the "stop motion" looking.

 

I think I understand what you are saying - I would like to keep the stop-motion feel if this is possible.

At the moment the PoP code has a byte for each animation frame defined as follows:

 

Bits 0-1 - X Offset
Bits 2-3 - Y Offset
Bits 4-5 - Frame Delay
Bit 6 - Reverse Direction (Vertical)
Bit 7 - Reverse Direction (Horizontal)

 

This allows an offset of up to 2 pixels horizontally or vertically on each frame. However, as this data will be stored in ROM, this could easily be expanded to several bytes to give a greater range of offsets. Feel free to write the code for doing the animation if you like. I'm currently only looking at the kernel and mapping code.

 

Chris

Link to comment
Share on other sites

In my discover, we don't need the frame delay, as everthing run at same timer ;)

 

%CXXX CYYY

 

C = coordenates, 0 for positive, 1 for negative Ex:

 

0001 1010 = Move the player 1 pixels right, and 2 pixels to up.

1011 0000 = Move the player 3 pixels to left, and no vertical movement.

 

Yes, I will like to do, let me finish the sprite drawing first ;)

Edited by LS_Dracon
Link to comment
Share on other sites

In my discover, we don't need the frame delay, as everthing run at same timer ;)

 

%CXXX CYYY

 

C = coordenates, 0 for positive, 1 for negative Ex:

 

0001 1010 = Move the player 1 pixels right, and 2 pixels to up.

1011 0000 = Move the player 3 pixels to left, and no vertical movement.

 

Yes, I will like to do, let me finish the sprite drawing first ;)

 

This looks good to me - you are making great progress on the sprites!

Incidentally, I'm curious which country are you based in - I'm guessing French-Canadian, or somewhere in South America (e.g. Brazil) but I could be wrong :)

 

Chris

Edited by cd-w
Link to comment
Share on other sites

Here's a graphical example of what I'm trying to say.

You see Jaffar walking in two rows. There's 2 frames of animation (legs in, legs out). The first row is like a common game motion, every "game" frame the character moves 4 pixels, don't care what animation frame the character is. On second frame, he moves 4 pixels to right, but still in the first animation frame.

I agree, this looks much better. Else it would look like he is doing a "Moonwalk". :)

 

I never noticed the overall syncing before, but your explanation makes complete sense. :thumbsup:

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...