Pages: [1] 2   Bas de page
Imprimer
Auteur Fil de discussion: Création & gestion des ennemis simple ou IA (sprite, move, delete...)  (Lu 8512 fois)
0 Membres et 1 Invité sur ce fil de discussion.
angeredil Hors ligne
Full Member
***
Messages: 118


Voir le profil
Patience est l'écho du temps !

« 24 Octobre 2008, 09:53:31 »


Un tutorial bien complet sur la création des ennemis (sprite, move, delete...)
sans passer par une IA ou alors les deux de manière single ou IA
(avec gestion de plusieurs ennemis serais vraiment bienvenue... ou autres).

Voilà, si vous avez des codes à proposer le tuto est ouvert ...
Ceux qui veulent décrire le process de création ennemis...
Azn
Journalisée
morukutsu Hors ligne
Hero Member
*****
Messages: 500


Voir le profil
Noctambule

« Réponse #1 : 24 Octobre 2008, 12:00:18 »

Cela dépend que ce que tu entend par IA ou pas IA.
Car tout ennemi qui bouge tout seul à une IA, aussi sommaire soit-elle.

Moi je veux bien faire un petit truc mais ça ne servira pas a grand chose.
La gestion des ennemis est propre à chaque moteur Wink

Vous pouvez me contredire mais à mon avis, les ennemis etc c'est un problème de conception de ton moteur que tu devrais pouvoir résoudre seul. ça ne demande pas un niveau de programmation élevé mais plutôt de l'expérience. Il faut déjà essayer de résoudre des problèmes simples avant de s'attaquer à "l'IA".

Entre autres, si tu te sers toujours du code de l'exemple de la PAlib alors tu ne progressera jamais. Pour créer ton jeu re-pomper du code n'est pas interdit mais encore faut-il le comprendre ce code Wink
Il faut essayer de créer ton propre système par toi même !
La dernière fois que je t'avais aidé j'avais bien vu que tu ne comprenais pas le code et que tu modifiais des choses dedans sans vraiment savoir ce que ça fait.

Je pourrais toujours poster quelques exemples de création d'ennemis mais ça ne servirait pas à grand chose puisque tu ne saurai certainement pas comment les utiliser dans ton moteur. Et si tu y arrivait, ça serait peut être du copier-coller...

Pour finir, je pense que tu devrais dire ce que tu ne comprends pas dans la programmation de jeux en général. Histoire de bien saisir le problème de l'IA.
Donc si tu as des questions la dessus, n'hésite pas, moi ça ne me dérange pas d'aider mais il faut que mon aide soit utile pour toi.
Journalisée
The_Pimousse Hors ligne
Sr. Member
****
Messages: 353


Voir le profil
« Réponse #2 : 24 Octobre 2008, 12:46:53 »

