2009-08-08 7 views
3

Bien d'abord je suis surpris ActionScript 3.0 n'a pas de détection de collision basée sur les pixels.Comment faites-vous la détection de collision «rebondissante» avec Actionscript 3.0? (Avec vidéo)

Anyways J'utilise une bibliothèque de collision found here (je suis prêt à prendre une autre bibliothèque si nécessaire)

Je recorded a video pour mieux montrer ce que je suis en train de faire, bref je fais un côté jeu de défilement (comme mario) et je veux que mon sol (sol) agisse comme le sol fait ... quand l'utilisateur marche, il marche sur le sol, lol

Au début je pensais faire un "rebond" "effect où où" si l'utilisateur est X en dessous de la surface du sol puis le pousser vers le haut ". Cela semble bien, mais la seule façon que j'ai trouvée est que mon utilisateur continue de sauter une fois qu'il touche le sol (pas en vidéo).

Alors, est-ce que quelqu'un sait comment l'obtenir de sorte que lorsque mon utilisateur marche et qu'il monte la colline sur le sol, il fera aussi monter le personnage utilisateur?

Répondre

4

Un article a été posté aujourd'hui sur reddit.com à propos de pixel perfect collision detection in ActionScript 3 qui fait la partie détection de collision de votre problème.

La vraie logique sera ce qu'il faut faire lorsque vous détectez une collision. Cependant, avez-vous déjà remarqué que la plupart des jeux à défilement latéral utilisent une surface de marche plate?

Une idée (qui ne nécessite pas de détection de collision) consiste à utiliser une idée de type hauteur de la carte. Vous pouvez utiliser un tableau (ou les pixels d'une texture) pour déterminer la hauteur de chaque section de sol le long de votre surface. Lorsque votre personnage se déplace à travers la scène, il vous suffit d'indexer la position du personnage dans votre carte de hauteur.

// How many pixels each index of the heightMap contains. 
// You'll probably want to use the same value as the distance 
// your character moves when the move left/right key is pressed. 
const SECTION_SIZE:int = 10; 

// Fill this as a huge array with all the heights and 
// the size of this will be (mapHorizontalLengthInPixels/SECTION_SIZE). 
// Each element will be the distance from the top of the screen to 
// place the character so it looks like it is standing on the ground. 
var heightMap:Array = [ /* ... */ ]; 

// TODO: you might want to Tween to this value so it doesn't look chunky 
character.y = heightMap[character.x/SECTION_SIZE]; 

Pour utiliser une texture au lieu d'un tableau, vous venez de mettre chaque int qui aurait été mis dans le tableau heightMap en un seul pixel d'un objet BitmapData. L'avantage d'utiliser une texture est que vous pouvez stocker une grande quantité d'informations dans un petit objet BitmapData et utiliser getPixel32() pour le lire. Vous pouvez générer la carte une fois, l'enregistrer (comme un png) et l'intégrer ensuite dans le fichier SWF.

Si vous voulez vous faire plaisir, et vous le ferez probablement si vous voulez des plates-formes, des ponts, des objets en mouvement et plus encore ... alors utilisez un moteur physique 2d. Il y a déjà quelques projets open-source incluant APE, Box2dAS3, Fisix, et FOAM entre autres. La courbe d'apprentissage sera plus élevée et le codage plus difficile, mais il peut être payant pour vous à la fin. Heck, c'est une expérience elle-même d'en écrire une à partir de zéro si vous aimez!

+1

Merci pour votre aide! En fait, je suis passé à la bibliothèque de détection de pixels que vous avez mentionnée. Ce que j'ai fini par faire est de faire une bordure puis de faire ma terre deux objets différents. Donc, si mon joueur frappe la frontière alors la gravité arrête de tirer ect ... mais si mon joueur est dans le "fill" (passé la bordure) il continue de le pousser jusqu'à 3 pixels jusqu'à ce qu'il soit au dessus.Tant que la frontière pense que cela fonctionne étonnamment bien. Plus le nombre de pixels est faible, plus le son est lisse, plus le temps de pousser au-dessus de la bordure est long. –

2

Il semble que vous détectiez des collisions verticales avec le sol, mais en ignorant les collisions horizontales. Mais plutôt que de simplement vous arrêter en frappant un objet horizontal (par exemple, un changement de 1 pixel dans le sol serait traité comme un mur, et vous devrez sauter par-dessus), vous devrez pousser le joueur vers le haut. de l'objet. Vous voudriez aussi avoir une coupure ici, donc le joueur ne sera pas poussé au sommet des murs quand il les frappera. Ainsi, quelque chose comme, lorsqu'une collision horizontale est détectée, déplace le joueur vers le haut de l'objet, à moins que le sommet de l'objet ne soit> 10 pixels de l'emplacement actuel.

Questions connexes