DaniWeb IT Discussion Community

DaniWeb IT Discussion Community (http://www.daniweb.com/forums/index.php)
-   Game Development (http://www.daniweb.com/forums/forum71.html)
-   -   Directx9 bitmap movement problem. (http://www.daniweb.com/forums/thread197130.html)

Pikachumanson Jun 11th, 2009 2:54 pm
Directx9 bitmap movement problem.
 
ok I am almost done doing what I need to do and that is getting a portion of a bitmap to appear on the screen and have it move around using directional controls. My problem is that while I get the the bitmap move it leaves the original behind and a new one appears in the direction I pressed. Then when I take my finger off the button it returns to the middle.

So basically I want to make the bitmap that was in the previous position disappear and have the bitmap stay in the position I put it in so I can move it around like if I was playing zelda. The bitmap problem is the problem I really want to solve.

Here is my Game_Run function where all the magic happens
Let me know if you need the whole program..

void Game_Run(HWND hwnd)
{
 

HRESULT result;       
RECT rect2;
rect2.left = 164;
rect2.top = 0;
rect2.right = 320;
rect2.bottom = 160;
//load surface from file
result = D3DXLoadSurfaceFromFile(
surface, //destination surface
NULL, //destination palette
NULL, //destination rectangle
"spheres.bmp", //source filename
&rect2, //source rectangle
D3DX_DEFAULT, //controls how image is filtered
0, //for transparency (0 for none)
NULL); //source image info (usually NULL)
//return okay
if(d3ddev == NULL)
return;

//start rendering
if (d3ddev ->BeginScene())
{
 
 if (KEY_DOWN(VK_DOWN))
    {
      d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0);
      rect2.top = rect2.top + 10;
      rect2.bottom = rect2.bottom + 10;
     
 
      if (rect2.bottom > SCREEN_HEIGHT)
      {
      rect2.top = rect2.top - 10;
      rect2.bottom = rect2.bottom - 10;
      }
      }

      if(KEY_DOWN(VK_UP))
      {
      d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0);
      rect2.top = rect2.top - 10;
      rect2.bottom = rect2.bottom - 10;
 
      if (rect2.top == 0)
      {
      rect2.top = rect2.top + 10;
      rect2.bottom = rect2.bottom + 10;

      }
      }
 
      if(KEY_DOWN(VK_RIGHT))
    {
      d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0);
      rect2.left = rect2.left + 10;
      rect2.right = rect2.right + 10;
 
      if(rect2.right > SCREEN_WIDTH)
      {
      rect2.right = rect2.right - 10;
      rect2.left = rect2.left - 10;
      }
      }
 
      if(KEY_DOWN(VK_LEFT))
 
      {
 
      d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0);
      rect2.left = rect2.left - 10;
      rect2.right = rect2.right - 10;
     
 
      if(rect2.left == 0)
      {
      rect2.left = rect2.left + 10;
      rect2.right = rect2.right + 10;
      }
      }


//draw surface to the back buffer
        d3ddev ->StretchRect(surface, NULL, backbuffer, &rect2, D3DTEXF_NONE);
//create pointer to the back buffer
        d3ddev ->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &backbuffer);

 
 
//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);
}

MattEvans Jun 12th, 2009 4:45 am
Re: Directx9 bitmap movement problem.
 
You call this function multiple times right? Via a timer callback or in a while loop with a sleep?

If so, you're not keeping the rect2 variable around: every time this function gets called the variable is reset to it's initial value, and then any changes you make are lost when the function exits.

Not sure why the image appears duplicated. That sounds like you're not clearing the draw buffer properly... I don't have much recent experience with DirectX though, so can't help you much there.

Pikachumanson Jun 18th, 2009 1:57 pm
Re: Directx9 bitmap movement problem.
 
The problem was I took out the first RECT function. So when I put it back in I didn't have that problem anymore. Anyway I got the program fixed. I needed to use static ints to make the sphere move around the smoothly instead of just appearing in another spot like in my original program.


All times are GMT -4. The time now is 7:46 am.

Forum system based on vBulletin Copyright ©2000 - 2009, Jelsoft Enterprises Ltd.
©2003 - 2009 DaniWeb® LLC