1

我是 Stack Overflow 的新手,虽然几年来我一直在编写基本和中级 C++ 程序,但我一直无法超越。我最近通过从 www.planetchili.net 获得的框架了解了如何在 DirectX 中工作。我正在尝试为将演示 AI 和寻路的编程类开发类似于 Asteroid 类型游戏的东西。玩家不会炸毁小行星,而是与其他三角船进行狗斗。

该框架带有一个 Game 对象,我通过它完成了大部分工作。但是,我意识到我可能应该为 Ship 编写自己的类,其中包含执行 Ship 相关操作所需的变量,例如绘制船和跟踪位置和得分等统计数据。

但是,我遇到了一个似乎是 Inception 级悖论的问题。该框架使用称为 D3Dgraphics 的东西,它声明并使用称为 gfx 的 D3D 对象。为了使用 Ship 中的 D3D 绘图功能,我包含了 D3D 库并在 Ship.h 中创建了一个 D3D 对象。

我可以在 Game 中声明和实例化 Ship 对象,但是直接在游戏中使用的绘图功能在通过 ship 对象使用时不起作用。我不知道为什么会这样,但我相信这可能是因为我编织了这个令人讨厌的网络。被反对的 Game 使用了一个 D3D 对象,该对象具有一个名为 Go() 的函数,该函数似乎可以绘制和销毁帧,Ship 对象使用 D3D 对象但无法访问 Game 的 Go() 方法,然后 Game 使用 Ship。

这是我的一些代码...请理顺我。

Ship.cpp
    //Ship.cpp
    #include "Ship.h"
    #include <math.h>
    enter code here
    //Constructor
    Ship::Ship(HWND hWnd)
    :   gfx ( hWnd )
    {}
    void Ship::drawLine(int x1, int x2, int y1, int y2){
    //Draws a line using gfx.putPixel- This function works perfectly if declared and used directly in Game.cpp
    }

Ship.h
    //Ship.h
    #pragma once

    #include "D3DGraphics.h"
    #include "Keyboard.h"
    #include <vector>

    class Ship{
    private:
        D3DGraphics gfx;
    public:
        Ship::Ship(HWND hWnd); //Default Constructor
    };




 //Game.h
    #pragma once
    #include "Ship.h"
    #include "D3DGraphics.h"
    #include "Keyboard.h"

    class Game
    {
    public:
        Game( HWND hWnd,const KeyboardServer& kServer );
        void Go();
        //Member functions
    private:
        void ComposeFrame();

    private:
        D3DGraphics gfx;
        KeyboardClient kbd;
        Ship psp;
    };

//Game.cpp
#include "Game.h"
#include <math.h>

Game::Game( HWND hWnd,const KeyboardServer& kServer )
:   gfx ( hWnd ),
    psp(hWnd),
    kbd( kServer )
{}

void Game::Go()
{
    gfx.BeginFrame();
    ComposeFrame();
    gfx.EndFrame();
}

void Game::ComposeFrame()
{
    psp.drawShip();
}
4

1 回答 1

1

D3DGraphics您的Game类正在使用的对象在内存中与该对象不同Ship D3DGraphics。您必须使用指针来确保使用相同的对象进行绘制,将其更改为以下片段:

    class Ship{
        private:
            D3DGraphics *gfx;
        public:
            Ship::Ship(D3DGraphics *pGfx); //Default Constructor
        };

-

//Constructor
        Ship::Ship(D3DGraphics *pGfx)
        {
            gfx = pGfx;    
        }

-

Game::Game( HWND hWnd,const KeyboardServer& kServer )
:   gfx ( hWnd ),
    psp(gfx),
    kbd( kServer )
{}

而不是使用gfx.你现在必须gfx->在你的Ship课堂上使用。IEgfx->PutPixel()而不是gfx.PutPixel().

附带说明一下,尝试将变量名称更改为使用常用匈牙利表示法提供更多信息的名称:http ://en.wikipedia.org/wiki/Hungarian_notation

于 2013-03-27T13:06:33.963 回答