[c++] Problem med new och delete

Permalänk
Medlem

[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!

Visa signatur

Asus Sabertooth P67 | intel 2500k | 8GB Corsair Vengeance LP | Corsair HX 620 | 750GB Samsung | Samsung 830 ssd | Asus GTX580 | Lian li PC-05FN

Permalänk
Medlem

Hej!

Skulle du kunna redigera din post, och lägga in din kod i [CODE]-taggar? Då försvinner inte indenteringen, så att koden förblir läsbar.

Visa signatur
Permalänk
Medlem

Så, nu var det lättare att läsa!

Som det ser ut nu verkar du köra funktionen "tabort" som ligger i Entity-klassen som inte gör någonting. Jag antar att det är den i Invader du vill köra, om Entityn i fråga är en Invader?

Visa signatur
Permalänk
Medlem

Entity-klassen är ju då en abstrakt basklass som specificerar ett gränssnitt som då subklasserna implementerar och det är Funktionen "tabort" i Invader som jag vill köra men som nu inte funkar för jag vet inte riktigt hur det hänger ihop.

Visa signatur

Asus Sabertooth P67 | intel 2500k | 8GB Corsair Vengeance LP | Corsair HX 620 | 750GB Samsung | Samsung 830 ssd | Asus GTX580 | Lian li PC-05FN

Permalänk
Medlem
Skrivet av MrE89:

Entity-klassen är ju då en abstrakt basklass som specificerar ett gränssnitt som då subklasserna implementerar och det är Funktionen "tabort" i Invader som jag vill köra men som nu inte funkar för jag vet inte riktigt hur det hänger ihop.

Jag är lite osäker på din lösning då den verkar oerhört krångligt, men vill du inte använda metoden i entity så bör du ange den som pure virtual, dvs = 0 som de andra. Jag ser heller inte att du tar bort det "borttagna" objektet ur listan?!?

Permalänk
Medlem
Skrivet av MrE89:

Entity-klassen är ju då en abstrakt basklass som specificerar ett gränssnitt som då subklasserna implementerar och det är Funktionen "tabort" i Invader som jag vill köra men som nu inte funkar för jag vet inte riktigt hur det hänger ihop.

Jag skulle nog inte lösa det som du försöker lösa det nu alls, Invadern som tas bort måste ju också tas bort ur listan vilket inte kan göras som en medlemsfunktion i Invader. Men nu tycker jag vi reder ut en sak angående tabort-funktionen.

Entity har en funktion:
tabort()

Invader har en funktion:
tabort(Invader* newinvader)

Dessa är inte likadana, så kallar du på tabort() kör den ALLTID funktionen från Entity. (kallar du på tabort(invaderpekare) kör den funktionen i Invader) Hade funktionen i Invader deklarerats som "tabort()" hade det funkat som du tänkt.

Jag tror en bättre lösning är att du i loopen som kör move() och tabort() gör kollen och tar bort det som ska tas bort.

Visa signatur