CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Détections de collisions

lag-it
lag-it
Niveau 10
14 juin 2003 à 11:49:21

Je suis en train de faire un petit jeu de plateforme sur ma ti 89 ( ne me parlez pas de direct X donc ) et je voudrais savoir comment faire des test de collisions pour mes sprites ( qui se présentent sous la forme d´un tableau pour ceux qui connaissent ) .
Le monde est basé sur des tiles, mais je ne veux pas de if( monde[y][x] == 1 ) . .. car cela m´empêche de faire des tiles en pente, etc.
Je pense pouvoir utiliser la fonction GetPix(els) ou encore peek_bit, mais j´aimerai votre avis.
Je n´attend pas en réponse un code source complet près à fonctionner mais plutôt la manière de procéder. Merci.

Altonfrere
Altonfrere
Niveau 10
14 juin 2003 à 11:59:01

Bin je crois pas qu´il y ait 36 méthodes, une dizaine peut etre lol

Déjà tu peux creuser cette idée pour l´adapter à ton système :

1- Test de base if ( monde[y][x] == 1), si c´est faux bin tu zappes, sinon tu affines le test :

2- Suivant la direction de déplacement de ton sprite :

Direction droite : tu testes pixel par pixel en commencant par la colonne de droite ( width) de ton sprite et la colonne gauche du sprite qui bloque ( en l´occurrence 0)

Direction gauche : tu testes pixel par pixel en commencant par la colonne gauche ( 0) de ton sprite et la colonne droite ( width) du sprite qui bloque

Direction haut : tu testes pixel par pixel en commencant par la ligne du haut ( 0) de ton sprite et la ligne du bas ( height) du sprite qui bloque

Direction bas : tu testes pixel par pixel en commencant par la ligne du bas ( height) de ton sprite et la ligne du haut du sprite qui bloque ( height)

En supposant que ta couleur " transparente" est 0, tu peux faire tes tests avec :

if ( MonSprite[x][y] & SpriteBloquant[x][y])

et tu sors de la boucle dés qu´il y a un pixel en commun -> collision

etc . ..

3- Une autre solution + efficace :

Tu calcules la zone d´interesection ( le cadre quoi) en gros tu as :

MonSprite : Xmin1,Ymin1,Xmin1+Width1,Ymin1+Height1
SpriteBloquant : Xmin2,Ymin2,Xmin2+Width2,Ymin2+Height2

Tu calcules l´intersection de ces 2 zones, soit :

XminIntersection,YminIntersection,XmaxIntersection
,YmaxIntersection

et tu testes quels sont les pixels ( de chacun des sprites) qui se superposent..

voilà

Altonfrere
Altonfrere
Niveau 10
14 juin 2003 à 12:03:13

euh quand je dis " quels sont les pixels qui se surperposent" tu sors dés qu´il y en a un bien sur : )

lag-it
lag-it
Niveau 10
14 juin 2003 à 12:06:59

Merci pour ta réponse rapide.
C´est vrai, je vais faire ca par affinage.

Altonfrere
Altonfrere
Niveau 10
14 juin 2003 à 12:09:14

Choisi plutôt le calcul de l´intersection c le + rapide... et puis ca te permet de gérer facilement les déplacements en diagonale : )

Lightness1024
Lightness1024
Niveau 10
14 juin 2003 à 13:37:54

int get_pixel(int x,int y)
{
return ! !(peek(0x4c00+30*y+(x>>3))&(1<<(~x&7)));
}

voila une fonction rapide de detection de la couleur d´un pixel.
je l´ai chopé dans le projet Cave Blaster.

JeanYvesYves
JeanYvesYves
Niveau 10
14 juin 2003 à 15:22:33

MOi je te conseille la solution numéro 3 de Aitonfrere : la boit englobante. C bien plus facile et moins couteux de calculer les collisions ainsi.

JeanYvesYves
JeanYvesYves
Niveau 10
14 juin 2003 à 15:31:29

autres astuces bien sympas :

Surcharge chaque sprite, qui, normalmeent, sont juste un x, un y et une bitmap de :
LE POINT CHAUD & le POINT D´ACTION

POINT CHAUD :
quand tu affiches un pixel, le point d´affichage que tu définis est souvent le point supérieur gauche du sprite.
Avec une simple addition tu peux définir le point chaud de chaque sprite qq part. Genre pour un gars, tu le définis dans les pieds :
avantage certain : si le mec tombe raide, tu n´as pas a faire boger le sprite, le point chaud étant statique dans les pieds, tout s´accorde.

POINT d´ACTION :
pour le test de collision : au lieu de tester le chevauchement de 2 boites englobantes, teste la présence du point d´action d´un sprite dans la boite englobante de l´autre:
avantages : moins de calculs,
ET :
Surtout ! !
définir les points de collisions principaux : genre un exemple : un mec qui tape : tu lui fous le point d´action dans le poing :
et comme ça, la collision est valide si le POING touche l´autre. et non pas si une partie quelconque de son corps ( sa boite englobante) touche l´autre.
--> dans cet ex: tu n´as pas a tester si le mec est de face ou de dos a son adv du coup : )

C un concept bien sympa : )

lag-it
lag-it
Niveau 10
14 juin 2003 à 17:37:20

Merci à tous pour ces réponses, je vois comment procéder paintenat ; )
Lightness, toi qui programme sur ti, t´as déjà fait des trucs bien ?

Lightness1024
Lightness1024
Niveau 10
14 juin 2003 à 20:34:15

je pense que envahisseurs de l´espace est un projet pas trop mal : )

http://ti89clairnet.free.fr/jeux/envesp.zip
ou
http://membres.tripod.fr/Lightness1024/EnvEsp.zip

sinon j´ai fait un worms aussi ( en tibasic et j´ai galéré)

http://membres.tripod.fr/Lightness1024/Xworms1.zip

lag-it
lag-it
Niveau 10
14 juin 2003 à 20:52:40

Worms je l´avais déjà essayé : )
Sinon envhisseur c´est un phoenix like cool.

bonplan
bonplan
Niveau 6
15 juin 2003 à 11:22:29

la fonction donnée par Lightness
int get_pixel(int x,int y)
{
return ! ! (peek(0x4c00+30*y+(x>>3))&(1<<(~x&7)));
}
filée dans Cave Blaster est beaucoup, beaucoup plus efficace... c´est pour ça qu´elle est dans ce jeu à titre d´exemple!

lag-it
lag-it
Niveau 10
15 juin 2003 à 14:29:12

Ouai, je verrais.

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment