[c++] Problem med new och delete
Hej alla glada programmerare!
Nu är det så att jag håller på med en uppgift där jag ska göra ett litet spel med hjälp av ett programbibliotek som heter VGC (Virtual Game Console). Spelet går ut på att göra ett eget "spaceinvaders" där man styr sitt eget skepp och skjuter ner invaders.
Jag har då ett problem som jag inte har en aning om hur jag ska lösa och det är att när flera invaders har spawnat och flyger utanför spelområdet så ska dem tas bort.
Jag skapar invaders med hjälp av new och lägger dem sedan i en vector för att sen tas bort med delete.
Här är iaf delar av min kod, hoppas någon förstår sig på den
entity.h
#ifndef INCLUDED_ENTITY
#define INCLUDED_ENTITY
#include "VGCVirtualGameConsole.h"
#include <vector>
#include <string>
#include <sstream>
class Entity{
public:
typedef std::vector<Entity*> EntityVector;
Entity();
~Entity();
virtual void move() = 0;
virtual void render() = 0;
virtual void tabort();
double xPosition;
double yPosition;
double xVelocity;
double yVelocity;
private:
};
#endif
-----------------
entity.cpp
#include "Entity.h"
using namespace std;
Entity::Entity()
{
xPosition=0;
yPosition=0;
xVelocity=0;
yVelocity=0;
}
Entity::~Entity(){}
void Entity::tabort(){}
--------------
invader.h
#ifndef INCLUDED_INVADER
#define INCLUDED_INVADER
#include "Entity.h"
class Invader : public Entity{
public:
Invader();
~Invader();
virtual void move();
virtual void render();
virtual void tabort(Invader *newinvader); <-- Här är jag osäker om det ska vara som jag har skrivit.
double xPosition;
double yPosition;
double xVelocity;
double yVelocity;
static VGCImage invaderimage;
static void initialize();
static void finalize();
private:
};
#endif
----------
invader.cpp
#include "Invader.h"
#include "Globalconstants.h"
#include "Entity.h"
using namespace std;
VGCImage Invader::invaderimage;
Invader::Invader() : Entity()
{
xPosition = VGCRandomizer::getDouble(0.0, Globals::DISPLAY_WIDTH - VGCDisplay::getWidth(invaderimage));
yPosition = -50;
xVelocity = VGCRandomizer::getDouble(-Globals::MAX_INVADER_SPEED, Globals::MAX_INVADER_SPEED);
yVelocity = Globals::MAX_INVADER_SPEED;
}
Invader::~Invader(){
}
void Invader::move(){
xPosition += xVelocity;
yPosition += yVelocity;
if((xPosition < 0.0) || (Globals::DISPLAY_WIDTH - VGCDisplay::getWidth(invaderimage) <= xPosition)){
xVelocity = -xVelocity;
}
//if((yPosition >= (Globals::DISPLAY_HEIGHT - VGCDisplay::getWidth(invaderimage))) ){
//xVelocity = 0;
//yVelocity = 0;
//}
}
void Invader::tabort(Invader *newinvader)
{
if((yPosition >= (Globals::DISPLAY_HEIGHT - 100)) ){ <--- Här har jag tänkt mig att man ska göra en delete då en invader
hamnar under ett visst y värde.
xVelocity = 0;
yVelocity = 0;
delete newinvader;
}
}
void Invader::render(){
const VGCVector position = VGCVector(int(xPosition), int(yPosition));
const VGCVector frameIndex = VGCVector(0,0);
const VGCAdjustment adjustment = VGCAdjustment(0.0, 0.0);
VGCDisplay::renderImage(invaderimage, frameIndex, position, adjustment);
}
void Invader::initialize(){
const string invadersFilename = "Invader.png";
const int INVADERS_X_FRAME_COUNT = 1;
const int INVADERS_Y_FRAME_COUNT = 1;
Invader::invaderimage = VGCDisplay::openImage(
invadersFilename,
INVADERS_X_FRAME_COUNT,
INVADERS_Y_FRAME_COUNT
);
}
void Invader::finalize(){
VGCDisplay::closeImage(invaderimage);
}
-----------------
Main.cpp
#include "Entity.h"
#include "Invader.h"
#include "Ship.h"
//#include "Bullet.h"
using namespace std;
int VGCMain(const VGCStringVector &arguments){
const string applicationName = "Invader";
const int DISPLAY_WIDTH = 512;
const int DISPLAY_HEIGHT = 512;
VGCVirtualGameConsole::initialize(applicationName, DISPLAY_WIDTH, DISPLAY_HEIGHT);
Invader::initialize();
Ship::initialize();
//skappar ett skepp
Entity::EntityVector entityVector;
Ship *newship=new Ship();
entityVector.push_back(newship);
VGCClock::initializeClock();
static const double SPAWN_TIME = 1;
VGCTimer timer = VGCClock::openTimer(SPAWN_TIME);
while(VGCVirtualGameConsole::beginLoop()){
if(VGCClock::isExpired(timer)){
//skappar flera invaders
Invader *newinvader=new Invader();
entityVector.push_back(newinvader);
VGCClock::reset(timer);
}
//flyttar skepp och invader
for(size_t i = 0; i < entityVector.size(); ++i) {
entityVector[i]->move(); <---- går igenom vectorn för att se vilka invaders som är under y
värdet.
entityVector[i]->tabort();
}
if(VGCDisplay::beginFrame()){
const VGCColor backgroundColor = VGCColor(255, 0, 0, 0);
VGCDisplay::clear(backgroundColor);
for(size_t j = 0; j < entityVector.size(); ++j){
entityVector[j]->render();
}
VGCDisplay::endFrame();
}
VGCVirtualGameConsole::endLoop();
}
delete newship;
Invader::finalize();
Ship::finalize();
VGCClock::closeTimer(timer);
VGCClock::finalizeClock();
VGCVirtualGameConsole::finalize();
return 0;
}
Tack på förhand!
Asus Sabertooth P67 | intel 2500k | 8GB Corsair Vengeance LP | Corsair HX 620 | 750GB Samsung | Samsung 830 ssd | Asus GTX580 | Lian li PC-05FN