Hello !
I'm trying to rotate a sprite on himself when the user presses keys like q or d. The sprite rotates but the rotation is very odd.
I'm using D3DXMatrixTransformation2D() function. If I don't specify any rotation center, the sprite rotates around the left-top corner (0, 0). If I specify the rotation center like this:
m_RotationCenter.x = (m_Sprite->GetPosition().x - (32/2));
m_RotationCenter.y = (m_Sprite->GetPosition().y - (32/2));
The rotation is odd and doesn't work.
I think I'm giving a wrong rotation center to the function. Help me please
Player.h
#pragma once
#include "inc.h"
#include "Sprite.h"
struct ANIM
{
string name;
RECT rect;
ANIM(string name, RECT rect)
{
this->name = name;
this->rect = rect;
}
};
class Player
{
private:
Sprite *m_Sprite;
vector<ANIM *> m_Anims;
ANIM *m_CurrentAnim;
LPD3DXSPRITE m_SpriteObject;
D3DXVECTOR2 m_RotationCenter;
D3DXMATRIX m_RotationMatrix;
int m_RotationAngle;
public:
Player();
~Player();
void Draw();
Sprite *GetSprite();
void SetRotation(int alpha);
};
Player.cpp
#include "Player.h"
Player::Player()
{
m_Sprite = new Sprite(GlobalVars::GetInstance()->GetGVarValue<string>("ms_matsprite"));
for (int i = 0; i < GlobalVars::GetInstance()->GetGVarValue<int>("ms_p_anim_number"); i++)
{
static ostringstream oss;
RECT rect;
oss.str("");
oss << "ms_p_" << i << "_name";
string name = GlobalVars::GetInstance()->GetGVarValue<string>(oss.str());
oss.str("");
oss << "ms_p_" << i << "_x";
int x = GlobalVars::GetInstance()->GetGVarValue<int>(oss.str());
oss.str("");
oss << "ms_p_" << i << "_y";
int y = GlobalVars::GetInstance()->GetGVarValue<int>(oss.str());
oss.str("");
oss << "ms_p_" << i << "_w";
int w = GlobalVars::GetInstance()->GetGVarValue<int>(oss.str());
oss.str("");
oss << "ms_p_" << i << "_h";
int h = GlobalVars::GetInstance()->GetGVarValue<int>(oss.str());
SetRect(&rect, x, y, w, h);
if (name == "IDLE")
{
m_CurrentAnim = new ANIM(name, rect);
}
m_Anims.push_back(new ANIM(name, rect));
}
m_RotationAngle = 0;
if (FAILED(D3DXCreateSprite(D3DManagement::GetInstance()->GetDevice(), &m_SpriteObject)))
{
MSG_ERROR("Can't create sprite");
}
m_RotationCenter.x = (m_Sprite->GetPosition().x - (32/2));
m_RotationCenter.y = (m_Sprite->GetPosition().y - (32/2));
D3DXMatrixTransformation2D(&m_RotationMatrix, NULL, 0, NULL, &m_RotationCenter, D3DXToRadian(m_RotationAngle), NULL);
}
Player::~Player()
{
delete m_Sprite;
for (int i = 0; i < m_Anims.size(); i++)
{
delete m_Anims;
m_Anims.erase(m_Anims.begin()+i);
}
delete m_CurrentAnim;
D3DSAFE_RELEASE(m_SpriteObject);
}
void Player::Draw()
{
if (FAILED(m_SpriteObject->Begin(D3DXSPRITE_ALPHABLEND)))
{
MSG_ERROR("Can't begin draw");
}
m_SpriteObject->SetTransform(&m_RotationMatrix);
m_Sprite->Draw(&m_Sprite->GetPosition(), &m_CurrentAnim->rect, m_SpriteObject);
if (FAILED(m_SpriteObject->End()))
{
MSG_ERROR("Can't end draw");
}
}
Sprite *Player::GetSprite()
{
return m_Sprite;
}
void Player::SetRotation(int alpha)
{
m_RotationAngle += alpha;
if (m_RotationAngle >= 360)
{
m_RotationAngle = 0;
}
m_RotationCenter.x = (m_Sprite->GetPosition().x - (32/2));
m_RotationCenter.y = (m_Sprite->GetPosition().y - (32/2));
D3DXMatrixTransformation2D(&m_RotationMatrix, NULL, 0, NULL, &m_RotationCenter, D3DXToRadian(m_RotationAngle), NULL);
}
Thanks in advance
[Edited by - Kr00pS on November 10, 2007 1:48:19 PM]