2010-05-07 52 views
0

我有一個級別類和一個Enemy_control類,它基於一個將Enemys作爲值的向量。 在我的水平構造我:向類構造函數中的向量添加值時的變量範圍

Enemy tmp(1200); 
enemys.Add_enemy(tmp); // this adds tmp to the vector in Enemy_control 

敵人是類型Enemy_control的變量。我的程序在這些陳述中抱怨關卡中的一些析構問題以及enemy_control和enemy後崩潰。

Level1::Level1() : Levels() 
{ 
bgX1 = -60; // -60 
bgX2 = -130; // -110 
bgX3 = -240; // - 
bgY=0; // is this used anymore? 

// characterY=330; 
max_right_movement=500; 
max_left_movement=300; 

// More test 
jump_max = 110; 
player_current_y = 340; 
jump_spd = 4; 
player_current_floor_y = 340; 
//CONST_LEVEL1_MAIN_Y = new int(340); 

scrolling = true; 
scrolling_right = true; // this var is in levels 

level_alive = true; 
restart_level = false; 

player_level_x = 300; 
player_screen_x = 300; 

level_end_point = 1035 * 10; 
level_start_point = 0; 

// create enemys in the level 
Enemy tmp(1200); 
enemys.Add_enemy(tmp); 


// tmp.Set_enemy(4600); 
// enemys.Add_enemy(tmp); 
scoreTitle = new MyText(25); 
score = new MyText(25); 
high_score=0; 
//onblock=0; 

load("grafx/level1/clouds.png", "grafx/level1/mountain.png", "grafx/level1/ground.png", "sounds/level1music.ogg"); 
} 

and enemy.h: 

/* Enemy.h 
* obg 
* 1-13-10 
*/ 

#ifndef ENEMY_H 
#define ENEMY_H 

#include "Character.h" 
#include <vector> 

class Enemy : public Character 
{ 
    private: 
     int enemy_speed, 
      DRAW_X, 
      spawn_x, 
      distance_to_enemy, 
      frame_left, 
      frame_right, 
      death_frame_x, 
      death_frame_y; 

     int bullet_fire_rate; 

     bool following_player; 

    private: 
     void Draw_enemy_going_right(SDL_Surface *video_surface); 
     void Draw_enemy_going_left(SDL_Surface *video_surface); 
     void Draw_death(int bgX3, int y, SDL_Surface *video_surface); 

     void Move_frame_left(); 
     void Move_frame_right(); 

     void Draw_me(int bgX3, int y, SDL_Surface *video_surface, int player_level_x, int player_screen_x); 

     void Fire_bullet(); 

    public: 
     Enemy(int spawn_x); 
     ~Enemy(); 

     //void Set_enemy(int spawn_x); 
     void Draw(int bgX3, int y, SDL_Surface *video_surface, int player_level_x, int player_screen_x); 
     bool Following_player(); 

}; 

class Enemy_control 
{ 
    private: 
     vector<Enemy> enemy_vector; // change this to a vector 

    public: 
     Enemy_control(); 
     ~Enemy_control(); 

     void Add_enemy(Enemy a_enemy); 
     void Draw(int bgX3, int y, SDL_Surface *video_surface, int player_level_x, int player_screen_x); 
     //void Free_list_from_memory(); 
}; 

敵人構造:

敵人::敵人(INT spawn_x):字符() {

character_image.load( 「GRAFX/enemy1.gif」);

health = 400; 
damage = 20; 

DRAW_X = spawn_x; 
this->spawn_x = spawn_x; 

distance_to_enemy = 230; 
enemy_speed = 3; 
frame_left = 0; 
frame_right = 0; 
death_frame_x = 390; 
death_frame_y = 0; 

following_player = false; 
bullet_fire_rate = 0; 

sprite_info.w = 63; 
sprite_info.h = 74; 
cout << "enemy built please call Set_enemy()\n"; 

}

任何想法?

+1

小心發佈實際的錯誤,而不是說它是「一些析構問題」?我們不是心靈的。 – rlbond 2010-05-08 00:32:06

+0

字符標題的外觀如何,你是否聲明析構函數是虛擬的? – 2010-05-08 00:53:57

+0

@Anders Karlsson是 – TheFuzz 2010-05-08 00:59:53

回答

0

正如alread指出,你的問題的描述不是很精確。讓我感到奇怪的事情之一是爲什麼你的任何類的析構函數被調用。看看你的代碼,很明顯,Enemy tmp是一個本地實例,它在離開Level構造函數後得到清理。 Add_Enemy()函數接收此本地對象的副本。由於您沒有提供複製構造函數,所以在複製構造函數中不會執行對character_image.load("grafx/enemy1.gif");的調用,因此您存儲的Enemy對象將沒有圖像。

也許你應該考慮這樣的事情:

Enemy* tmp = new Enemy(1200); // dynamic allocation of Enemy 
enemey.Add_enemy(tmp);  

如果您做些事情是這樣,你需要你的載體改變存儲指向敵人的對象 像std::vector< Enemy* >敵人。不要忘記在Enemy_control的析構函數中刪除動態分配的對象。