IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SDL Discussion :

2 Questions de base


Sujet :

SDL

  1. #1
    Membre actif Avatar de ironzorg
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 288
    Points : 245
    Points
    245
    Par défaut 2 Questions de base
    Dans le cadre du développement d'un jeu video en 2D ( vue de haut , non isométrique ) , je me suis posé deux questions quasi - essentielles au développement d'un jeu de shoot :

    - J'ais créé un menu qui gère les évènements de la souris , et je demande au prog de changer l'image de la surface lorsque la souris " passe " au dessus.
    Or, avant que l'image soit changée dans la surface il s'écoule quasiment 1 seconde !! Dans certains jeux , ce changement s'effectue en meme pas 20 ms... Comment en faire autant ?

    - Le systeme de tir est assez simple : j'ai défini des portées ( courte , moyenne et longue ) et en fonction de la portée de l'arme on inflige plus ou moins de dégats ... Mais je n'arrive pas a " dire au prog " : si l'ennemi est derriere un mur, ne lui retire pas de vie ... J'ai bien pensé a faire une fonction qui détermine en fonction des coordonnées des surfaces qui définissent le player et l'ennemi si le tir aboutit ou pas , mais je n'ai pas assez d'expérience en programmation pour cela ... Pouvez vous m'aider ?

    PS : une image du menu du jeu ...
    Nom : Tactical Forces.jpg
