C在另一个当前为Object的Class中调用类函数

时间:2013-05-17 10:53:31

标签: c++ class object

新来的,所以要温柔,我正在为我的课程做我的重大项目,我不是要求为我完成的功课,我只是无法解决一个奇怪的问题我是即使在这里,也有并且无法找到答案。我正在使用SDL进行绘图。

我正在使用我的项目进行面向对象编程或“状态机”(在新手的心中听起来不那么痛苦,相信我),并且在我的类Game1.cpp的渲染部分中,我试图调用一个绘制我的玩家类的功能,但由于一些我无法理解的未知原因,它只是完全跳过这个函数调用。

我没有错误,我甚至使用断点来查明发生了什么,但它每次都完全跳过它,它也会将屏幕画成黑色并且不会失败。任何帮助,为什么它跳过这将非常感激。

老实说,我觉得这是一个简单的新手错误,但我的代码欢迎任何和所有的审查,我能做的任何事情都可以让我更好。

Game1.cpp:

#include "Game1.h"
#include "PlayerCharacter.h"
Game1::Game1( World * worldObject )
{
    //object setup
    this->worldObject = worldObject;
    setDone (false);
}

Game1::~Game1()
{

}

void Game1::handle_events()
{
    //*******************************************
    //**//////////////Call Input///////////////**
    //*******************************************
    //******Check for Keyboard Input*************

    //******Check Keyboard Logic*****************

    //******Check for Mouse Input****************
    //The mouse offsets
    x = 0, y = 0;

    //If the mouse moved
    if (SDL_PollEvent(&worldObject->event))
    {
        if( worldObject->event.type == SDL_MOUSEMOTION )
        {
            //Get the mouse offsets
            x = worldObject->event.motion.x;
            y = worldObject->event.motion.y;
        }
    }
    //******Check Mouse Logic********************


}

void Game1::logic()
{



    //*******************************************
    //**//////////Collision Detection//////////**
    //*******************************************
    //******Check Player Bullet Collision Loop***
    //Check for collision with enemies

    //Check for collision with bitmap mask (walls)

    //******Check Enemy Bullet Collision Loop****
    //Check for Collision with Player

    //Check for collision with bitmap mask (walls)



}

void Game1::render()
{
    //*******************************************
    //**////////////////Drawing////////////////**
    //*******************************************
    //******Blit Black Background****************
    SDL_FillRect(worldObject->Screen , NULL , 0xff000000);

    //******Blit Bitmap Mask*********************

    //******Blit Flashlight**********************

    //******Blit Map*****************************

    //******Blit Pickups*************************

    //******Blit Bullets*************************

    //******Blit Player**************************
    &PlayerCharacter.Draw; // <----- Skips this line completely, no idea why

    //******Blit Enemies*************************

    //******Blit Blackened Overlay***************

    //******Blit HUD*****************************

    //******Flip Screen**************************
    SDL_Flip(worldObject->Screen);
}

Game1.h

#ifndef __Game1_H_INLUDED__
#define __Game1_H_INLUDED__

#include "GameState.h"
#include "SDL.h"
#include "ImageLoader.h"
using namespace IMGLoader;
class Game1 : public GameState
{
    private:
    //Menu Image
    World * worldObject;
    SDL_Rect PauseMenu,Item1Tile,Item2Tile,Item3Tile;
    /*bool bPauseMenu, bItem1Tile, bItem2Tile, bItem3Tile;
    int ButtonSpace,ButtonSize;
    float x,y;
    int Alpha1,Alpha2;*/
    //Clipping Window
    //SDL_Rect sclip,dclip;

    public:
    //Loads Menu resources
    Game1 (World * worldObject);
    //Frees Menu resources
    ~Game1();

    //Main loop functions
    void handle_events();
    void logic();
    void render();
};

#endif

PlayerCharacter.cpp

#include "PlayerCharacter.h"

SDL_Rect psclip,pdclip;

PlayerCharacter::PlayerCharacter ( float X, float Y, float dX, float dY, float Angle, float Speed, bool Existance, int Height, int Width, int Health, int Shield, SDL_Surface* Player ):Characters ( X, Y, dX, dY, Angle, Speed, Existance, Height, Width, Health )
{
    this->Player = Player;
    this->Shield = Shield;
    this->Player = load_image("image\Player1.png");
}
void PlayerCharacter::setShield ( int Shield )
{
    this->Shield = Shield;
}
int PlayerCharacter::getShield ( void )
{
    return Shield;
}
void PlayerCharacter::Draw(  ) 
{
    psclip.x = 0; psclip.y = 0; psclip.w = 64; psclip.h = 64;
    pdclip.x = 640; pdclip.y = 318; pdclip.w = 64; pdclip.h = 64;
    SDL_BlitSurface(Player, &psclip, worldObject->Screen, &pdclip);
}

PlayerCharacter.h

#ifndef __PlayerCharacter_H_INCLUDED__
#define __PlayerCharacter_H_INCLUDED__

#include "Characters.h"

class PlayerCharacter : public Characters
{
private:
    int Shield;
    SDL_Surface* Player;
    World *worldObject;
public:
    PlayerCharacter ( float X, float Y, float dX, float dY, float Angle, float Speed, bool Existance, int Height, int Width, int Health, int Shield, SDL_Surface* Player );

    void setShield ( int Shield );
    int getShield ( void );

    void Draw (  );
};

#endif

2 个答案:

答案 0 :(得分:5)

该行

&PlayerCharacter.Draw; // <----- Skips this line completely, no idea why

实际上不是函数调用。它是一个表达式,它接受Draw类中PlayerCharacter函数的地址,并且不执行任何操作。

我真的很惊讶它编译没有错误,或者至少有很多警告。

您需要创建一个PlayerCharacter对象,然后在对象中调用该函数。

答案 1 :(得分:1)

&PlayerCharacter.Draw不是函数调用。 PlayerCharacter::Draw()不是静态类方法,因此您需要PlayerCharacter 对象来调用此方法。

您有一个class PlayerCharacter,用于定义PlayerCharacter 的内容以及可以完成的内容。但据我所知,你没有一个PlayerCharacter 对象,即没有玩家角色。如果你有一个,让我们叫他pc,然后你可以用pc.Draw()画他。为此,您必须实例化类,例如通过PlayerCharacter pc( ... )...替换为您拥有的众多构造函数参数的一些适当值。 (你真的想要一个默认的构造函数,将所有这些初始化为零或其他适当的“开始”值...)