User Name Password Register
DaniWeb IT Discussion Community
All
What is DaniWeb IT Discussion Community?
You're currently browsing the Game Development section within the Software Development category of DaniWeb, a massive community of 456,234 software developers, web developers, Internet marketers, and tech gurus who are all enthusiastic about making contacts, networking, and learning from each other. In fact, there are 3,817 IT professionals currently interacting right now! Registration is free, only takes a minute and lets you enjoy all of the interactive features of the site.
Please support our Game Development advertiser: Programming Forums
Views: 1701 | Replies: 0
Reply
Join Date: Jul 2006
Posts: 70
Reputation: SHWOO is an unknown quantity at this point 
Rep Power: 3
Solved Threads: 0
SHWOO SHWOO is offline Offline
Junior Poster in Training

Animating Sprites

  #1  
Nov 12th, 2007
Hi, I am trying to get a cat walking back and forth between the screen using a left and right tileset of bitmaps. Also, I am supposed to be able to control two caveman sprites that appear to walk left and right as you press the left and right keys.

I am having trouble with the movement of the caveman.

#include "game.h"

LPDIRECT3DTEXTURE9 catleft_image;
LPDIRECT3DTEXTURE9 catright_image;
LPDIRECT3DTEXTURE9 cavemanright_image;
LPDIRECT3DTEXTURE9 cavemanleft_image;
SPRITE catRight;
SPRITE catLeft;
SPRITE cavemanRight;
SPRITE cavemanLeft;

LPDIRECT3DSURFACE9 back;
LPD3DXSPRITE sprite_handler;


HRESULT result;

//timing variable
long start = GetTickCount();

//initialize the game
int Game_Init(HWND hwnd)
{
	//set random number seed
	srand(time(NULL));

	//create sprite handler object
	result = D3DXCreateSprite(d3ddev, &sprite_handler);
	if(result != D3D_OK)
		return 0;

	//load textures
	catleft_image = LoadTexture("catLeft.bmp", D3DCOLOR_XRGB(255,0,255));
	if(catleft_image == NULL)
		return 0;
	
	// initialize the sprite's properties
	// set catLeft's properties
	catLeft.x = 96;
	catLeft.y = 150;
	catLeft.width = 96;
	catLeft.height = 96;
	catLeft.curframe = 0;
	catLeft.lastframe = 5;
	catLeft.animdelay = 2;
	catLeft.animcount = 0;
	catLeft.movex = 8;
	catLeft.movey = 0;

	catright_image = LoadTexture("catRight.bmp", D3DCOLOR_XRGB(255,0,255));
	if(catright_image == NULL)
		return 0;

	// set catRight's properties
	catRight.x = 96;
	catRight.y = 150;
	catRight.width = 96;
	catRight.height = 96;
	catRight.curframe = 0;
	catRight.lastframe = 5;
	catRight.animdelay = 2;
	catRight.animcount = 0;
	catRight.movex = 8;
	catRight.movey = 0;

	cavemanright_image = LoadTexture("cavemanRight.bmp", D3DCOLOR_XRGB(255,0,255));
	if(cavemanright_image == NULL)
		return 0;

	cavemanRight.x = 100;
	cavemanRight.y = 180;
	cavemanRight.width = 50;
	cavemanRight.height = 64;
	cavemanRight.curframe = 1;
	cavemanRight.lastframe = 11;
	cavemanRight.animdelay = 3;
	cavemanRight.animcount = 0;
	cavemanRight.movex = 5;
	cavemanRight.movey = 0;

	cavemanleft_image = LoadTexture("cavemanLeft.bmp", D3DCOLOR_XRGB(255,0,255));
	if(cavemanleft_image == NULL)
		return 0;

	//set cavemanLeft properties
	cavemanLeft.x = 64;
	cavemanLeft.y = 180;
	cavemanLeft.width = 50;
	cavemanLeft.height = 64;
	cavemanLeft.curframe = 0;
	cavemanLeft.lastframe = 11;
	cavemanLeft.animdelay = 3;
	cavemanLeft.animcount = 0;
	cavemanLeft.movex = -5;
	cavemanLeft.movey = 0;

	 back = LoadSurface("background.bmp", NULL );	

	return 1;
}