Affichages : 85
Taille : 34,8 Ko

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    - J'ais créé un menu qui gère les évènements de la souris , et je demande au prog de changer l'image de la surface lorsque la souris " passe " au dessus.
    Or, avant que l'image soit changée dans la surface il s'écoule quasiment 1 seconde !! Dans certains jeux , ce changement s'effectue en meme pas 20 ms... Comment en faire autant ?
    J'espère que tu ne charges pas l'image à partir du disque dur à chaque fois que ta souris passe sur le menu.
    Si ce n'est pas ça, on peut voir un peu de code ?

    - Le systeme de tir est assez simple : j'ai défini des portées ( courte , moyenne et longue ) et en fonction de la portée de l'arme on inflige plus ou moins de dégats ... Mais je n'arrive pas a " dire au prog " : si l'ennemi est derriere un mur, ne lui retire pas de vie ... J'ai bien pensé a faire une fonction qui détermine en fonction des coordonnées des surfaces qui définissent le player et l'ennemi si le tir aboutit ou pas , mais je n'ai pas assez d'expérience en programmation pour cela ... Pouvez vous m'aider ?
    Pour ça, cherche du côté des tests d'intersection à base de rayon :
    http://jeux.developpez.com/faq/3d/?p...TERSECTIONS_ou

  3. #3
    Membre actif Avatar de ironzorg
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 288
    Points : 245
    Points
    245
    Par défaut
    Euh... Si je crois que je fait ça
    Je fait

    SDL_Surface *surface = NULL;

    surface = load_image("./GFX/image.png")

    if(souris.x == 25) par exemple
    {surface = load_image("./GFX/autre_image.png")}

  4. #4
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par ironzorg
    Euh... Si je crois que je fait ça
    Je fait

    SDL_Surface *surface = NULL;

    surface = load_image("./GFX/image.png")

    if(souris.x == 25) par exemple
    {surface = load_image("./GFX/autre_image.png")}
    Ah bien ce ne sera pas génial...
    Il faut charger une image une seule fois...

    Jc

  5. #5
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Citation Envoyé par ironzorg
    Mais je n'arrive pas a " dire au prog " : si l'ennemi est derriere un mur, ne lui retire pas de vie ... J'ai bien pensé a faire une fonction qui détermine en fonction des coordonnées des surfaces qui définissent le player et l'ennemi si le tir aboutit ou pas , mais je n'ai pas assez d'expérience en programmation pour cela ... Pouvez vous m'aider ?
    C'est un tantinet complique je suis tombe sur le meme probleme
    Il faut prendre l'algorithme de Bresenham qui determine la trajectoire d'un point ou du moins permet de tracer une ligne.
    A chaque fois que le projectile apparait sur l'ecran avec Bresenham ou bien a chaque position de mouvement il faut parcourir une liste d'objets voir si les coordonnees X et Y sont incluses dans la surface de l'objet ( pour faire simple on peut determiner si X et Y du projectile sont inclus dans un rectangle ) et alors il ya collision.
    Pour la liste d'objets std::vector est tres bien et souple d'emploi ou bien std::list

  6. #6
    Membre actif Avatar de ironzorg
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 288
    Points : 245
    Points
    245
    Par défaut
    OK je vais voir Bresenham... En revanche je n'utilise pas d'images de balle ( je sais que cela n'intervient en rien dans mon probleme mais comme l'a dit je ne sais plus trop qui , il vaut mieux plus que pas assez )
    Sinon pour mes boutons , je dois utiliser le heap apparemment ?? Je précise que je n'ais pas suivit de cours poussés en C++ ( voir meme aucun cours ), donc si vous pouviez expliciter votre réponse

  7. #7
    Membre confirmé
    Avatar de Mindiell
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    735
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 735
    Points : 546
    Points
    546
    Par défaut
    Tu n'as pas d'image de balle, c'est pas un souci. Si ta "grenade" explose, elle le fait à un endroit précis (X,Y) par exemple. Avec l'algorithme de Bresenham (si j'ai bien compris l'utilisation qui doit en être faite), tu peux rapidement calculer une ligne entre ton point d'explosion et les différentes cibles proches (contenues dans un grand rectangle de coordonnées (X-100, Y-100, X+100, Y+100) par exemple).

    A chaque fois qu'une ligne passe par un mur (ou un autre joueur, un sac de sable, etc...), tu peux considérer que le joueur "visé" est à l'abri.

    [EDIT]
    J'ai peut-être mal compris aussi. Si le tireur tire directement sur la cible (fusil et plus grenade), tu fais ta ligne entre le tireur et le visé afin de voir s'il y a un obstacle. C'est le même procédé
    [/EDIT]
    Mindiell
    "Souvent, femme barrit" - Elephant man

  8. #8
    Membre actif Avatar de ironzorg
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 288
    Points : 245
    Points
    245
    Par défaut
    J'ais rapidement regardé Bresenham ( sur Wikipédia ) mais l'algorythme présenté sert apparrement a tracer un ligne entre deux points ...J'avais autrement pensé à établir l'équation de la droite entre les points qui déterminent le centre des images ( X1;Y1 et X2;Y2 ) et vérifier qu'aucune autre image n'a ses coordonnées qui vérifient l'équation de la droite ...

  9. #9
    Membre actif Avatar de ironzorg
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 288
    Points : 245
    Points
    245
    Par défaut
    Euh... Cela n'inspire personne ?

  10. #10
    Membre confirmé
    Avatar de Mindiell
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    735
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 735
    Points : 546
    Points
    546
    Par défaut
    Ben si... Depuis nos dernières réponses t'as fait des tests ?
    Mindiell
    "Souvent, femme barrit" - Elephant man

  11. #11
    Membre actif Avatar de ironzorg
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 288
    Points : 245
    Points
    245
    Par défaut
    Euh ... J'ais fait surtout des corrections de bugs ...
    J'espère que tu ne charges pas l'image à partir du disque dur à chaque fois que ta souris passe sur le menu.
    Si ce n'est pas ça, on peut voir un peu de code ?
    En fait j'ais créé un tableau avec deux surfaces ( une pour l'écriture en noir et une autre pour l'écriture en blanc ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int i = 0;
    SDL_Surface *Texte[1] = {NULL};
    Texte[0] = load_image("./GFX/Texte1.bmp");
    Texte[1] = load_image("./GFX/Texte2.bmp");
     
    'boucle'
     
    if(mouse_motionX == 250)
    {i++;}
    else{i = 0; }
    Apres quelques essais : toujours un petit dixieme de seconde ...
    Cela me convient mais par curiosité j'aimerais savoir comment implémenter tout ça

  12. #12
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par ironzorg
    Apres quelques essais : toujours un petit dixieme de seconde ...
    Cela me convient mais par curiosité j'aimerais savoir comment implémenter tout ça
    Il faudrait un code minimal + les images pour tester

    Jc

  13. #13
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Citation Envoyé par ironzorg
    [CODE]
    int i = 0;
    SDL_Surface *Texte[1] = {NULL};
    Texte[0] = load_image("./GFX/Texte1.bmp");
    Texte[1] = load_image("./GFX/Texte2.bmp");
    Je suis peut être un peu rouillé mais SDL_Surface * Texte[1] reserve 1 SDL_Surface* donc l'indice max est 0, Texte[1] est hors borne. Pour charger 2 images il faut déclarer SDL_Surface * Texte[2];
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  14. #14
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par hegros
    Je suis peut être un peu rouillé mais SDL_Surface * Texte[1] reserve 1 SDL_Surface* donc l'indice max est 0, Texte[1] est hors borne. Pour charger 2 images il faut déclarer SDL_Surface * Texte[2];
    Ce n'est pas faux mais je ne pense pas que ce soit la source du problème puisque cela devrait provoquer un comportement indéfini certes, mais pas au point de rendre le code plus lent.

    Soit ca passe dans ce cas, soit cela provoquerait un segmentation fault (enfin, pas obligatoirement je l'accorde mais bon)...

    Jc

  15. #15
    Membre confirmé
    Avatar de Mindiell
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    735
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 735
    Points : 546
    Points
    546
    Par défaut
    le m'étonne pas mal aussi. Même si, effectivement, je ne pense pas qu'il soit responsable du ralentissement.
    Mindiell
    "Souvent, femme barrit" - Elephant man

  16. #16
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Non, pas de souci de ce côté, c'est un truc qu'on utilise souvent pour initialiser tous les éléments d'un tableau à la même valeur.

  17. #17
    Membre confirmé
    Avatar de Mindiell
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    735
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 735
    Points : 546
    Points
    546
    Par défaut
    ah ? Ok, merci je ne connaissais pas cette technique.
    Mindiell
    "Souvent, femme barrit" - Elephant man

  18. #18
    Membre actif Avatar de ironzorg
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 288
    Points : 245
    Points
    245
    Par défaut
    Je suis peut être un peu rouillé mais SDL_Surface * Texte[1] reserve 1 SDL_Surface* donc l'indice max est 0, Texte[1] est hors borne. Pour charger 2 images il faut déclarer SDL_Surface * Texte[2];
    Ah bon ? Pourtant le tableau commence a Texte[0] , cela ne convient pas ??
    et puis :
    cela devrait provoquer un comportement indéfini
    Mais qu'est ce que cela veut dire ?!?

  19. #19
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Ah bon ? Pourtant le tableau commence a Texte[0] , cela ne convient pas ??
    Il commence à l'indice 0, mais comme il n'y a qu'un élément il finit également à l'indice 0. Donc 1, ça dépasse.

    Mais qu'est ce que cela veut dire ?!?
    Un comportement indéfini, c'est un comportement incorrect mais dont l'effet ne peut pas être déterminé précisément. Par exemple écrire à une adresse mémoire non réservée : ça peut crasher ou ne rien faire, selon l'adresse.

  20. #20
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Et sans le code, on ne pourra aider plus...

    Jc

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Question de base sur les classes
    Par deaven dans le forum C++
    Réponses: 3
    Dernier message: 27/11/2005, 16h20
  2. Réponses: 4
    Dernier message: 20/11/2005, 21h46
  3. question de base
    Par tuxedo dans le forum Langage SQL
    Réponses: 11
    Dernier message: 05/04/2005, 15h28
  4. [Débutant] Question de base sur le BDE et les SGBD
    Par Invité dans le forum Bases de données
    Réponses: 3
    Dernier message: 15/03/2005, 08h45
  5. Question de base
    Par xinu1.1 dans le forum PostgreSQL
    Réponses: 8
    Dernier message: 03/02/2005, 22h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo