C++ D3D9创建圆
早些时候,我发布了一个不同的问题,该问题给了我一个使用D3DPT_TRIANGLEFAN的bug,但我试图以不同的方式重新编码我的圆。唯一的问题是它不会吸引到屏幕上。。。我试过调试它,但一切似乎都很完美,这很奇怪。 这是我的整个“圆圈”课程(这是一个更大的项目——乒乓球游戏的一部分)C++ D3D9创建圆,c++,geometry,directx-9,vertex-array,drawing2d,C++,Geometry,Directx 9,Vertex Array,Drawing2d,早些时候,我发布了一个不同的问题,该问题给了我一个使用D3DPT_TRIANGLEFAN的bug,但我试图以不同的方式重新编码我的圆。唯一的问题是它不会吸引到屏幕上。。。我试过调试它,但一切似乎都很完美,这很奇怪。 这是我的整个“圆圈”课程(这是一个更大的项目——乒乓球游戏的一部分) 类循环:公共物理对象 { 公众: 圆(浮动x、浮动y、浮动r、D3D颜色列){ xVel=3; yVel=3; xLB=0.0; xRB=800; yUB=600; yLB=0; 这个->r=r; 这个->x=x;
类循环:公共物理对象
{
公众:
圆(浮动x、浮动y、浮动r、D3D颜色列){
xVel=3;
yVel=3;
xLB=0.0;
xRB=800;
yUB=600;
yLB=0;
这个->r=r;
这个->x=x;
这->y=y;
用于(浮动i=0.0f;ileft)
{
如果(x-r+xVelx+20和&y+yVel>patles[i]>y和&y+yVely+80){
xVel*=-1;
}
}否则{
如果(x+r+xVel>桨[i]->x&&y+yVel>桨[i]->y&&y+yVel<桨[i]->y+80){
xVel*=-1;
}
}
}
如果(x+r+10+xVel>xRB | x-r+xVelyUB | | y-r+yVelx+=x;
这->y+=y;
对于(int i=0;i<360;++i)
{
点[i].x+=x;
点[i].y+=y;
}
}
}
void render()
{
更新();
d3ddev->SetTexture(0,0);
d3ddev->SetFVF((D3DFVF_XYZRHW | D3DFVF_DIFFUSE));
d3ddev->SetRenderState(D3DRS_照明,错误);
d3ddev->SetRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
d3ddev->SetRenderState(D3DRS_字母可转换,真);
d3ddev->SetRenderState(D3DRS\u destlend,D3DBLEND\u INVSRCALPHA);
d3ddev->SetRenderState(D3DRS_ZENABLE,D3DZB_FALSE);
d3ddev->SetRenderState(D3DRS_FOGENABLE,false);
d3ddev->DrawPrimitiveUP(D3DPT_TRIANGLEFAN,360,&points,sizeof(360));
}
顶点[360];
私人:
浮子r;
};
提前感谢您的帮助!一个明显的问题是第一个顶点应该是圆的中心。另外,请尝试
设置渲染状态(D3DRS\u CULLMODE,D3DCULL\u NONE)
以防您的缠绕顺序错误。这是唯一明显的问题吗?对不起,我现在对d3d9有点陌生。
class Circle: public physicsObject
{
public:
Circle(float x, float y, float r, D3DCOLOR col){
xVel=3;
yVel=3;
xLB=0.0;
xRB=800;
yUB=600;
yLB=0;
this->r=r;
this->x=x;
this->y=y;
for(float i = 0.0f; i<360.0f; i += 1.0f)
{
float angle = i;
points[(int)i].x = x + (sinD(angle) * r);
points[(int)i].y = y + (cosD(angle) * r);
points[(int)i].z = 0;
points[(int)i].Color = col;
}
}
void update()
{
for(int i = 0; i < paddles.size(); ++i)
{
if(paddles[i]->left)
{
if(x - r + xVel < paddles[i]->x + 20 && y+yVel > paddles[i]->y && y+yVel< paddles[i]->y+80){
xVel *= -1;
}
}else{
if(x + r + xVel > paddles[i]->x && y+yVel > paddles[i]->y && y+yVel< paddles[i]->y+80){
xVel *= -1;
}
}
}
if(x+r+10+xVel>xRB || x-r+xVel < xLB)
{
//MessageBox(0,"AWW SHEEIT","I LOSED",MB_OK);
//ExitProcess(0);
}
if(y+r+30+yVel > yUB || y-r+yVel < yLB)
yVel*=-1;
translate(xVel,yVel);
}
void translate(float x, float y)
{
if(GetAsyncKeyState(VK_SPACE))
{
gamestart = true;
}
if(gamestart){
this->x+=x;
this->y+=y;
for(int i = 0; i < 360; ++i)
{
points[i].x+=x;
points[i].y+=y;
}
}
}
void render()
{
update();
d3ddev->SetTexture(0,0);
d3ddev->SetFVF((D3DFVF_XYZRHW | D3DFVF_DIFFUSE));
d3ddev->SetRenderState( D3DRS_LIGHTING, FALSE);
d3ddev->SetRenderState( D3DRS_CULLMODE, D3DCULL_CCW);
d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
d3ddev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
d3ddev->SetRenderState( D3DRS_ZENABLE, D3DZB_FALSE );
d3ddev->SetRenderState( D3DRS_FOGENABLE, false);
d3ddev->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 360, &points, sizeof(360));
}
Vertex points [360];
private:
float r;
};