游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3126|回复: 10

以前的问题,至今还没解决otz||

[复制链接]

53

主题

241

帖子

252

积分

中级会员

Rank: 3Rank: 3

积分
252
发表于 2005-9-12 21:00:00 | 显示全部楼层 |阅读模式
Reset时出现“自动化错误”提示怎样解决?

那里错了?

140

主题

1228

帖子

1233

积分

金牌会员

Rank: 6Rank: 6

积分
1233
QQ
发表于 2005-9-13 12:40:00 | 显示全部楼层

Re:以前的问题,至今还没解决otz||

不使用变体变量会好很多!

53

主题

241

帖子

252

积分

中级会员

Rank: 3Rank: 3

积分
252
 楼主| 发表于 2005-9-13 20:37:00 | 显示全部楼层

Re: Re:以前的问题,至今还没解决otz||

lights: Re:以前的问题,至今还没解决otz||

不使用变体变量会好很多!


不明白你的意思

Direct3DDevice8.Reset 只有唯一的一个D3DPRESENT_PARAMETERS类型参数,跟变体变量有什么关系?

140

主题

1228

帖子

1233

积分

金牌会员

Rank: 6Rank: 6

积分
1233
QQ
发表于 2005-9-15 14:31:00 | 显示全部楼层

Re:以前的问题,至今还没解决otz||

我理解错了,原来是d3d的reset!你可以把代码贴出来看看么?

53

主题

241

帖子

252

积分

中级会员

Rank: 3Rank: 3

积分
252
 楼主| 发表于 2005-9-15 17:43:00 | 显示全部楼层

Re:以前的问题,至今还没解决otz||

'==================================================================================================
'        所有DX组件的创建和初始化类
'==================================================================================================

Option Explicit

'用户设定以下属性用以初始化图形对象
Public AdapterIndex As Byte '一般不会有超过256个适配器吧 - -U
Public DeviceType As CONST_D3DDEVTYPE
Public WindowWidth As Long
Public WindowHeight As Long
Public WindowBit As CONST_D3DFORMAT     'winBit     色深度
                                 '           D3DFMT_R8G8B8                                    '           D3DFMT_X8R8G8B8 - 32 位色
                                 '           D3DFMT_A8R8G8B8 /
                                 '           D3DFMT_R5G6B5     16 位色

'以下对象属性为测试用,以后可能要注释掉!
'Public Device As Direct3DDevice8

'***************************************************************************************
'    创建并初始化图像和声音对象程序 createDxMedia()  返回布尔值说明初始化成功
'
'                         setup      用户设定类型
'                         FhWnd      窗口句柄
'                                    Window.hWnd
'                         numBuffer  缓冲区数量
'                                    0 to 3
'                                    参考D3DSWAPEFFECT常量
'
'    清除程序 cleanupDxMedia() 返回布尔值说明清除成功
'

Public Function createDxMedia(Dx8 As DirectX8, D3DDevice As Direct3DDevice8, FhWnd As Long, Optional numBuffer As Byte = 1) As Boolean
    Set WDDX = Dx8
    Set WDD3DX = New D3DX8
   
    If WDDX Is Nothing Or WDD3DX Is Nothing Then
        createDxMedia = False
        Exit Function
    End If
   
    On Error Resume Next
   
    '****************************************************************
    '    图形公共组件
   
    Set WDD3D = WDDX.Direct3DCreate()
    WDD3D.GetAdapterDisplayMode D3DADAPTER_DEFAULT, WDDispMode
    '游戏中只使用全屏模式
    WDWindow.BackBufferWidth = WindowWidth
    WDWindow.BackBufferHeight = WindowHeight
    WDWindow.BackBufferFormat = WindowBit
    WDWindow.BackBufferCount = numBuffer
    WDWindow.hDeviceWindow = FhWnd
   
    '以下三个成员需要再查证
    WDWindow.SwapEffect = D3DSWAPEFFECT_FLIP '刷新效果,当设置为D3DSWAPEFFECT_COPY_VSYNC时
                                             '说明只有一个后缓冲区,并执行COPY操作
    WDWindow.EnableAutoDepthStencil = 1 '打开深度缓冲
    WDWindow.AutoDepthStencilFormat = D3DFMT_D16 '深度缓冲格式
   
    'CreateDevice 方法的第四个参数值为
    'D3DCREATE_SOFTWARE_VERTEXPROCESSING(规定为软件[顶]进程)
    Set WDD3DDevice = WDD3D.CreateDevice(AdapterIndex, DeviceType, FhWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, WDWindow)
   
    Set D3DDevice = WDD3DDevice '测试用,公开一个Device接口*******
   
    '一定要开深度缓冲!快成倍!!!
    WDD3DDevice.SetRenderState D3DRS_ZENABLE, True
   
    '****************************************************************
    '    2D组件
   
    '考虑set一个文本操作类
   
    Set WDSprite = WDD3DX.createSprite(WDD3DDevice)
   
    '游戏中不使用系统指针
    '但在测试时最好注释它
    'hideCursor
   
    '****************************************************************
    '    检测并返回
    '    有一个(使用Or)对象创建失败就返回False
    If WDD3D Is Nothing Or WDD3DDevice Is Nothing Then
        createDxMedia = False
    Else
        createDxMedia = True
    End If
