C++ : Comment utiliser une classe dans une classe ?? - Programmation
Marsh Posté le 08-08-2001 à 14:35:33
on fait pas d'alloc dans une classe. dans une fonctions de la classe oui
Marsh Posté le 08-08-2001 à 14:37:32
Okey !! Donc je déclare ma variable, et je l'instancie et l'initialise dans un constructeur par exemple ?
Marsh Posté le 08-08-2001 à 14:41:17
Merci !! Ca marche !! Enfin, à la compilation ! Ca fait 3 ans que j'ai plus fait de C ... Et la j'attaque direct le C++ ... Chaud !
Encore merci !
Marsh Posté le 08-08-2001 à 14:45:06
Si tu utilises la méthode de TheJackal n'oublies pas de faire un delete dans le descruteur.
Sinon tu peux faire ça et la dectruction est automatique:
class alien {
};
class alien_pool
{
alien pool[200];
};
Marsh Posté le 08-08-2001 à 14:45:45
de rien. tu vera le c++ est super
qu'est ce ke t'appelle instancier au faite ?
Marsh Posté le 08-08-2001 à 14:46:32
seblamb a écrit a écrit : Si tu utilises la méthode de TheJackal n'oublies pas de faire un delete dans le descruteur. Sinon tu peux faire ça et la dectruction est automatique: class alien { }; class alien_pool { alien pool[200]; }; |
c vrai aussi
Marsh Posté le 08-08-2001 à 14:50:32
TheJackal a écrit a écrit : de rien. tu vera le c++ est super qu'est ce ke t'appelle instancier au faite ? |
Ou là, je me mélange les pinceaux avec les termes ... Ben pour moi instancier c'est par exemple :
void main()
{
alien_pool p = new alien_pool;
}
ce qui après merde quand je fais :
p.create_alien(); ... Pace que Mosieur veut un pointeur ... J'y perd mon latin, j'en avais fais en cous ya quelques année, ça m'avais parru plus simple ...
Marsh Posté le 08-08-2001 à 14:53:07
Voici mon code de test :
#include "allegro.h"
#define VIVANT 1
#define MORT 0
#define TIR 2
#define EXPLOSION 3
#define FAUX 0
#define VRAI 1
class alien {
public :
int etat; // VIVANT,EXPLOSION,MORT,TIR
int pos_x; //
int pos_y; // Position x et y sur l'écran
int cadence_tir; // Vitesse de tir
int cadence_tir_compteur; // Décompte pour le prochain tir
int type_tir; // Type du tir
int taille_x; //
int taille_y; // Taille en largeur(x), hauteur(y)
int zone_de_touche_x1; //
int zone_de_touche_x2; //
int zone_de_touche_y1; //
int zone_de_touche_y2; // Zone de collision avec un objet
int weak_point_x1; //
int weak_point_x2; //
int weak_point_y1; //
int weak_point_y2; // Zone de collision point faible avec un objet
int animation_normale[50]; // Tableau d'animation pour mouvement classique
int animation_attaque[50]; // Tableau d'animation lorsque tir
int animation_explosion[50];// Tableau d'animation lorsque explosion
int pv; // Point de vie
int mouvement; // Type de mouvement
void init(int vpos_x,int vpos_y,int vcadence_tir,int vtype_tir,int vpv,int vmouvement);
// Initialise l'alien avec les données en paramètre
void set_zone_de_touche(int x1,int y1,int x2,int y2);
// Initialise la zone de touche
void set_weak_point(int x1,int y1,int x2,int y2);
// Initialise le point faible
void set_animation_normale(int index,int valeur);
// Initialise une image de l'animation normale
void set_animation_attaque(int index,int valeur);
// Initialise une image de l'animation attaque
void set_animation_explosion(int index,int valeur);
// Initialise une image de l'animation explosion
void shoot(); // Fait tirer l'alien
void hit(); // Enlève un point de vie OU fait exploser l'alien
void die(); // Fait mourir l'alien
void move(); // Bouge l'alien selon le mouvement/etat ...
int iscollide_zone_de_touche(int sx1,int sy1,int sx2,int sy2);
// Est-il en collision (par rapport aux paramêtres)
int iscollide_weak_point(int sx1,int sy1,int sx2,int sy2);
// Est-il en collision (par rapport aux paramêtres)
void update(); // Gère la vie de l'alien avec les méthodes du dessus
alien() { etat=MORT;}; // Constructeur
};
void alien::init(int vpos_x,int vpos_y,int vcadence_tir,int vtype_tir,int vpv,int vmouvement) {
pos_x = vpos_x;
pos_y = vpos_y;
cadence_tir = vcadence_tir;
cadence_tir_compteur = cadence_tir;
type_tir = vtype_tir;
pv = vpv;
mouvement = vmouvement;
};
void alien::set_zone_de_touche(int x1,int y1,int x2,int y2) {
zone_de_touche_x1 = x1;
zone_de_touche_y1 = y1;
zone_de_touche_x2 = x2;
zone_de_touche_y2 = y2;
};
void alien::set_weak_point(int x1,int y1,int x2,int y2) {
weak_point_x1 = x1;
weak_point_y1 = y1;
weak_point_x2 = x2;
weak_point_y2 = y2;
};
void alien::set_animation_normale(int index,int valeur){
animation_normale[index] = valeur;
};
void alien::set_animation_attaque(int index,int valeur){
animation_attaque[index] = valeur;
};
void alien::set_animation_explosion(int index,int valeur){
animation_explosion[index] = valeur;
};
void alien::shoot(){
etat = TIR;
};
void alien::hit(){
pv--;
if (pv<=0)
etat = EXPLOSION;
};
void alien::die(){
etat = MORT;
};
void alien::move(){
if (mouvement==0)
pos_x--; // Mouvement simple de base
};
int alien::iscollide_zone_de_touche(int sx1,int sy1,int sx2,int sy2){
return FAUX;
};
int alien::iscollide_weak_point(int sx1,int sy1,int sx2,int sy2){
return FAUX;
};
void alien::update(){
if (etat==TIR) etat=VIVANT;
if (etat==VIVANT) {
cadence_tir_compteur--;
if (cadence_tir_compteur<=0) {
shoot();
cadence_tir_compteur = cadence_tir;
}
move();
}
};
class alien_pool {
public:
alien pool[200];
void create_alien();
int etat_alien(int nalien);
};
void alien_pool::create_alien(){
pool[0].etat = VIVANT;
};
int alien_pool::etat_alien(int nalien){
return pool[nalien].etat;
}
int main()
{
alien_pool p = new alien_pool;
p.create_alien();
/* you should always do this at the start of Allegro programs */
allegro_init();
/* set up the keyboard handler */
install_keyboard();
/* set a graphics mode sized 320x200 */
if (set_gfx_mode(GFX_DIRECTX_WIN, 640, 480, 0, 0) != 0) {
set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);
allegro_message("Unable to set any graphic mode\n%s\n", allegro_error);
return 1;
}
/* set the color palette */
set_palette(desktop_palette);
/* clear the screen to white */
clear_to_color(screen, makecol(255, 255, 255));
/* you don't need to do this, but on some platforms (eg. Windows) things
* will be drawn more quickly if you always acquire the screen before
* trying to draw onto it.
*/
acquire_screen();
/* set transparent text */
text_mode(-1);
/* write some text to the screen with black letters */
if (p.etat_alien(0)==VIVANT)
textout_centre(screen, font, "VIVANT", SCREEN_W/2, SCREEN_H/2, makecol(0,0,0));
if (p.etat_alien(0)==MORT)
textout_centre(screen, font, "MORT", SCREEN_W/2, SCREEN_H/2, makecol(0,0,0));
/* you must always release bitmaps before calling any input functions */
release_screen();
/* wait for a keypress */
readkey();
return 0;
}
END_OF_MAIN();
Il merde ...
Vous pourriez me diriger un peu pour que je prenne des bonnes bases ...
Marsh Posté le 08-08-2001 à 14:58:12
alien_pool *p = new alien_pool;
p->create_alien();
new aloue de la mem pour un pointeur et non une var normal
Marsh Posté le 08-08-2001 à 15:00:54
Purée !! Qu'est ce que je suis con !!
Je faisais p--> au lieu de p-> !!
raaaa !! Bon ça devrait aller !!
ENCORE MERCI BEAUCOUP POUR TOUT !!
A si, dernière question mon alien pool[200]; la mémoire est alloué ??
Marsh Posté le 08-08-2001 à 15:02:45
?
la meme mem est toujours aloc
seulement comme ta fait l'alloc / desalloc se fait tout seul
ya ke new qui doit etre suivit de delete
Marsh Posté le 08-08-2001 à 15:05:28
Okey ! Bon, ça marche ! Je continue le dev, les choses se remettent en place dans ma ch'tite caboche !!
MERCI !
Marsh Posté le 08-08-2001 à 15:13:53
TheJackal a écrit a écrit : jsuis curieux mais tu fait koi? et avec koi? |
Alors, je tente le développement d'un shoot'em up à scrolling horizontal avec MS VC++ et allegro (utilisant Direct X) ...
Pour l'instant, je cherche des structures de données cohérentes, et me remémore mon C++ ...
Marsh Posté le 08-08-2001 à 15:17:20
bonne chance et surtout n'hesite pas a revenir si ta un blem
Marsh Posté le 08-08-2001 à 14:31:38
Exemple de mon prog :
class alien {
} avec un constructeur
class alien_pool
{
alien *pool = new alien[200];
}
Marche po ... Dans le main oui, mais pas dans la classe alien pool ... Comment je fais alors ??
[edtdd]--Message édité par bfg--[/edtdd]