1

Bonjour à tous,
Voila j'ai un petit soucis de programmation d'un jeux genre rtype.
Je le programme en c++ avec sdl, je veux savoir comment on peut faire pour faire bouger un monstre par exemple de haut en bas et comment faire pour que lorsqu'on tire un projectile , le vaisseau ne reste pas bloquer en attendant que le projectile finisse son chemin?

Si il y a quelqu'un qui a deja programmer un rtype , s'il peut m'aider ?

Merci de votre comprehension

2

Le problème c'est de voir surtout où tu bloques, si tu as déjà programmer quelque chose et que ça ne marche, je pense que si tu montres ton code source ça nous permettrai de t'aider smile

3

Pour programmer un jeu de tire, la solution la plus simple ( mais pas forcement la meilleur ) est de tout le temps travailler avec des tableaux d'une manière indépendante.
C'est a dire que chaque action à l'écran (tire, ennemis, tire de l'ennemis,etc...) aura sa propre coordonner + donner d'action

L'animation de l'ennemi, tu la prédefini toi même dans en tableau, par exemple, si tu sais que ton jeu va tourner à 60fps ou 30fps, tu prédéfines des coordonnées X,Y en tenant compte que 30 ou 60 données = 1 seconde d'animation à l'écran.

Monstre1_x[10,11,12,13,14,15,16,17,18,19,20,...];
Monstre1_y[11,12,13,14,15,16,17,18,19,20,21,...];
Le tableau peut être long mais l'avantage c'est que tu peux faire bouger ton monstre comme tu veux, courbé, en diagonal, en spiral,...

Après forcement, il y a d'autre procédé plus intéressant, mais déjà comme ca, c'est un début.

Pour le tire, c'est toujours avec un tableau sauf que la, tu dois savoir dire si le tire est activé ou pas.

byte tir_max=20;
bool tir_actif[tire_max];
int tir_x[tire_max];
int tir_y[tire_max];

Des que tu bouges ton vaisseau, quand tu appuis sur un bouton, tu inscris dans une boucle que tu auras crée dans ce style là:

// activer le tire
for ( int i = 0; i < tire_max; i++)
{
if (tir_actif[z]==false) { tir_actif[z]=true; i=tir_max; } // active un tir libre et quitte la boucle
}

dès que ton tir quit l'écran tu désactives le tir_actif du tir en question.

C'est un peu brouillon mais j'éspère que cela t'aidera wink

4

Merci de ton aide je vais mettre ce que j'ai fais il y a des fonctions qui ne sont pas de moi.
Il y a la definition de mes classes priojectile, monstres, joueur et le main .
Aidez moi car la je bloque!!


class Projectile
{
private:
SDL_Surface* project;
SDL_Rect pbase;
int px,py;
friend class Joueur;

public:
Projectile(const char *s);
~Projectile();
void tir();


};


#include "projectile.h"


const int max_largeur = 800;

Projectile::Projectile(const char* s)
{

project= load_imageSDL(s);

px=0;
py=100;
}

Projectile::~Projectile()
{
SDL_FreeSurface(project);

}

void Projectile::tir()
{

do
{
px=px+1;
pbase=surface(px,py,project,GetScreen());
SDL_BlitSurface(project,NULL,GetScreen(),&pbase);
SDL_Flip(GetScreen());


}while(px+32<=max_largeur);


}


class Monstres
{
private:
SDL_Surface *monstre;
SDL_Rect mbase;
int mx,my;

public:
Monstres(const char *nom_monstre,int x,int y);
~Monstres();
void affiche();
void deplacement();



};


#include "monstres.h"
#include "gestion.h"


const int min_hauteur = 0;
const int max_hauteur = 570;
const int max_largeur = 700;

Monstres::Monstres(const char*s,int x,int y)
{
monstre=load_imageSDL(s);
mx=x;
my=y;


}



Monstres::~Monstres()
{

SDL_FreeSurface(monstre);
}


void Monstres::deplacement()
{

detect();
mbase=surface(mx,my,monstre,GetScreen());

SDL_BlitSurface(monstre, NULL, GetScreen(),&mbase);

SDL_Flip(GetScreen());
if(mx < 0)
{
mx =1;
}



}

void Monstres::affiche()
{
mbase=surface(mx,my,monstre,GetScreen());
SDL_BlitSurface(monstre, NULL, GetScreen(), &mbase);

SDL_Flip(GetScreen());

}

#include "gestion.h"

class Joueur
{
private:
SDL_Surface *joueur;
SDL_Rect base;
int x,y;


public:
Joueur(const char *nom_fichier,int x, int y);
~Joueur();
void bas();
void haut();
void affiche_joueur();
SDL_Surface* get_joueur();
int getX();
int getY();
};


const int min_hauteur = 0;
const int max_hauteur = 570;
const int max_largeur = 700;

Joueur::Joueur(const char *nom_fichier,int px, int py)
{
joueur=load_imageSDL(nom_fichier);
x=px;
y=py;

}

Joueur::~Joueur()
{
SDL_FreeSurface(joueur);
}





void Joueur::bas()
{

while(Key(SDLK_DOWN))
{
detect();
y=y+1;
base=surface(x,y,joueur,GetScreen());

SDL_BlitSurface(joueur, NULL, GetScreen(),&base);

SDL_Flip(GetScreen());
if(y > max_hauteur)
{
y = max_hauteur -1;
}
}
}

void Joueur::haut()
{

while(Key(SDLK_UP))
{
detect();
y=y-1;
base=surface(x,y,joueur,GetScreen());
SDL_BlitSurface(joueur, NULL, GetScreen(),&base);

SDL_Flip(GetScreen());
if(y < min_hauteur)
{
y = min_hauteur;
}
}
}
void Joueur::affiche_joueur()
{
SDL_BlitSurface(joueur, NULL, GetScreen(), 0);

SDL_Flip(GetScreen());

}


SDL_Surface* Joueur::get_joueur()
{
return joueur;

}

int Joueur::getX()
{
return x;
}
int Joueur::getY()
{
return y;
}
#include "projectile.h"
#include "monstres.h"
#include "joueur.h"


const char *nom="rtype.bmp";
const char *pnom="projectile.bmp";
const char *mons="warning.bmp";

int main(int argc, char **argv)
{

//Initialisation
initSDL(800,600,16);
Joueur a(nom,0,100);
Monstres m(mons,500,300);

while(true)
{
detect();
if(Key(SDLK_ESCAPE)) break;
m.deplacement();
if(Key(SDLK_DOWN)) a.bas();
if(Key(SDLK_UP)) a.haut();
if(Key(SDLK_SPACE)){Projectile P(pnom);P.tir();}
}

return 0;
}
La fonction GetScreen() renvoie la surface ecran;
surface(...) renvoie un SDL_Rect sur le quel on applique une image

Au resultat cela me donne un vaisseau qui va de haut en bas et quand j'appuie sur espace cela genere un tir qui va tout droit et cela bloque le vaisseau tant que le tir n'arrive pas a la fin, puis le monstre reste sur place.
Voila je debute et j'essaie de faire un rtype avec SDL et apres je voudrais LE PORTER SUR Gp2x .
Si vous pouvez m'aider je pourrais avancer dans le developpement de jeux car j'adore la Gp2x donc svp Help-me

5

commence déjà par étudier et appliquer la solution que je te donnes plus haut.
Ne le prend pas mal il y a tout a refaire et si tu attends que l'on programme a ta place suivant ton code, c'est claire que tu n'avancera pas dans l'apprentissage !
Je veux absolument pas te décourager mais franchement, essaye d'étudier la structure d'un rtype(qui est assez complexe en soit) à l'aide d'un bic et une feuille, ensuite tu appliques ta structure en code.

Bon courage à toi wink

6

Merci beaucoup il n'y a pas de problemes je vais revoir du fond à la forme et je te dirais, je ne voulais pas que vous vous tapiez le code mais que vous me disiez ce qui ne va pas, ce que tu as fait merci je vais m'y mettre tu me conseil de faire autre chose comme jeux pour revoir ma facons de proceder ou e continuer ?
C'est juste pour que je progresse.


7

Deja, si tu pars vers une autre fonction pour le mouvement de ton projectile, c'est clair que tu ne peus plus rien faire tant que ta boucle n'est pas terminée (à moins que tu utilises des threads) il faut que tout (mouvement vaisseau, mvt ennemis, mvt tir, test tir, tests collisions...) soit effectuable au même moment.

Genre pour 1 ennemi: Dans la même boucle il faut que:
1) ton vaisseau puisse bouger d'une position
2) le tir puisse etre actif
3) si le tir estactif qu'il puisse avancer d'une position
4) ton ennemi puisse bouger d'une position (selon une trajectoire que tu définis)
5) que la colision ennemi-tir soit testée (avec résultat en conséquence)
6) que la collision ennemi-vaisseau soit testé (avec résultat en conséquence)

Si tu sors de cette boucle pour effectuer une de ces choses dans une autre boucle, tu ne pourra faire aucune autre action tant que ce que fait cette boucle n'est pas terminé.

Commence par un Space Invaders dans lequel il n'y aurait qu'un seul ennmi et pas de bouclier. Après essaie ton R-type smile

space_invaders.jpg

8

Marque page embarrassed
Moi aussi je suis sur un projet de Shmup horizontal sur GP2X et un peu d'aide est bienvenue smile