游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2373|回复: 2

用d3dSprite做2d的小游戏,怎么最简单的精灵移动一抖一抖

[复制链接]

12

主题

50

帖子

70

积分

注册会员

Rank: 2

积分
70
发表于 2005-7-31 00:18:00 | 显示全部楼层 |阅读模式
只是画移动的小方块,小方块的位置根据当前时间减去初始的时间得出。
主循环:
BeginTime=GetTickCount();
while(1)
{
        if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
        }
        else
        {       
                         Render();
        }
}
Rander()里面就是用GetTickCount()-BeginTime,得出了位置结果再画。。
可是每次的位移不稳定,也就是说小方块不是匀速的。。
打印出每次的移动量:
7.5
0
0
16
7.5
8
8
7.5
8
7.5
8
8
7.5
8
8
7.5
15.5
0
8
7.5
8
8
7.5
8
7.5
8
15.5
0
8
8
7.5
8
15.5
8
7.5
8
8
7.5
8
7.5
8
8
7.5
8
8
7.5
15.5
8
8
7.5
8
8
7.5
8
7.5
8
8
7.5
8
8

有的是0(?),有的是2倍。小方块就是一抖一抖的。
请问是怎么回事?如何解决?


各项设置如下。。全是抄来的,不知有没有问题?

pD3D = Direct3DCreate9(D3D_SDK_VERSION);//创建D3D对象,D3D_SDK_VERSION为在d3d9.h中定义的版本号
        pD3D -> GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddm); //得到当前的显示模式
        ZeroMemory(&d3dpp, sizeof(d3dpp)); //清空d3dpp,准备填充内容

       
       
                d3dpp.Windowed=FALSE;
                d3dpp.hDeviceWindow=hwnd; //窗口句柄
                d3dpp.SwapEffect=D3DSWAPEFFECT_FLIP; //设定换页效果为翻页
                d3dpp.BackBufferCount=2; //有2个后台缓存
                d3dpp.BackBufferWidth=1024; //屏幕宽为800像素
                d3dpp.BackBufferHeight=768; //屏幕长为600像素
                d3dpp.FullScreen_RefreshRateInHz=D3DPRESENT_RATE_DEFAULT; //使用当前设定的此显示模式下的刷新率
                d3dpp.PresentationInterval=D3DPRESENT_INTERVAL_IMMEDIATE;//立即显示刷新后的图像


        d3dpp.BackBufferFormat=d3ddm.Format; //色彩深度为桌面的色彩深度
        d3dpp.EnableAutoDepthStencil=TRUE; //开启自动深度缓存,即自动按正确的遮盖关系显示图像
        d3dpp.AutoDepthStencilFormat=D3DFMT_D16; //16位自动深度缓存

        //创建D3D设备
        pD3D->CreateDevice( D3DADAPTER_DEFAULT, //使用主显示设备
                                                D3DDEVTYPE_HAL, //使用3D硬件,若为D3DDEVTYPE_REF则只使用CPU
                                                hwnd, //窗口句柄
//下面的参数若为D3DCREATE_HARDWARE_VERTEXPROCESSING则使用硬件T&L
                        D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                        &d3dpp, //上面填充的D3D图像显示方法
                        &pDev ); //要创建的D3D设备

        pDev->SetRenderState( D3DRS_LIGHTING, FALSE );
        pDev->SetRenderState( D3DRS_SHADEMODE,  D3DSHADE_GOURAUD);//设置渲染状态
        pDev->SetRenderState( D3DRS_AMBIENT, 0xffffffff );
        pDev->SetRenderState(D3DRS_AMBIENT, D3DCOLOR_XRGB(32, 32, 32));
        pDev->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );



        pDev->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);


        D3DXCreateTextureFromFileEx(pDev, "back.jpg", 1024, 768 , 1, D3DPOOL_DEFAULT,
        D3DFMT_UNKNOWN, D3DPOOL_DEFAULT, D3DX_FILTER_NONE,
        D3DX_FILTER_NONE,D3DCOLOR_XRGB(0,255,0) , NULL, NULL, &BackTex);

        D3DXCreateTextureFromFileEx(pDev, "Note.bmp", 45, 765, 1, D3DPOOL_DEFAULT,
        D3DFMT_UNKNOWN, D3DPOOL_DEFAULT, D3DX_FILTER_NONE,
        D3DX_FILTER_NONE,D3DCOLOR_XRGB(0,255,0) , NULL, NULL, &NoteTex);

        D3DXCreateSprite(pDev,&lanSpr);
[em24]

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
发表于 2005-7-31 11:29:00 | 显示全部楼层

Re:用d3dSprite做2d的小游戏,怎么最简单的精灵移动一抖一

与d3d没关,因为每次渲染的速度不同,所以得到的时间也不同,你的动画方式应该改一下

12

主题

50

帖子

70

积分

注册会员

Rank: 2

积分
70
 楼主| 发表于 2005-7-31 14:23:00 | 显示全部楼层

Re:用d3dSprite做2d的小游戏,怎么最简单的精灵移动一抖一

因为动画对时间的准确性要求很高才这样的。我调整了显示器的刷新率,发现会有一些变化,60hz的时候偶尔会抖。85的时候抖的厉害了很多。若打开显卡的垂直同步则也会好一些。所以怀疑是不是有的设置不对

如果不这样做 那我该如何呢?让它每次渲染移动固定的距离?我原以为每次渲染的时间应该一样呢:)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-26 15:01

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表