Je n'aurais pas dit mieux que morukutsu ....
Il faut d'abord savoir ce que doit faire un ennemi, 3 exemples :
1/ la boule d'un casse-brique, oui je considere que la "boule" d'un casse-brique est un ennemi, car c'est elle qui me fait perdre. Et bien son intelligence pourtant se limite a rebondir contre les murs, la palette et les briques bien sur... donc c'est tres facile à coder.
2/ les vaisseaux d'un 'space invader' : ce sont les ennemis, mais pourtant leur intelligence est aussi tres limitee, ils se contentent de bouger vers le bas et eventuellement de lancer quelques missiles a des intervalles reguliers. Par contre il meurt apres qu'il soit touche (1, 2 ou 3 fois peut etre), pas complique non plus, quelques variables qui prennent en compte sa position sa vie et le tour est joue
3/ enfin : les mechants qui viennent du monde de l'ombre via les teleporteurs par 3 ou 4 et qui doivent etre tues en meme temps dans Zelda TP .... et bien ... ils sont mechants ... ils viennent tous t'attaquer (en restant dans le cercle du quel tu ne peux pas t'echapper), mais bien sur ils ne se font pas de degats à eux meme, et si tu arrives a en tuer 3 sur 4 .... celui qui reste "soigne" ceux qui sont morts et ils reviennent à la vie .... et tu repars pour un tour. Bref, un ennemi doit prendre en compte l'environnement (le sol, les murs), ton personnage, lui meme (ses points de vie) et surveiller ses collegues au cas ou il faut qu'il les repare, voire que lui soit repare..... c'est pas evident, evident quand meme ... et encore ce type d'ennemis n'a pas beaucoup de type attaque ... il vient betement mordre le heros.

Bref, d'abord savoir ce que doivent faire les mechants, donc tout dependra du jeu.
« Dernière édition: 24 Octobre 2008, 12:48:37 par The_Pimousse » Journalisée

L'experience, c'est le nom que l'on donne a ses erreurs
MasterDje Hors ligne
Diet Coke Addict
Global Moderator
*****
Messages: 3249


Voir le profil WWW
« Réponse #3 : 24 Octobre 2008, 12:58:21 »

très bons exemples, The Pimousse !! (zelda TP, j'essuie une larme, quel jeu Azn )

Peut-être peux-tu aller un poil plus loin dans le détail de l'algo des 2 premiers cas ??

ça rendrait service à pas mal de monde, je pense (  whistle ), ceux qu'ont tendance à animer chaque sprite un par un (re  whistle ) Azn
Journalisée

morukutsu Hors ligne
Hero Member
*****
Messages: 500


Voir le profil
Noctambule

« Réponse #4 : 24 Octobre 2008, 17:25:02 »

Pour un casse brique, c'est à peu près ça.
1) On définit quelques structures
Code:
//Structure d'une balle du casse briques
struct sBall
{
int x, y;         //Position de la balle dans le monde
int vx, vy;       //Vecteur de déplacement
int vitesse;      //Vitesse de la balle
int taille;       //Largeur de  la balle

int sprite;       //Spéficique a votre lib, identifiant du sprite pour l'affichage
};

//Structure de la raquette
struct sRaquette
{
int x, y;              //Position de la raquette dans le monde
int hauteur, largeur;  //Taille de la raquette
int vies;              //Vies

int sprite;            //Spéficique a votre lib, identifiant du sprite pour l'affichage
};

//Structure d'une brique
struct sBrique
{
int hauteur, largeur;  //Taille de la brique

int sprite;            //Spéficique a votre lib, identifiant du sprite pour l'affichage
};

//Structure du monde
struct sWorld
{
int hauteur, largeur;  //Taille du monde en pixels
bool map[10][5];       //Map des briques composant le monde, true si il y a une brique sinon false. 10 et 5 sont respectivement le nbr. de briques en largeur et le nbr. de briques en hauteur
};

Ensuite, on commence le code du jeu :
2)La fonction de collision entre deux rectangles
Code:
//Fonction de collision : Teste l'intersection de deux rectangles
bool RectCollision(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2)
{
    if(x1+w1<x2) return false;
    if(x2+w2<x1) return false;
    if(y1+h1<y2) return false;
    if(y2+h2<y1) return false;
    return true;
}

