class toevoegen aan queue/deque gaat fout

Status
Niet open voor verdere reacties.

Murdocki

Gebruiker
Lid geworden
7 jun 2007
Berichten
449
jullie kennen vas allemaal wel het spel xennon, ik probeer dit na te maken en nu ben ik bij het bouwen van de levels met hun bijbehorende vlagen van schepen. ik heb verschillende classes gemaakt namelijk:

point = een x,y punt
Enemy = bevat de locatie en beweging van een schip
Wave = bevat de informatie over een vlaag (nr schepen, type schepen, snelheid, enz enz)
ook zit hier een deque in waar alle schepen in zitten.
Level = bevat de waves die dit level gebruikt

het declareren gaat allemaal goed maar zodra ik vanuit de class Level een Wave toe wil voegen aan een deque dan crasht mijn programma, ik ben erachter gekomen dat m'n programma crasht zodra ik een Wave toe voeg aan EEN (ook in main() geprobeerd) deque of queue.

mijn vraag is of iemand iets weet of ziet wat ik fout doe, ikzelf weet het niet meer aangezien ik wel de structs point en enemy toe mag voegen.

wat ik geprobeerd heb:

x.push_back( *(new Wave()) );

x.push_back( Wave() );

Wave waves[20];
int x = 0;
x.push_back( waves[x] );
x++;

en nog meer dingen maar die weet ik niet meer

DE HEADER
Code:
#ifndef _HWAVE_H_
#define _HWAVE_H_

#include <ddraw.h>
#include <deque>
#include "EVideo.h"

struct point
    {
    int x, y;
    };
struct Enemy
    {
    std::deque<point>::iterator Node;
    int locx, locy;
    int TicksToMove;//how many times Wave::Run should be called for me to move
    int CurrTicks;//how many times Wave::Run has been called allready
    Enemy( std::deque<point>::iterator pos, int tickstomove )
        : Node( pos ), TicksToMove( tickstomove ), CurrTicks( 1 )
        {
        locx = (*pos).x;
        locy = (*pos).y;
        }
    };
class Wave
    {
    private:
    //variables loaded from file
    LPDIRECTDRAWSURFACE7 lpDDSMyShipType;
    int StartTime;
    int TravelTime;
    int Count;//number of ships in this wave
    int Delay;//delay between ship spawns
    int DelayCounter;
    int HitPoints;
    int Value;
    //variables generated by class
    std::deque<point> NodeList;
    std::deque<Enemy> Ships;

    public:
    void SetStartTime( int var )
        {StartTime = var;}
    int GetStartTime()
        {return StartTime;}
    void SetTravelTime( int var )
        {TravelTime = var;}
    int GetTravelTime()
        {return TravelTime;}
    void SetCount( int var )
        {Count = var;}
    int GetCount()
        {return Count;}
    void SetDelay( int var )
        {Delay = var;}
    int GetDelay()
        {return Delay;}
    void SetHitPoints( int var )
        {HitPoints = var;}
    int GetHitPoints()
        {return HitPoints;}
    void SetValue( int var )
        {Value = var;}
    int GetValue()
        {return Value;}
    void AddNode( point var )
        {NodeList.push_back(var);}
    point GetNode( std::deque<point>::iterator x )
        {return *x;}
    void Init();
    void Run();
    void LoadSurface( CEVideo& Video, char* name );
    void Draw( CEVideo& Video );
    ~Wave()
        {lpDDSMyShipType -> Release();}
    };

#endif
DE CPP
Code:
#include "hWave.h"
#include "resource.h"
void Wave::LoadSurface( CEVideo& Video, char* name )
    {
    if( *name == *"LittleBitch" )
        lpDDSMyShipType = Video.CreateSurfaceFromResource(BMP_BITCH);
    else
        lpDDSMyShipType = Video.CreateSurfaceFromResource(BMP_BITCH);
    Video.SetColorKey(lpDDSMyShipType, 255, 0, 255);
    }
void Wave::Init()
    {
    //add the first ship
    Ships.push_back( Enemy( NodeList.begin(), (int)(TravelTime/NodeList.size()/1000*30) ) );
    //set the delaycounter
    DelayCounter = Delay;
    }

void Wave::Run()
    {
    DelayCounter--;
    if( DelayCounter <= 0 )//its time to spawn a new ship
        {
        if( Count > 0 )
            {
            Ships.push_back( Enemy( NodeList.begin(), (int)(TravelTime/NodeList.size()/40) ) );//spawn a ship at the start of the nodelist
            Count--;
            }
        DelayCounter = Delay/40;//reset the counter to let us wait with spawning
        }

    std::deque<Enemy>::iterator pos,
                                end = Ships.end();
    //for all enemy ships
    for( pos = Ships.begin(); pos != end; pos++ )
        {
        (*pos).CurrTicks++;
        if( (*pos).CurrTicks > (*pos).TicksToMove )
            {
            (*pos).Node++;
            (*pos).locx = (*((*pos).Node)).x;
            (*pos).locy = (*((*pos).Node)).y;
            (*pos).CurrTicks = 1;
            }
        else
            {
            (*pos).locx += ( (*((*pos).Node+1)).x - (*((*pos).Node)).x ) /(*pos).TicksToMove;
            (*pos).locy += ( (*((*pos).Node+1)).y - (*((*pos).Node)).y ) /(*pos).TicksToMove;
            }
        //(*pos).Node++;
        if( (*pos).Node == NodeList.end() )//if the ship is at the end of the nodelist
            Ships.erase(pos, pos+1);//remove it from our list of ships
        }
    }

void Wave::Draw( CEVideo& Video )
    {
    std::deque<Enemy>::iterator pos,
                                end = Ships.end();
    //for all enemy ships
    for( pos = Ships.begin(); pos != end; pos++ )
        {
        Video.Draw( lpDDSMyShipType, (*pos).locx, (*pos).locy, NULL );
        }
    }
GEBRUIKdit werkt dus niet
Code:
std::deque<Wave> MyWaves;
MyWaves.push_back( Wave() );

bij voorbaat dank,

Murdocki
 
iemand enig iedee? of misschien ideeen voor hoe ik nog verder kan debuggen?
 
zelf heb ik nooit met deque gewerkt, maar als ik me niet vergis is dit een vector met de mogelijkheid om fontpush/pop uit te voeren.
Volgen er ook errors bij het toevoegen @ runtime / compilatie-errors?
Als er geen errors zijn, print dan voor/na elke insert debugstatements af met een overzicht van de objecten die erin zitten, de grootte van de deque..

Fouten die ik vaak met vectors had: insert van object in een vector van pointers/references. opvragen van de pointer als object ipv pointer, ... ga nogmaals alle assignments na (evt met print-statments, want je kijkt makkelijk over zo'n fout, aangezien je in een denkpatroon zit)

Voorlopig kan ik niet direct op meer debug-info komen.
--Johan
 
ik ga het binnenkort proberen, ben met pathfinding bezig atm dus dit kan nog wel ffies wachten ;)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan