Skip to main content

Indie game storeFree gamesFun gamesHorror games
Game developmentAssetsComics
SalesBundles
Jobs
TagsGame Engines
0
Members

Fonctionnement de LookAt en 2D

A topic by JoeKehr created Jan 17, 2016 Views: 554 Replies: 3
Viewing posts 1 to 4

Bonjour,

Je suis en train de me familiariser avec Superpowers en essayant de faire un jeu tout simple en top-down.

J'ai vu qu'il y avait une méthode lookAt qui me paraissait utile pour faire regarder mon personnage vers la souris. Lorsque je l'utilise, l'orientation de mon personnage change bien, mais il ne s'affiche plus. C'est peut-être dû à ma caméra qui est en orthographique?

Par contre, la méthode lookTowards n'a l'air d'opérer aucun changement sur mon personnage.

Est-ce qu'il y a un moyen simple (hors calculs trigonométriques) pour le faire qui existe dans Superpowers?


Merci d'avance,


PS : Je ne sais pas si j'ai été clair, donc n'hésitez pas à me demander des explications :)

(2 edits)

Salut ! Moi aussi j'ai du mal avec le LookAt(), donc j'ai fait mon propre truc ^^

D'abord, tu crée un acteur avec un sprite (n'importe lequel, mais assez grand, voire même plus grand que ce que l'on voit in-game), puis tu le met à x=0, y=0 et à la hauteur voulue (donc celle du perso), et tu change l'opacité du sprite à 0, (sinon le sprite va tout recouvrir ^^)

Tu ajoute ça dans le update de l'acteur qui sert de joueur:

let ray: any // Tu crée un rayon

ray = new Sup.Math.Ray().setFromCamera(Sup.getActor("Camera").camera, Sup.Input.getMousePosition()).intersectActor(Sup.getActor(/*Nom de ton acteur qui contient le sprite que tu as crée*/))[0] //Ici on lance le rayon depuis la caméra jusqu'au sprite, pour plus tard récupérer la position de la souris

let point = null

if (ray != undefined) {

point = this.actor.getPosition().subtract(ray.point) //Pour éviter d'avoir un décalage quand le joueur bouge

this.actor.setLocalEulerZ( Math.atan2( point.y, point.x )) //On calcule l'angle que doit avoir le joueur selon la position de la souris

}

Et voilà, normalement c'est sensé marcher ! J'ai pas testé dans plusieurs situations, donc ça marchera peut-être pas pour toi, alors dis-moi-le si tu as un problème, que je regarde ^^

(Si tu as un décalage, c'est que le sprite est mal tourné, alors sur la ligne:

this.actor.setLocalEulerZ( Math.atan2( point.y, point.x ) - Math.PI/2)

Pour moi c'est - Math.PI/2 (ce qui revient à tourner de 90° vers la gauche) mais si tu veux tourner de 45° vers la droite, alors met this.actor.setLocalEulerZ( Math.atan2( point.y, point.x ) + Math.PI/4) à la place)

(+1)

Salut Yvanor!

Merci du coup de main! J'ai dû faire deux modifications à ton code et maintenant, ça marche :)

Pour info, voilà le code :

let ray = new Sup.Math.Ray(); // Tu crées un rayon

ray.setFromCamera(Sup.getActor("Camera Man").camera, Sup.Input.getMousePosition()).intersectActor(Sup.getActor("Acteur"))[0] //Ici on lance le rayon depuis la caméra jusqu'au sprite, pour plus tard récupérer la position de la souris

let point = null

if (ray != undefined) {

point = this.actor.getPosition().subtract(ray.getOrigin()) //Pour éviter d'avoir un décalage quand le joueur bouge

this.actor.setLocalEulerZ( Math.atan2( point.y, point.x ) + Math.PI/2) //On calcule l'angle que doit avoir le joueur selon la position de la souris

}


En tous cas, c'est top!

Merci beaucoup!

Super, et merci à toi aussi, je vais noter ça ! ^^