3)On ouvre la fonction main et on définit quelques variables :
Code:
//Fonction main
int main()
{
//Monde
sWorld world;
world.largeur = 256;
world.hauteur = 192;

//Briques composant le monde : On remplit tout le monde de briques
//La syntaxe de la boucle suivante est classique quand on parcours un tableau à deux dimensions
for(int x = 0; x < 10; x++)
{
for(int y = 0; y < 5; y++)
{
world.map[x][y] = true;    //On remplit le monde avec une brique
}
}

//Définition d'une brique de base
sBrique brique;
brique.x = brique.y = 0;
brique.largeur = 20;
brique.hauteur = 5;
brique.sprite = 1;

//Définition de la raquette
sRaquette raquette;
raquette.largeur = 25;
raquette.hauteur = 5;
raquette.x = (256/2)-(raquette.largeur/2); //Moyen typique de centrer un objet a l'écran : on positionne l'objet a la moitié de l'écran et on soustrait la moitié de la largeur de l'objet
raquette.y = 180;

//Définition de la balle
sBall balle;
balle.taille = 4;
balle.x = raquette.x + ((raquette.largeur/2)-(balle.taille/2));
balle.y = raquette.y - 5;
balle.vx = 1; //On définit le vecteur de déplacement de la balle
balle.vy = -1; // v(1,1) -> La Balle se dirige direction (haut, droite)
balle.vitesse = 3;

4)Puis les algos importants du jeu :
-Déplacer la balle
Code:
//Boucle Principale
while(true) //Sur DS, peut importe ce qui se passe après la boucle principale donc on peut faire une boucle "impossible" à quitter
{
//On met à jour la position de la balle
balle.x = balle.x + balle.vx*balle.vitesse; //On ajoute a la position de la balle le produit de la composante x de son vecteur de déplacement et de sa vitesse
balle.y = balle.y + balle.vy*balle.vitesse; //Idem pour y

-Deplacer la raquette
Code:
//On met à jour la position de la raquette
if( touche_gauche_appuyee() )
raquette.x = raquette.x - 2;
if( touche_droite_appuyee() )
raquette.x = raquette.x + 2;

-Collisions entre la balle et les bords
Code:
//On teste les collisions de la balle avec le monde
if(balle.x <= 0 || balle.x + balle.taille >= world.largeur)
balle.vx = -balle.vx;  //Petite subtillité, dès que la balle touche un mur, on inverse la bonne composance de son vecteur de direction
if(balle.y <= 0)
balle.vy = -balle.vy;  //Quand la balle touche la ligne du haut, elle repars en bas !
if(balle.y > world.largeur)
break; //Si la balle touche la ligne du bas, on perd ! (break sort de la boucle principale => donc écran noir, en vrai il faudrait perdre une vie et recommencer le jeu, etc ...)

-Collisions entre la balle et la raquette
Code:
//On teste les collisions entre la balle et la raquette
if(RectCollision(balle.x, balle.y, balle.taille, balle.taille, raquette.x, raquette.y, raquette.hauteur, raquette.largeur) == true)
{
//On renvoie la balle vers le haut
balle.y = -balle.y;
}

-Collisions entre la balle et les briques
Code:
//On teste les collisions entre la balle et les briques
for(int x = 0; x < 10; x++)
{
for(int y = 0; y < 5; y++)
{
//On teste si il y a une brique a cet endroit
if(world.map[x][y] == true)
{
//On teste les collisions entre la brique et la balle
if(RectCollision(balle.x, balle.y, balle.taille, balle.taille, x*brique.largeur, y*brique.hauteur, brique.largeur, brique.hauteur) == true)
{
//Si oui, on envoit la brique dans l'autre sens (sur l'axe y)
balle.vy = -balle.vy;
//On retire la brique
world.map[x][y] = false;
}
}
}
}

5)Pour finir on affiche tout et on finalise le code :
Code:
//On affiche tout les sprites
//Briques
for(int x = 0; x < 10; x++)
{
for(int y = 0; y < 5; y++)
{
//On teste si il y a une brique a cet endroit
if(world.map[x][y] == true)
{
affiche(brique.sprite, x*brique.largeur, y*brique.hauteur);
}
}
}

//Balle
affiche(balle.sprite, balle.x, balle.y);

//Raquette
affiche(raquette.sprite, raquette.x, raquette.y);
}

return 0;
}

Ce code est bien entendu très sommaire et il contient p'tet quelques erreurs ou oublis. Cependant, c'est une bonne base pour comprendre "l'IA" d'un casse-brique. Il introduit quelques concepts comme les tile maps qui ne sont pas toujours facile à comprendre.



Journalisée
Campanile Hors ligne
Elite Member
**
Messages: 925


Voir le profil WWW
sic

« Réponse #5 : 24 Octobre 2008, 17:54:02 »

Tu vois, par exemple pour un casse brique, il te faut :

Mince, grilled par morukutsu, j'efface tout, c'était à peu prés pareil whistle
Journalisée

L'expérience, c'est ni plus ni moins qu'une petite quantité d'information qui aurait été fort utile quelques secondes avant qu'on l'apprenne...
morukutsu Hors ligne
Hero Member
*****
Messages: 500


Voir le profil
Noctambule

« Réponse #6 : 24 Octobre 2008, 18:04:26 »

Arf, désolé  Azn
Journalisée
MasterDje Hors ligne
Diet Coke Addict
Global Moderator
*****
Messages: 3249


Voir le profil WWW
« Réponse #7 : 24 Octobre 2008, 21:59:10 »

Bon, y a deja ce tuto de casse brique, alors je laisse mon tuto "minmax alpha/beta Vs réseau neuronal en notation polonaise inversée avec rotation de bits" pour plus tard... je voudrais pas avoir l'air de me la péter,  whistle

Sinon, Morukutsu, celle là, j'adore :
Citation de: morukutsu
On remplit le monde avec une brique
ce à quoi je repondrai :
We don't need no education
We dont need no thought control...


Franchement, ce post, tu le reprends un ptit coup en copié coller et tu ouvres un post TUTO ! ok ?
parce que sinon, je vais le faire à ta place, et moi, je mérite pas d'avoir mon nom en face, mais toi si  Wink
Journalisée

SpixSh@dow Hors ligne
Sr. Member
****
Messages: 262


Voir le profil WWW
« Réponse #8 : 24 Octobre 2008, 22:07:38 »

