Weil ich für mein PC-Spiel, einen Spaceshooter
Spiel
DirectX Update
auch Verbündete einführen wollte habe ich die Für die AI aus meiner bisherigen Gegner-Implementation eine Abstrakte Klasse herausgelöst.
Funktioniert aber nicht ganz
Enemy.h
Alles anzeigen
NPC.h
Alles anzeigen
____________________________________________________________
OK scheinbar kann ich den Konstruktor einer Basisklasse nicht aufrufen, wenn diese rein virtuelle Funktionen hat -.-
____________________________________________________________
Kennt jemand eine Möglichkeit einen Konstruktor für die Basisklasse zu verwenden und trotzdem sicherzustellen, dass eine Funktion in der Basisklasse die entsprechende Funktion der abgeleiteten Klasse aufruft?
Ich hab bei den Funktionen das =0 entfernt, danach lies es sich wunderbar Compilieren aber die Funktion der Basisklasse, die die Virtuelle Funktion aufruft nimmt die der Basisklasse
Spiel
DirectX Update
auch Verbündete einführen wollte habe ich die Für die AI aus meiner bisherigen Gegner-Implementation eine Abstrakte Klasse herausgelöst.
Funktioniert aber nicht ganz
Enemy.h
Quellcode
- #ifndef ENEMY_H
- #define ENEMY_H
- //std - Include
- #include <string>
- #include <list>
- #include <stdio.h>
- //projekt - include
- #include "NPC.h"
- #include "Console.h"
- #include "Player.h"
- class CEnemy :
- public ANPC
- {
- private:
- std::string m_powerupfile;
- CPlayer* m_player;
- void number_enemys(int* results, std::list<CEnemy*>& r_active_my_enemys);
- bool calculate_y(float* down_up);
- public:
- CEnemy(unsigned int starttime, int posx, int posy, Strength theStrength, std::string shipfile, std::string powerupfile)
- : ANPC(starttime, posx, posy, theStrength, shipfile), m_powerupfile(powerupfile)
- {}
- std::string getPowerUp()
- {return m_powerupfile;}
- bool init(global_data_pointers Data, CPlayer* player, AI_parameter* parameter, strength* Strength)
- { m_player = player; return ANPC::init(Data, parameter, Strength);}
- ~CEnemy()
- {}
- };
- #endif
NPC.h
Quellcode
- #ifndef NPC_H
- #define NPC_H
- #include <bitset>
- #include "Ship.h"
- #include "Enemy_Help.hpp"
- #include "Globals.h"
- #include "MathFuncs.h"
- class ANPC
- {
- public:
- enum Strength {EMPTY, WEAK_ENEMY, MEDIUMWEAK_ENEMY, AVERAGE_ENEMY, MEDIUMHARD_ENEMY, HARD_ENEMY, WEAK_BOSS = 101, MEDIUMWEAK_BOSS = 102, AVERAGE_BOSS = 103, MEDIUMHARD_BOSS = 104, HARD_BOSS = 105};
- protected:
- int des_x, des_y;
- AI_parameter* m_parameter;
- int desired_distance;
- int desired_center;
- CShip* m_Ship;
- private:
- unsigned int m_starttime;
- int rest_x, rest_y;
- Strength m_strength;
- int m_firedist;
- std::string m_shipfile;
- protected:
- float get_fancy(float* farray, int start, int end);
- private:
- //////////
- //Virtuelle Funktionen
- //////////
- /*
- *result muss ein int [3] sein, Inhalt ist am Schluss die Zahl der jeweiligen Gegner in die Richtung
- *[0] für links [1] für mitte [2] für rechts
- */
- virtual void number_enemys(int* results, std::list<ANPC*>& r_Enemys) = 0;
- /*Berechnet, in welche Y-Richtung sich der NPC optimalerweise bewegt*/
- virtual bool calculate_y(float* down_up) = 0;
- //////////
- //Implementierte Funktionen
- //////////
- /*Bewegt das Schiff in y-Richtung, überprüft dabei ob die Wartezeit abgelaufen ist*/
- void steer_y(int direction);
- /*Bewegt das Schiff in x-Richtung, überprüft dabei ob die Wartezeit abgelaufen ist*/
- void steer_x(int direction);
- /*Berechnung der "beliebtheit" jedes Pixels für den NPC*/
- void update_array(float* fancy, std::list<projectileData>& r_Projectiles);
- /*Diese Funktion sorgt dafür, dass die NPC einen minimalabstand halten*/
- void separation(std::list<ANPC*>& r_activeEnemys, float* xseparate, float* yseparate);
- /*Berechnet, in welche X-Richtung sich der NPC optimalerweise bewegt*/
- bool calculate_x(float* fancy, float* fancy_dir, std::list<projectileData>& r_Projectiles, std::list<ANPC*>& r_activeEnemys);
- public:
- //Konstruktor/Destruktor usw.
- ANPC(unsigned int starttime, int posx, int posy, Strength theStrength, std::string shipfile);
- ~ANPC()
- {if (m_Ship) delete m_Ship;}
- bool init(global_data_pointers Data, AI_parameter* parameter, strength* tStrength);
- //Berechnungsfunktionen
- /*Berechnung der Bewegungsrichtung des NPC, wird seltener aufgerufen als update()*/
- void calculate(float* fancy, std::list<projectileData>& r_Projectiles, std::list<ANPC*>& r_activeEnemys);
- /*Führt jeden Frame die in calculate berechnete Bewegung durch, schießt bei Bedarf*/
- void update(const std::bitset<800>& owned);
- void Draw()
- {m_Ship->Draw();}
- //Elementzugriff
- CShip* getShip()
- {return m_Ship;}
- unsigned int getStarttime()
- {return m_starttime;}
- int getPower()
- {return (m_strength > 100) ? m_parameter->max_power : 1;}
- int getStrength()
- {return m_strength;}
- };
- #endif
"MS Visual C++ 6" schrieb:
P:\Spaceshooter\10-11-06(VC6)\EnemyManager.cpp(643) : error C2259: "CEnemy" : Instanz von abstrakter Klasse kann aufgrund nachfolgender Elemente nicht erstellt werden:
P:\Spaceshooter\10-11-06(VC6)\Enemy.h(20) : Siehe Deklaration von 'CEnemy'
P:\Spaceshooter\10-11-06(VC6)\EnemyManager.cpp(643) : error C2259: "CEnemy" : Instanz von abstrakter Klasse kann aufgrund nachfolgender Elemente nicht erstellt werden:
P:\Spaceshooter\10-11-06(VC6)\Enemy.h(20) : Siehe Deklaration von 'CEnemy'
____________________________________________________________
OK scheinbar kann ich den Konstruktor einer Basisklasse nicht aufrufen, wenn diese rein virtuelle Funktionen hat -.-
____________________________________________________________
Kennt jemand eine Möglichkeit einen Konstruktor für die Basisklasse zu verwenden und trotzdem sicherzustellen, dass eine Funktion in der Basisklasse die entsprechende Funktion der abgeleiteten Klasse aufruft?
Ich hab bei den Funktionen das =0 entfernt, danach lies es sich wunderbar Compilieren aber die Funktion der Basisklasse, die die Virtuelle Funktion aufruft nimmt die der Basisklasse