Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 6 sur 6
  1. #1
    Candidat au titre de Membre du Club
    Homme Profil pro
    Inscrit en
    décembre 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Italie

    Informations forums :
    Inscription : décembre 2008
    Messages : 30
    Points : 12
    Points
    12

    Par défaut Enlever des sprites à un groupe et formes complexes

    Bonjour à tous,
    J'ai deux questions, à propos de pygame et des sprites.

    - La première est purement technique : si j'ai un "group" de sprites, y'a-t-il une manière facile d'enlever le premier/dernier élément ajouté ? J'ai lu quelque part que group.remove() acceptait un entier en entrée pour l'index de l'élément à enlever. Mais quand j'essaye, même si ça ne plante pas, il n'enlève aucun élément au group. La seule façon que j'ai trouvé est d'avoir une deuxième liste, une bête liste, avec les même objets que dans le group, comme ça pour enlever un sprite dans la première, je fais appel à la seconde avec un truc du style group.remove(liste(-1)). Mais évidemment, du coup j'ai deux listes au lieu d'une, ce n'est pas très pratique...
    Je suis sûr qu'il y a un meilleur moyen de faire ça, quelqu'un a une idée ?

    - La seconde est plus générale. Bon, les sprites, rect et tout, c'est super... mais c'est rectangulaire. Que me conseilleriez-vous pour détecter des collisions entre un point et un objet (que je cherche donc à construire) ayant une forme plus complexe ? Ma première idée était de faire un ensemble de rect assez petits pour approximer la forme en question, mais je ne sais pas trop comment faire ça bien (disons en partant d'une image de l'objet en question, qui a des contours évidemment bien définis).Une idée ?

    Merci d'avance de vos lumières !

  2. #2
    Membre chevronné
    Homme Profil pro
    Inscrit en
    avril 2004
    Messages
    746
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 746
    Points : 776
    Points
    776

    Par défaut

    pour la 1, je me suis toujours passé de la class sprite ...
    mais:
    Group.remove(*sprites): return None

    Remove any number of Sprites from the Group. This will only remove Sprites that are already members of the Group.

    Each sprite argument can also be a iterator containing Sprites.
    c'est donc genre:
    mongroup.remove([unsprite, unautresprite,[foosprite,barsripte,...],...])
    et non pas un int ...

    pour la 2 je dirai: lire le niveau alpha directement ou à partir d'un mask.

  3. #3
    Membre Expert
    Inscrit en
    août 2010
    Messages
    950
    Détails du profil
    Informations forums :
    Inscription : août 2010
    Messages : 950
    Points : 1 004
    Points
    1 004

    Par défaut

    1/ si tu n'as qu'un groupe, sprite.kill() (personnellement je n'utilise plus les classes group non plus)

    2/ Tout dépend si tu as besoin d'une collision exacte des pixels, ou d'approximations géométriques (chaque objet est alors une réunion de formes -rect,circle-)

  4. #4
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    mars 2006
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : mars 2006
    Messages : 832
    Points : 1 061
    Points
    1 061

    Par défaut

    Salut,

    Citation Envoyé par Bénarès77 Voir le message
    Bon, les sprites, rect et tout, c'est super... mais c'est rectangulaire. Que me conseilleriez-vous pour détecter des collisions entre un point et un objet (que je cherche donc à construire) ayant une forme plus complexe ? Ma première idée était de faire un ensemble de rect assez petits pour approximer la forme en question, mais je ne sais pas trop comment faire ça bien (disons en partant d'une image de l'objet en question, qui a des contours évidemment bien définis).Une idée ?
    Le plus petit rectangle c'est le pixel. Le moyen le plus utilisé à l'époque des jeux 2D était le registre de collision, En gros on bascule un flag quand on pose un pixel de sprite alors que l'emplacement est déjà occupé par un pixel d'un autre sprite ou du décor. C'était souvent fait en hardware. Pour le faire par soft, il faut descendre à un niveau beaucoup plus bas que celui de pygame, il faudrait idéalement utiliser la SDL et coder cette détection en utilisant plusieurs calques (sprite1 .... sprite x, décor...). Bon courage.

    A+

    Pfeuh

  5. #5
    Candidat au titre de Membre du Club
    Homme Profil pro
    Inscrit en
    décembre 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Italie

    Informations forums :
    Inscription : décembre 2008
    Messages : 30
    Points : 12
    Points
    12

    Par défaut

    Bonjour à tous,

    Désolé du temps de réponse imprévu. Je vous remercie de vos réponses. Pour la 1, je vais effectivement laisser tomber les groupes de sprites (à VV33D ; précisément, je ne peux pas faire sprite.kill(), puisque l'objet sprite est ce que je veux retrouver, je ne sais pas si tu vois ce que je veux dire), en attendant de peut-être laisser tomber les sprites eux-mêmes. Pour la 2, je vais utiliser une méthode intermédiaire je pense : je vais "paver" la forme avec des rectangles de différentes tailles (une dizaine, ou une vingtaine), mais sans descendre jusqu'au pixel. Je n'ai pas besoin que ça soit ultra précis dans tous les cas, et les formes en question ne sont pas ultra tordues.

    Merci !

  6. #6
    Membre chevronné
    Homme Profil pro
    Inscrit en
    avril 2004
    Messages
    746
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 746
    Points : 776
    Points
    776

    Par défaut

    "Que me conseilleriez-vous pour détecter des collisions entre un point et un objet"

    Mais pourquoi ne veux-tu pas lire la valeur du point en question ? Ca prendra moins de temps que de collidelist() une vingtaine de Rects ...

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •