Sign in to follow this  

2D animation question

This topic is 3840 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

hi, I was wondering which is the better way to go about doing 2D animation on DirectX. The way i know is to have multiple frames of the animation on the same file and have them cycle through, it works but doens't look that great. I know that theres a way to do it with each frame being on a different file and it probably looks better but i'm stuck at figuring out how to program that.

Share this post


Link to post
Share on other sites
No no, that's the way to go... all the animations into a single flie; perhaps you're not flipping surfaces (aka double buffering)

Share this post


Link to post
Share on other sites
hmmm, alright i'll look into it more, i've been using the directxtutorial.com examples and tutorials on animation, mabye im just missing something

Share this post


Link to post
Share on other sites
Well i'm still not getting my desired results because you can see the next frame of the animation coming from the left of Rect used for animation, I tried putting a timer in to slow down the frames but it doens't help to much. this is pretty basic stuff as i am using the tutorial off of directxtutorials.com.


// include the basic windows header files and the Direct3D header file
#include <windows.h>
#include <windowsx.h>
#include <d3d9.h>
#include <d3dx9.h>

// define the screen resolution and keyboard macros
#define SCREEN_WIDTH 1024
#define SCREEN_HEIGHT 768
#define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
#define KEY_UP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)

// include the Direct3D Library file
#pragma comment (lib, "d3d9.lib")
#pragma comment (lib, "d3dx9.lib")

// global declarations
LPDIRECT3D9 d3d; // the pointer to our Direct3D interface
LPDIRECT3DDEVICE9 d3ddev; // the pointer to the device class
LPD3DXSPRITE d3dspt; // the pointer to our Direct3D Sprite interface

// sprite declarations
LPDIRECT3DTEXTURE9 sprite; // the pointer to the sprite

// function prototypes
void initD3D(HWND hWnd); // sets up and initializes Direct3D
void render_frame(void); // renders a single frame
void cleanD3D(void); // closes Direct3D and releases memory

// the WindowProc function prototype
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);


// the entry point for any Windows program
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
HWND hWnd;
WNDCLASSEX wc;

ZeroMemory(&wc, sizeof(WNDCLASSEX));

wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)WindowProc;
wc.hInstance = hInstance;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.lpszClassName = L"WindowClass";

RegisterClassEx(&wc);

hWnd = CreateWindowEx(NULL, L"WindowClass", L"Our Direct3D Program",
WS_EX_TOPMOST | WS_POPUP, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT,
NULL, NULL, hInstance, NULL);

ShowWindow(hWnd, nCmdShow);

// set up and initialize Direct3D
initD3D(hWnd);

// enter the main loop:

MSG msg;

while(TRUE)
{
DWORD starting_point = GetTickCount();

if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message == WM_QUIT)
break;

TranslateMessage(&msg);
DispatchMessage(&msg);
}

render_frame();

// check the 'escape' key
if(KEY_DOWN(VK_ESCAPE))
PostMessage(hWnd, WM_DESTROY, 0, 0);

while ((GetTickCount() - starting_point) < 25);
}

// clean up DirectX and COM
cleanD3D();

return msg.wParam;
}


// this is the main message handler for the program
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_DESTROY:
{
PostQuitMessage(0);
return 0;
} break;
}

return DefWindowProc (hWnd, message, wParam, lParam);
}


// this function initializes and prepares Direct3D for use
void initD3D(HWND hWnd)
{
d3d = Direct3DCreate9(D3D_SDK_VERSION);

D3DPRESENT_PARAMETERS d3dpp;

ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = FALSE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hWnd;
d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
d3dpp.BackBufferWidth = SCREEN_WIDTH;
d3dpp.BackBufferHeight = SCREEN_HEIGHT;


// create a device class using this information and the info from the d3dpp stuct
d3d->CreateDevice(D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,
&d3ddev);

D3DXCreateSprite(d3ddev, &d3dspt); // create the Direct3D Sprite object

D3DXCreateTextureFromFileEx(d3ddev, // the device pointer
L"batl.png", // the file name
D3DX_DEFAULT, // default width
D3DX_DEFAULT, // default height
D3DX_DEFAULT, // no mip mapping
NULL, // regular usage
D3DFMT_A8R8G8B8, // 32-bit pixels with alpha
D3DPOOL_MANAGED, // typical memory handling
D3DX_DEFAULT, // no filtering
D3DX_DEFAULT, // no mip filtering
D3DCOLOR_XRGB(255, 0, 255), // the hot-pink color key
NULL, // no image info struct
NULL, // not using 256 colors
&sprite); // load to sprite

return;
}


// this is the function used to render a single frame
void render_frame(void)
{
// clear the window to a deep blue
d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);

d3ddev->BeginScene(); // begins the 3D scene

d3dspt->Begin(D3DXSPRITE_ALPHABLEND); // // begin sprite drawing with transparency

// DRAW THE SPRITE FRAME

// count from 0 to 9 to determine the current frame
static int frame = 9; // start the program on the final frame

int delay = 0;


// when the space key is pressed, start at frame 0
if(KEY_DOWN(VK_SPACE)) frame = 0;
if(frame < 9) frame++; // if we aren't on the last frame, go to the next frame

// calculate the x-position
int xpos = frame * 100 + 1;

Sleep(50);

// draw the selected frame using the coordinates
RECT part;
SetRect(&part, xpos, 0, xpos + 80, 128);
D3DXVECTOR3 center(0.0f, 0.0f, 0.0f); // center at the upper-left corner
D3DXVECTOR3 position(300.0f, 300.0f, 0.0f); // position at 50, 50 with no depth
d3dspt->Draw(sprite, &part, &center, &position, D3DCOLOR_ARGB(255, 255, 255, 255));


d3dspt->End(); // end sprite drawing

d3ddev->EndScene(); // ends the 3D scene

d3ddev->Present(NULL, NULL, NULL, NULL);

return;
}


// this is the function that cleans up Direct3D and COM
void cleanD3D(void)
{
sprite->Release();
d3ddev->Release();
d3d->Release();

return;
}



any help or suggestions to making the animation look better would be appreciated.

Share this post


Link to post
Share on other sites
You should pass to loadtexture function width and height of sprite texture instead of D3DX_DEFAULT, because there may occure some distortion on pixels.

And add
d3dpp.PresentationInterval=D3DPRESENT_INTERVAL_ONE;
to have double buffering...
Also you can use NULL operator instead of center vector because NULL operator will set vector to 0,0,0 (same as you use).
d3dspt->Draw(sprite, &part, NULL, &position,0xffffffff;

Share this post


Link to post
Share on other sites
does anyone have an example of some animation code that works well? I think seeing it would help me alot here.

Share this post


Link to post
Share on other sites
The two approaches you mentioned aren't radically different. The second approach adds additional image header and management overhead, though, so the first is generally preferred.

Anyway, screenshots will help a lot when something 'doesn't look great'. We don't know what you expected, and what you got, after all. :)

Share this post


Link to post
Share on other sites
thanks for all the response guys, I think the problem isn't the code itself its actually the picture file im using. the frames i belive aren't spaced out properly so thats why it looks like the animations not staying in one spot. however when i move the frames around it doens't appear to make any differnce in the program.

can someone send me some sample code for animation they use so i can compare it to mine? see if thers something that stands out mabye? i'd appreciate it alot.


oops sorry streamer i didin't see ur post thanks i'll look into when I have a chance

Share this post


Link to post
Share on other sites

This topic is 3840 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this