End Function

'以上是入口的一部分

53

主题

241

帖子

252

积分

中级会员

Rank: 3Rank: 3

积分
252
 楼主| 发表于 2005-9-15 17:44:00 | 显示全部楼层

Re:以前的问题,至今还没解决otz||

'==================================================================================================
'        图像和声音模块
'==================================================================================================

Option Explicit

Public WDD3DX As D3DX8
Public WDD3D As Direct3D8

Public WDD3DDevice As Direct3DDevice8
Public WDWindow As D3DPRESENT_PARAMETERS '显示窗口元素
Public WDDispMode As D3DDISPLAYMODE '通过GetAdapterDisplayMode方法查询某适配器的显示模式

Public WDSprite As D3DXSprite

'以上是引擎中模块的一部分

53

主题

241

帖子

252

积分

中级会员

Rank: 3Rank: 3

积分
252
 楼主| 发表于 2005-9-15 17:48:00 | 显示全部楼层

Re:以前的问题,至今还没解决otz||

Dim dx As New DirectX8
Dim D3DDev As Direct3DDevice8
Dim D3DX As New D3DX8 '//A helper library
Dim w_main As New WDMain8
Dim w_Running As Boolean

Dim texture As Direct3DTexture8

Const FVF_TLVERTEX = (D3DFVF_XYZRHW Or D3DFVF_TEX1 Or D3DFVF_DIFFUSE Or D3DFVF_SPECULAR)
Const FVF_LVERTEX = (D3DFVF_XYZ Or D3DFVF_DIFFUSE Or D3DFVF_SPECULAR Or D3DFVF_TEX1)
Const FVF_VERTEX = (D3DFVF_XYZ Or D3DFVF_NORMAL Or D3DFVF_TEX1)


'Dim testSprite As D3DXSprite '*
Dim w_2DTexture As New WDTexture8
Dim w_sprite As New WDSpriteBox
'Dim spriteREC As RECT

Dim w_text As New WDText8
Dim FpsFont As WDFPSChicker

Dim w_Rendering As New WDRender8
Dim XXWindow As D3DPRESENT_PARAMETERS


Private Sub Form_DblClick()
    w_Running = False
End Sub

Private Sub Form_Load()
    Me.Show
    'If Form1.hWnd <> dx.isRunning(Form1.Caption) Then  '不允许多个进程
    '    Set dx = Nothing
    '    End
    'End If
   
    'ReDim w_FontCSS(0)
    'w_FontCSS.Name = "Verdana"
    'w_FontCSS.SIZE = 9

   
   
    w_main.AdapterIndex = 0
    w_main.DeviceType = D3DDEVTYPE_HAL
    w_main.WindowWidth = 1280
    w_main.WindowHeight = 960
    w_main.WindowBit = D3DFMT_X8R8G8B8
    'w_main.WindowBit = D3DFMT_R5G6B5
   
    'On Error Resume Next
    w_Running = w_main.createDxMedia(dx, D3DDev, Form1.hWnd)
   
    uploadSomething
            
   
    Do While w_Running
        FpsFont.AccountBook.DynamicText(0) = FpsFont.FramesCount
        
        Render '//渲染
        DoEvents '//释放线程loop...
    Loop
   
    Unload Me
    End

