0

我被卡住了,太烦人了...我有发送鼠标坐标的 Windows 消息,并且我有一个可以看到这些坐标的游戏循环,但是当我调用一个查看鼠标坐标的类时,它看不到鼠标坐标,它只是创建自己的鼠标版本,而不管我定义 global.h 并在使用它的 .cpp 文件上引用 extern :

鼠标.h

#pragma once

class Mouse
{
public:
    int x;
    int y;
    void MouseMove( int x, int y );
    Mouse();
};

全球.h

#include "Mouse.h"

static Mouse mouse;

Game.cpp //代码片段//

Game::Game( HWND hWnd, Mouse &mouse  )
    :
    gfx( hWnd ),
    mouse( mouse )
{
...
if( scenes[ a ]->interactiveObjects[ b ]->CheckCollision( mouse.x, mouse.y ) )
{
.... // Game is looping if no messages stored, the windows loop updates my mouse coordinates by calling a routine in my Mouse.cpp. My windows loop sends the mouse through as a parameter to my game object which I no longer want to use... I want to use my global mouse as the mouse reference.

“InteractiveObject.cpp”它包含“Global.h”并引用其中声明的鼠标......对吗?那么为什么我的检查碰撞没有看到mouse.x和mouse.y(我必须从我的游戏对象中传递坐标作为参数mouseX和mouseY :(

#include "Global.h"
extern Mouse mouse;

#include "InteractiveObject.h"


InteractiveObject::InteractiveObject(  int id_, string title_, Image* theImage_, int type_, int x_, int y_, int z_ )
    : 
    id( id_ ),
    title( title_ ),
    theImage( theImage_ ),
    type( type_ ),
    x( x_ ),
    y( y_ ),
    z( z_ )
{
    pos.x = x_;
    pos.y = y_;
    pos.z = z_;
}

bool InteractiveObject::CheckCollision( int mouseX, int mouseY )
{
    if( 
        mouse.x > x &&
        mouse.x < x + theImage->width &&
        mouse.y > y &&
        mouse.y < y + theImage->height
    )   
    /*if( 
        mouseX > x &&
        mouseX < x + theImage->width &&
        mouseY > y &&
        mouseY < y + theImage->height
    )*/
    {
        return TRUE;
    }

    return FALSE;
}
4

3 回答 3

2

您的 global.h 正在扩展到您包含它的每个文件中。因此,您包含它的每个文件都有一个全局的静态(仅表示此文件)实例化。尝试使用单例模式或将变量声明为 extern标头,然后在 mouse.cpp 中一次

于 2013-04-01T23:32:11.657 回答
1

我不是单身的粉丝,但为了暂时控制你的虫子......

使它成为一个单例

class Mouse
{
public:
    int x;
    int y;
    void MouseMove( int x, int y );
    static Mouse & get_mouse()
    {
        static Mouse m;
        return m;
    }
private:
    // Inaccessible outside of Mouse!
    Mouse();
    Mouse( const Mouse & );
};

现在您的代码将需要调用Mouse::get_mouse()以获取唯一的Mouse.

您现在可以放心,Mouse不会在任何地方意外创建额外的实例。如果发生这种情况,您的编译器会阻止您。

于 2013-04-01T23:26:53.950 回答
1

在你的 global.h 标题中,你应该有

extern Mouse mouse;

在实现文件的文件范围内的代码中的一个位置(并且仅一个位置),您应该有下面的行。InteractiveObject.cpp 可以正常工作。

Mouse mouse;

通过这种方式,global.h 向任何包含它的文件单元保证在某处存在 Mouse 类型的鼠标变量。“鼠标鼠标”行实际上分配了该实例。

这样做有架构上的影响,但它会起作用。按照您的方式,任何包含 global.h 的实现文件都会创建它自己的本地“鼠标”实例,该实例与任何其他实例不同。虽然 extern Mouse... 行向链接器承诺“鼠标”存在于全局范围内。

于 2013-04-01T23:31:21.347 回答