Une petite demo.nds pour accompagner ce tuto morukutsu ?  whistle whistle

Merci pour ce tuto , il est trés bien détaillé Wink
Journalisée

Spix .... Sh@dow !

=> Mon Dev'Forum
morukutsu Hors ligne
Hero Member
*****
Messages: 500


Voir le profil
Noctambule

« Réponse #9 : 24 Octobre 2008, 22:18:57 »

Citation
Une petite demo.nds pour accompagner ce tuto morukutsu ?
Je vais essayer d'en faire un quand j'aurai fini de me battre avec le code mon jeu.... *satanés bugs*
Dès que j'aurai un petit peu de temps je m'en occuperai Langue

Citation
We don't need no education
We dont need no thought control...
Pink Floyd  Cheesy
Journalisée
SpixSh@dow Hors ligne
Sr. Member
****
Messages: 262


Voir le profil WWW
« Réponse #10 : 24 Octobre 2008, 22:29:36 »

Coooool , merci Wink
Journalisée

Spix .... Sh@dow !

=> Mon Dev'Forum
angeredil Hors ligne
Full Member
***
Messages: 118


Voir le profil
Patience est l'écho du temps !

« Réponse #11 : 27 Octobre 2008, 14:24:29 »

Sympa le casse brique... pour faire un casse brique ! Wink

Je dois avoir un problème de scroll avec mon ennemi, il se déplace en même temps que mario et dans la même direction, avec un écart en fonction des positions initiales.

On avait déjà abordé le sujet dans des posts antérieur .... comme c'est tuto ici je ne préfère pas le rabattre ! (->tous de même si qqun trouve l'erreur, je suis preneuse)

Les collisions et les pointeurs c'est ce qui bloque le plus...quand au moteur IA tous ça c'est peu simple...

Ma fonction MoveEnnemi n'est pas au point ... il bloque à nouveau.

J'ai testée avec ton casse brique mais ça ma fait rétrograder alors je préfère chercher autrement.
« Dernière édition: 05 Novembre 2008, 18:33:54 par angeredil » Journalisée
EvilTroopa Hors ligne
Administrateur
*****
Messages: 649


Voir le profil WWW
1010011010 the Number of the Beast

« Réponse #12 : 27 Octobre 2008, 15:00:39 »

Si je peux m'faire mettre (sic!), tu as visiblement un problème d'algo. J'ai l'impression que tu as repris l'exemple plateformeXX, que tu as voulu améliorer, mais ce n'est pas la bonne solution.

Selon moi, un exemple est là pour introduire une idée, une méthode, te montrer les tenants et aboutissants, mais, en aucun cas, ne devrait être une base de travail.

Je te conseille de repartir de zéro, de bien comprendre chaque étape de ton algorithme (en t'inspirant de l'exemple notamment) et tu trouveras sûrement où ça merdouille.
J'ai pour habitude d'effacer et de réécrire plusieurs fois mon code (ou partie de code) quand je vois que j'ai un problème. Ça me permet de bien m'en imprégner. Souvent, j'arrive même à l'optimiser, parce qu'après plusieurs essais, j'ai une vision plus large de mon travail.

Allez ! Courage Langue

Hey ! Teacher ! Leave those kids alone !
Journalisée

A mushroom a day, keeps the koopas away.
morukutsu Hors ligne
Hero Member
*****
Messages: 500


Voir le profil
Noctambule

« Réponse #13 : 27 Octobre 2008, 16:12:59 »

Citation
J'ai testée avec ton casse brique mais ça ma fait rétrograder alors je préfère chercher autrement.
Non Sad
Le Casse Brique est un problème simple à résoudre.
Le jeu de plateforme est un problème compliqué qui n'est que la combinaison de plusieurs problèmes simples.
Donc avant de résoudre les problèmes compliqués, il faut pouvoir résoudre les problèmes simples Smiley

Citation
Je dois avoir un problème de scroll avec mon ennemi, il se déplace en même temps que mario et dans la même direction, avec un écart en fonction des positions initiales.
La solution à ce problème simple tiens en maximum deux lignes.

Sinon je plussoie Spoon Azn
Journalisée
angeredil Hors ligne
Full Member
***
Messages: 118


Voir le profil
Patience est l'écho du temps !

« Réponse #14 : 27 Octobre 2008, 17:49:36 »

Oui c'est un problème d'algo là je vais le retaper à zéro !
Journalisée
Pages: [1] 2   Haut de page
Imprimer

Aller à: