Хорошо, у меня есть эта проблема с моим классом Sprite. По сути, у класса sprite должен быть объект класса Vector, а Vector — класс с углом и скоростью. Класс Vector имеет конструктор Vector (double, double), поэтому скорость и угол можно задать при его инициализации, но когда я создаю свой класс спрайтов. Он отправляет ошибку, что вызывает 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));
}
Ваш Sprite
класс имеет Vector
член, который будет построен, когда Sprite
построен На данный момент Vector
будет инициализирован конструктором по умолчанию, потому что вы не указали иначе. Если вы хотите определенный конструктор Vector
чтобы быть использованным, вам нужно добавить список инициализации в конструктор Sprite
:
Sprite::Sprite(int x, int y)
: movement(1.0, 0.0)
{
// ...
}
Это будет инициализировать movement
с аргументами 1
а также 0
, На самом деле, вы также можете добавить других участников в свой список инициализации:
Sprite::Sprite(int x, int y)
: movement(1.0, 0.0), x(x), y(y), lastX(x), lastY(y) // and so on...
{
// ...
}
Vector
создан в Sprite::Sprite(int x, int y)
, Пустой конструктор для Vector
вызывается потому, что вы не вызываете конструктор в списке инициализатора: фактически вы оставляете Vector movement
полностью неинициализирован!
Сделай это:
Sprite::Sprite(int x, int y):
movement(3.14, 2.7)
{
...
}
строить movement
используя конструктор с двумя аргументами. Я бы выбрал лучшие значения, чем 3.14
а также 2.7
это только примерные значения.
Я также хотел бы рассмотреть возможность создания общедоступного конструктора без аргументов Vector
для простоты использования, которая инициализирует скорость и угол к нулю.