用矢量对象作为成员的c++精灵类

C++ Sprite class with Vector Object as Member

本文关键字:c++ 精灵 成员 对象      更新时间:2023-10-16

好吧,我的Sprite类有这个问题。基本上,精灵类应该有一个Vector类的对象作为它的成员,Vector是一个同时具有角度和速度的类。Vector类有一个Vector(double,double)构造函数,所以速度和角度可以在初始化时设置,但当我创建精灵类时。它发送一个错误,表示正在调用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));
}

您的Sprite类有一个Vector成员,该成员将在Sprite被构造时被构造。目前,Vector将使用默认构造函数初始化,因为您没有指定其他方法。如果希望使用Vector的特定构造函数,则需要在Sprite的构造函数中添加初始化列表:

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

将用参数10初始化movement。实际上,您还可以在初始化列表中添加其他成员:

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

VectorSprite::Sprite(int x, int y)中创建。调用Vector的空白构造函数是因为您没有调用初始化列表中的构造函数:事实上,您使Vector movement完全未初始化!

这样做:

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

使用双参数构造函数构造movement。我会选择比3.142.7更好的值,这些只是样本值。

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