使用Vector Object作为成员的C ++ Sprite类

时间:2012-12-23 23:43:34

标签: c++ sdl sprite physics-engine

好的,我的Sprite类遇到了这个问题。基本上sprite类应该有一个Vector类的对象作为其成员,Vector是一个具有角度和速度的类。 Vector类有一个Vector(double,double)构造函数,因此可以在初始化时设置速度和角度,但是当我创建sprite类时。它发送一个错误,它调用Vector(),一个空白构造函数,并且它不存在。我想弄清楚它为什么调用Vector()。这是我的Sprite和Vector类的代码。

#Vector.h
#ifndef VECTOR_H
#define VECTOR_H

class Vector

{
    public:
        Vector(double,double);
        double getX();
        double getY();
        double getSpeed();
        double getAngle();
        void setSpeed(double);
        void setAngle(double);

    private:
        double speed,angle;
};

#endif


#Vector.h
#include "SDL/SDL.h"
#include "vector.h"
#include "math.h"

Vector::Vector(double speed,double angle)

{
    this -> speed = speed;
    this -> angle = angle;
}

double Vector::getX()

{
    return speed*cos(angle);
}

double Vector::getY()

{
    return speed*sin(angle);
}

double Vector::getSpeed()

{
    return speed;
}

double Vector::getAngle()

{
    return angle;
}

void Vector::setAngle(double angle)

{
    this -> angle = angle;
}

void Vector::setSpeed(double speed)

{
    this -> speed = speed;
}


#Sprite.h:
#ifndef SPRITE_H
#define SPRITE_H
#include "vector.h"

class Sprite

{
    public:
        Sprite(int x,int y);
        SDL_Rect getRect();
        SDL_Surface* getImage();
        void setRect(SDL_Rect);
        void move();
        void draw(SDL_Surface*);

    private:
        Vector movement;
        double x,y,lastX,lastY,angle,speed;
        SDL_Rect rect;
        SDL_Surface* image;
};

#endif


#Sprite.cpp:
#include "SDL/SDL.h"
#include "sprite.h"
#include "functions.h"
#include <cmath>

Sprite::Sprite(int x, int y)

{
    this -> x = x;
    this -> y = y;
    lastX = x;
    lastY = y;
    image = loadImage("box.png");
    rect.x = x;
    rect.y = y;
    rect.w = image->w;
    rect.h = image->h;
    speed = 1;
    angle = 0;
}

SDL_Rect Sprite::getRect()

{   
    return rect;
}

SDL_Surface* Sprite::getImage()

{
    return image;
}

void Sprite::setRect(SDL_Rect rect)
{
    this -> rect = rect;
}

void Sprite::move()

{
    lastX = x;
    lastY = y;
    x += speed*cos(angle);
    y += speed*sin(angle);
    rect.x = int(x);
    rect.y = int(y);
}

void Sprite::draw(SDL_Surface* dest)

{
    blit(image,dest,int(x),int(y));
}

2 个答案:

答案 0 :(得分:2)

您的Sprite班级有一个Vector成员,将在构建Sprite时构建。目前,Vector将使用默认构造函数进行初始化,因为您没有另行指定。如果要使用Vector的特定构造函数,则需要将初始化列表添加到Sprite的构造函数中:

Sprite::Sprite(int x, int y)
  : movement(1.0, 0.0)
{
  // ...
}

这会使用参数movement1初始化0。实际上,您也可以将其他成员添加到初始化列表中:

Sprite::Sprite(int x, int y)
  : movement(1.0, 0.0), x(x), y(y), lastX(x), lastY(y) // and so on...
{
  // ...
}

答案 1 :(得分:1)

Vector中创建了Sprite::Sprite(int x, int y)。调用Vector的空白构造函数是因为您没有在初始化列表中调用构造函数:实际上,您将Vector movement完全取消了初始化!

这样做:

Sprite::Sprite(int x, int y):
  movement(3.14, 2.7)
{
  ...
}

使用两个参数构造函数构造movement。我会选择比3.142.7更好的值,这些只是示例值。

我还考虑在Vector上创建一个公共无参数构造函数,以便于将速度和角度初始化为零。