D3D中如何实现2D游戏角色在游戏中的移动

nabasasun 2013-10-10 08:39:35
我只会贴纹理图片,不会移动,好像没有发现坐标操作的东西

你们是怎么改变图片位置的和显示位置的。


g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX );
g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,2);

//不如GDI等直观,人家是有贴图片在哪个位置这样的显示方式的这几行都是从0,0 位置开始贴。
如果我要显示在下面,显示在右面,有办法吗?D3D 顶点坐标缓冲


游戏中想制造很多飞碟在屏幕中乱飞,但是看来是做不到了。
我现在是用顶点的方式实现2D,不要又叫我用回 D3DXSPRITE
...全文
426 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
彩阳 2013-10-21
  • 打赏
  • 举报
回复
引用 12 楼 nabasasun 的回复:
[quote=引用 11 楼 jiangcaiyang123 的回复:] 灵活顶点格式设置为D3DFVF_XYZRHW,顶点的深度设为0,坐标系就是屏幕坐标系了,可以通过修改x和y的值来改变图片的位置。
胡扯,根本就不行,改变不了坐标[/quote] 没见你这样的,我都用在二维动画里面了,可以看看我写的博客。你做不到不代表大家做不到,不过看样子你自己好好研究才是王道。
nabasasun 2013-10-21
  • 打赏
  • 举报
回复
引用 11 楼 jiangcaiyang123 的回复:
灵活顶点格式设置为D3DFVF_XYZRHW,顶点的深度设为0,坐标系就是屏幕坐标系了,可以通过修改x和y的值来改变图片的位置。
胡扯,根本就不行,改变不了坐标
nabasasun 2013-10-19
  • 打赏
  • 举报
回复
引用 7 楼 Starmean 的回复:
[quote=引用 6 楼 nabasasun 的回复:] [quote=引用 5 楼 Starmean 的回复:] //然后设置为世界矩阵 g_pd3dDevice->SetTransform(D3DTS_WORLD, &matrix); [/code]
这行代码,,,,,, 可我用的是2D的正交投影矩阵啊[/quote] 有效的,难道楼主自己没有亲自试试? 只有使用RHW实现2D效果的无效,那个需要自己进行矩阵相乘 正交投影下,世界矩阵依然有效


//使用正交投影,width为窗口宽度,height为窗口高度
D3DXMATRIXA16 matProj;
D3DXMatrixOrthoOffCenterLH( &matProj, 0.0f, width, height, 0.0f, 0.0f, 1000.0f );
g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );


//创建平移变化矩阵
D3DXMATRIX matrix;
static int x = 0;
++x;
 
//给矩阵赋平移值,x,y,z代表在各自轴上的平移量
D3DXMatrixTranslation(&matrix, (float)x, 0.0f, 0.0f);
 
//然后设置为世界矩阵
g_pd3dDevice->SetTransform(D3DTS_WORLD, &matrix);
 
//绘制它
g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX );
g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,2); 


楼主将会看到你要绘制的不断的进行平移,每次水平平移一个像素点 [/quote] 我用的就是RHW效果的
彩阳 2013-10-19
  • 打赏
  • 举报
回复
灵活顶点格式设置为D3DFVF_XYZRHW,顶点的深度设为0,坐标系就是屏幕坐标系了,可以通过修改x和y的值来改变图片的位置。
nabasasun 2013-10-19
  • 打赏
  • 举报
回复
引用 9 楼 Starmean 的回复:
[quote=引用 8 楼 nabasasun 的回复:] 我用的就是RHW效果的
唉!RHW与正交投影矩阵完全无关,何来的使用正交投影矩阵? D3D中绘制2D的方法有多种,各自有不同的用途,其中RHW最大用途就是屏蔽掉一切矩阵转换和光照计算,包括平移、正交等一切矩阵,直接上屏。使用RHW时,不需要设置任何世界矩阵、投影矩阵和相机,设置了也没用。你现在却要进行平移转换,是对RHW的功能进行破坏。如果需要进行平移,建议你使用正交投影。 不过,如果你一定要使用RHW的话,也可以,就是使用灵活顶点,每次渲染时,自己在代码中亲自动手将转换矩阵与每个坐标进行相乘,也就是自己手动实现世界矩阵的转换工作,然后再渲染。不过这样复杂度会大量提高,也破坏了RHW。 [/quote] 我哪知道,我对D3D是新手,以前都是搞DRAW。和GDI 、GDI+ 、 CIMAGE 的 而且做游戏又不是搞画板,肯定要动的,所以那个所谓的固定再固定完全是没有必要。我不需要一定使用RHW,我是想让主人公动起来,和RPG里的一样。 不过我试过去掉RHW 只用XYZ 后,发现屏幕全黑,以前的纹理全消失了,只有文字可以显示,退出程序后,发现FONT 这个在释放的代码部分会出错(中断)。
Starmean 2013-10-19
  • 打赏
  • 举报
回复
引用 8 楼 nabasasun 的回复:
我用的就是RHW效果的
唉!RHW与正交投影矩阵完全无关,何来的使用正交投影矩阵? D3D中绘制2D的方法有多种,各自有不同的用途,其中RHW最大用途就是屏蔽掉一切矩阵转换和光照计算,包括平移、正交等一切矩阵,直接上屏。使用RHW时,不需要设置任何世界矩阵、投影矩阵和相机,设置了也没用。你现在却要进行平移转换,是对RHW的功能进行破坏。如果需要进行平移,建议你使用正交投影。 不过,如果你一定要使用RHW的话,也可以,就是使用灵活顶点,每次渲染时,自己在代码中亲自动手将转换矩阵与每个坐标进行相乘,也就是自己手动实现世界矩阵的转换工作,然后再渲染。不过这样复杂度会大量提高,也破坏了RHW。
Starmean 2013-10-18
  • 打赏
  • 举报
回复
引用 6 楼 nabasasun 的回复:
[quote=引用 5 楼 Starmean 的回复:] //然后设置为世界矩阵 g_pd3dDevice->SetTransform(D3DTS_WORLD, &matrix); [/code]
这行代码,,,,,, 可我用的是2D的正交投影矩阵啊[/quote] 有效的,难道楼主自己没有亲自试试? 只有使用RHW实现2D效果的无效,那个需要自己进行矩阵相乘 正交投影下,世界矩阵依然有效


//使用正交投影,width为窗口宽度,height为窗口高度
D3DXMATRIXA16 matProj;
D3DXMatrixOrthoOffCenterLH( &matProj, 0.0f, width, height, 0.0f, 0.0f, 1000.0f );
g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );


//创建平移变化矩阵
D3DXMATRIX matrix;
static int x = 0;
++x;
 
//给矩阵赋平移值,x,y,z代表在各自轴上的平移量
D3DXMatrixTranslation(&matrix, (float)x, 0.0f, 0.0f);
 
//然后设置为世界矩阵
g_pd3dDevice->SetTransform(D3DTS_WORLD, &matrix);
 
//绘制它
g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX );
g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,2); 


楼主将会看到你要绘制的不断的进行平移,每次水平平移一个像素点
nabasasun 2013-10-18
  • 打赏
  • 举报
回复
引用 5 楼 Starmean 的回复:
//然后设置为世界矩阵 g_pd3dDevice->SetTransform(D3DTS_WORLD, &matrix); [/code]
这行代码,,,,,, 可我用的是2D的正交投影矩阵啊
Starmean 2013-10-17
  • 打赏
  • 举报
回复
上面方法不能动是肯定的,动了才见鬼了 给每个对象,如飞碟配上一个变化矩阵,比如取名matrix

//创建平移变化矩阵
D3DXMATRIX matrix;

//给矩阵赋平移值,x,y,z代表在各自轴上的平移量
D3DXMatrixTranslation(&matrix, x, y, z);

//然后设置为世界矩阵
g_pd3dDevice->SetTransform(D3DTS_WORLD, &matrix);

//绘制它
g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX );
g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,2); 



Starmean 2013-10-17
  • 打赏
  • 举报
回复
上面方法不能动是肯定的,动了才见鬼了 给每个对象,如飞碟配上一个变化矩阵,比如取名matrix

D3DXMATRIX matrix;  //变化矩阵
D3DXMatrixTranslation(
D3DXMATRIX * pOut,
FLOAT x,
FLOAT y,
FLOAT z
);
nabasasun 2013-10-14
  • 打赏
  • 举报
回复
引用 1 楼 u011779875 的回复:
D3DXVECTOR3 vCenter( 0.0f, 0.0f, 4.0f ); D3DXVECTOR3 vStaticPosition((float)m_nScreenX, (float)m_nScreenY, 4.0f ); 设置图片显示的位置 通过鼠标左右移动相对改变渲染的位置 就可以 实现图片的移动了
试过,完全不能动
做或不做 2013-10-11
  • 打赏
  • 举报
回复
D3DXVECTOR3 vCenter( 0.0f, 0.0f, 4.0f ); D3DXVECTOR3 vStaticPosition((float)m_nScreenX, (float)m_nScreenY, 4.0f ); 设置图片显示的位置 通过鼠标左右移动相对改变渲染的位置 就可以 实现图片的移动了

8,303

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