End Sub

Private Sub Form_Unload(Cancel As Integer)
    Set dx = Nothing
End Sub

Public Sub Render()
        
    Dim hr As Long
    hr = D3DDev.TestCooperativeLevel
    If hr = D3DERR_DEVICENOTRESET Then
        XXWindow.BackBufferWidth = w_main.WindowWidth
        XXWindow.BackBufferHeight = w_main.WindowHeight
        XXWindow.BackBufferFormat = w_main.WindowBit
        XXWindow.BackBufferCount = 1
        XXWindow.hDeviceWindow = Form1.hWnd
        XXWindow.SwapEffect = D3DSWAPEFFECT_FLIP
        XXWindow.EnableAutoDepthStencil = 1
        XXWindow.AutoDepthStencilFormat = D3DFMT_D16

        'On Error Resume Next
        D3DDev.Reset XXWindow
        DoEvents
        'uploadSomething
    End If
   
   
   
    'dont bother rendering if we are not ready yet
    If hr <> 0 Then Exit Sub

   
    w_Rendering.beginRender
        'dx.Device.SetVertexShader FVF_TLVERTEX
        
        

        w_Rendering.DrawText FpsFont.AccountBook
        w_Rendering.drawSprite w_sprite
        
        
    w_Rendering.endRender
   
    w_text.GetFPS FpsFont
End Sub


Sub uploadSomething()
        

    '********************************************************************************
    '下面一大段定义文本的代码 ="=;;
   
    Dim tttt As String
   
    tttt = "wing Dream Engine" & vbCrLf
    tttt = tttt & "  " & w_main.WindowWidth & " × " & w_main.WindowHeight
    If w_main.WindowBit = D3DFMT_R8G8B8 Or w_main.WindowBit = D3DFMT_X8R8G8B8 Or w_main.WindowBit = D3DFMT_A8R8G8B8 Then
        tttt = tttt & "  32Bit" & vbCrLf
    Else
        tttt = tttt & "  16Bit" & vbCrLf
    End If
    tttt = tttt & "  FPS "
   
    Set FpsFont.AccountBook = New WDTextTable 'WDFPSChicker类型要先Set对象
    w_text.createTable FpsFont.AccountBook, , , True, Form1, 100, 100, 10, 10, RGB(255, 255, 0), 255, tttt
        
    FpsFont.AccountBook.takeInDynamicText , Len(tttt)
        
    '定义文本到此结束!
    '********************************************************************************
   
    w_2DTexture.CreateSprite w_sprite, App.Path & "\forest2.bmp", , , , 200, 50
    w_sprite.Zoom = 2
End Sub

'以上是测试用程序的一部分,注意 If hr = D3DERR_DEVICENOTRESET Then 一句后内的代码是后来加上的,实际使用时交由引擎处理

53

主题

241

帖子

252

积分

中级会员

Rank: 3Rank: 3

积分
252
 楼主| 发表于 2005-9-15 17:56:00 | 显示全部楼层

Re:以前的问题,至今还没解决otz||

因为DX8的例子即使注释了重载部分也不会出现这种问题,只是Present时出现错误,所以这里没有加入reset后的重截对象代码,意在先解决reset时的问题

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
发表于 2005-9-15 18:10:00 | 显示全部楼层

Re:以前的问题,至今还没解决otz||

很简单阿,Reset出错,是因为D3DPRESENT_PARAMETERS参数设置不对阿,这个参数设置跟CreateDevice时一样,需要检查你的硬件是否对其支持,不支持当然就出错了

53

主题

241

帖子

252

积分

中级会员

Rank: 3Rank: 3

积分
252
 楼主| 发表于 2005-9-15 19:10:00 | 显示全部楼层

Re:以前的问题,至今还没解决otz||

是一样的啊,我已经检查过reset前D3DPRESENT_PARAMETERS的各个字段的值
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-27 20:10

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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