//the main game loop
void Game_Run(HWND hwnd)
{

	//make sure the Direct3D device is valid
	if(d3ddev == NULL)
		return;

	
	//after short delay, ready for next frame?
	//this keeps the game running at a steady frame rate
	if(GetTickCount() - start >= 30)
	{
		//reset timing
		start = GetTickCount();

		// move the sprite
		catRight.x += catRight.movex;
		catRight.y += catRight.movey;


		if ( catRight.x > SCREEN_WIDTH - catRight.width )
		{
			catRight.x += 0;
			catRight.movex *= -1;
			catLeft.movex *= -1;
		}
		else
			if ( catRight.x < 0 )
			{
				catRight.movex *= -1;
				catRight.x += catRight.movex;
				catLeft.movex *= -1;
				catLeft.x += catLeft.movex;
			}
			

			if(cavemanRight.x > SCREEN_WIDTH - cavemanRight.width)
			{
				cavemanRight.movex = 0;
			}
			else if(cavemanRight.x < 0)
			{
				cavemanRight.movex *= -1;
				cavemanRight.x += cavemanRight.movex;
				cavemanLeft.movex *=-1;
				cavemanLeft.x += cavemanLeft.movex;
			}
		
		//move the sprite
		if(KEY_DOWN(VK_RIGHT)){
			cavemanRight.x += cavemanRight.movex;
			cavemanRight.y += cavemanRight.movey;
		}

		if(KEY_DOWN(VK_LEFT))
		{
			cavemanLeft.x += cavemanLeft.movex;
		}	

		//has animation delay reached threshold?
		if (++cavemanRight.animcount > cavemanRight.animdelay)
		{
			//reset counter
			cavemanRight.animcount = 0;

			//animate the sprite
			if (++cavemanRight.curframe > cavemanRight.lastframe)
				cavemanRight.curframe = 1;
		}

		//has animation delay reached threshold?
		if (++cavemanLeft.animcount > cavemanLeft.animdelay)
		{
			//reset counter
			cavemanLeft.animcount = 0;

			//animate the sprite
			if (++cavemanLeft.curframe > cavemanLeft.lastframe)
				cavemanLeft.curframe = 0;
		}

		if (++catRight.animcount > catRight.animdelay)
		{
			// reset counter
			catRight.animcount = 0;

			// animate the sprite
			if (++catRight.curframe > catRight.lastframe)
				catRight.curframe = 1;
		}

		if (++catLeft.animcount > catLeft.animdelay)
		{
			// reset counter
			catLeft.animcount = 0;

			// animate the sprite
			if (++catLeft.curframe > catLeft.lastframe)
				catLeft.curframe = 0;
		}
	}

	//start rendering 
	if (d3ddev->BeginScene())
	{
		//erase the entire background
		d3ddev->StretchRect(back, NULL, backbuffer, NULL, D3DTEXF_NONE);

		sprite_handler->Begin(D3DXSPRITE_ALPHABLEND);

		//create vector to update sprite position
		D3DXVECTOR3 position((float)cavemanRight.x, (float)cavemanRight.y, 0);
		D3DXVECTOR3 position3((float)catRight.x, (float)catRight.y, 0);

		//this variable will keep cavemanRight from drawing
		bool drawCavemanRight;

		//configure the rect for the source tile
		RECT catSrc;
		RECT caveSrc;
			int caveColumns = 8;
			int catColumns = 6;

			catSrc.left = (catRight.curframe % catColumns) * catRight.width;
			catSrc.top = (catRight.curframe / catColumns) * catRight.height;
			catSrc.right = catSrc.left + catRight.width;
			catSrc.bottom = catSrc.top + catRight.height;
		
			caveSrc.left = (cavemanRight.curframe % caveColumns) * cavemanRight.width;
			caveSrc.top = (cavemanRight.curframe / caveColumns) * cavemanRight.height;
			caveSrc.right = caveSrc.left + cavemanRight.width;
			caveSrc.bottom = caveSrc.top + cavemanRight.height;	


			//if cavemanLeft if being drawn do not draw right caveman

			if(cavemanRight.movex > 0)
			{
				sprite_handler->Draw(
					cavemanright_image,
					&caveSrc,
					NULL,
					&position,
					D3DCOLOR_XRGB(255,255,255));
			}

			else if(cavemanLeft.movex < 0)
			{
				sprite_handler->Draw(
					cavemanleft_image,
					&caveSrc,
					NULL,
					&position,
					D3DCOLOR_XRGB(255,255,255));
			}

		if(catRight.movex > 0)
		{
			sprite_handler->Draw(
				catright_image,
				&catSrc,
				NULL,
				&position3,
				D3DCOLOR_XRGB(255,255,255));
		}

		else if(catRight.movex < 0)
		{
			sprite_handler->Draw(
			catleft_image,
			&catSrc,
			NULL,
			&position3,
			D3DCOLOR_XRGB(255,255,255));
		}
		

		//stop drawing
		sprite_handler->End();

		//stop rendering
		d3ddev->EndScene();
	}

	//display the back buffer on the screen
	d3ddev->Present(NULL, NULL, NULL, NULL);

	//check for escape key (to exit program)
	if (KEY_DOWN(VK_ESCAPE))
		PostMessage(hwnd, WM_DESTROY, 0, 0);

}

//frees memory and cleans up before the game ends
void Game_End(HWND hwnd)
{
	if(cavemanright_image != NULL)
		cavemanright_image->Release();
	if(cavemanleft_image != NULL)
		cavemanleft_image->Release();
	if(catright_image != NULL)
		catright_image->Release();
	if(catleft_image != NULL)
		catleft_image->Release();

	if(back != NULL)
	back->Release();

	if(sprite_handler != NULL)
		sprite_handler->Release();
}
Attached Files
File Type: zip Anim_Sprite.zip (140.8 KB, 19 views)
Climbing the learning curve of C++
Becoming an expert seems light years away!
AddThis Social Bookmark Button
Reply With Quote  
Reply

Only community members can participate in forum threads. You must register or log in to contribute.

DaniWeb Game Development Marketplace
Currently Active Users Viewing This Thread: 1 (0 members and 1 guests)

 

Thread Tools Display Modes

Similar Threads
Other Threads in the Game Development Forum

All times are GMT -4. The time now is 5:11 pm.
Forum system based on vBulletin Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
©2003 - 2008 DaniWeb® LLC