Probléme code AS3, Faire rebondir un mc dans la scéne

analxlogik Messages postés 7 Date d'inscription mercredi 2 décembre 2009 Statut Membre Dernière intervention 6 janvier 2010 - 27 déc. 2009 à 15:42
analxlogik Messages postés 7 Date d'inscription mercredi 2 décembre 2009 Statut Membre Dernière intervention 6 janvier 2010 - 6 janv. 2010 à 15:33
Plop all !

Étant une grande débutante, j'ai un petit probléme sur lequel je bûche depuis quelques jours déja. En espérant ne pas faire un repost, je vais vous expliquer..

Je souhaiterais faire une animation, une sorte de petit jeu en AS3. Il y aurait donc une terre avec un point précis a toucher pour remporter des points. Le compteur est opérationnel, la terre aussi,... Mais pour corser cela, et donner un minimum d'interêt a l'anim, je souhaiterais faire bouger ma terre aléatoirement et la faire rebondir sur les bords de ma scéne.

Puisque je n'ai pas réussit comme cela, j'ai tenté une autre méthode:

conteneurall.addEventListener(Event.ENTER_FRAME,tourne);
function tourne(e:Event) {

var horizon= new Tween (conteneurall,"x",Elastic.easeIn,50,400,3,true);
horizon.addEventListener(TweenEvent.MOTION_FINISH, onFinish1);
function onFinish1(e:TweenEvent):void {
horizon.looping();
}

if (conteneurall.hitTestObject(bord)) {
var vertical= new Tween (conteneurall,"y",Bounce.easeOut,300,40,2,true);
vertical.addEventListener(TweenEvent.MOTION_FINISH, onFinish2);
function onFinish2(e:TweenEvent):void {
vertical.looping();
}

conteneurall.removeEventListener(Event.ENTER_FRAME,tourne);}}


mais lorsque que je teste, il me répond :

"TypeError: Error #1006: value n'est pas une fonction.
at MethodInfo-67()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at fl.transitions::Tween/set time()
at fl.transitions::Tween/nextFrame()
at fl.transitions::Tween/onEnterFrame()"



Voila, je suis a votre disposition pour de plus amples explications ou ré-expliquer s'il y a besoin !

Merci a ceux qui voudront bien m'aider ! C'est assez urgent :x..

++

7 réponses

dj_ouf Messages postés 221 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 6 septembre 2011
29 déc. 2009 à 12:09
Hello

il nous faudrait plus de code stp, car là c'est difficile de t'aider.
Exemple : MethodInfo-67, on ne voit pas cette fonction dans le code que tu as donné.

Sinon pour des interpolations avec détections de collision, il vaut mieux éviter les tweens et définir les posiitions x et y manuellement dans un enterFrame.
Je ne sais pas de quelle manière tu veux faire se déplacer la terre, mais un rebond à la breakout (casse-brique) dans des angles uniquement de 45°, il suffirait de gérer un sens de déplacement en x et un autre pour le y.

if (sensX == gauche") x -= 5;
else if (sensX == "droite") x += 5;

idem pour les y..

Et quand la terre touche le bord gauche, tu lui définis sensX "gauche". Lorsqu'il touche bord haut, alors sensY "bas", si tu vois le principe.. C'est une des manière les + simpliste.
0
dj_ouf Messages postés 221 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 6 septembre 2011
29 déc. 2009 à 12:11
Ptite erreur :

Et quand la terre touche le bord gauche, tu lui définis sensX = "droite"
0
analxlogik Messages postés 7 Date d'inscription mercredi 2 décembre 2009 Statut Membre Dernière intervention 6 janvier 2010
29 déc. 2009 à 12:29
Re,

Merci de ta réponse mais je crois avoir trouver plus simple..
Voila ce qu'un ami a fait:

Il a mis un timer sur la terre pour la faire bouger toutes les secondes environ, il l'a fait bouger aléatoirement sur la scène, ce qui veut dire qu'il lui a imposer de bouger sur 800 x 600.

Je suppose que ca revient exactement a ce que tu viens de dire (Mais je suis un peu nuub) !
Du coup, jvais tester ca, et si ca ne marche toujours pas ou quoi, je tenterais ta méthode.

Merci !
++
0
dj_ouf Messages postés 221 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 6 septembre 2011
29 déc. 2009 à 14:48
Re

Je crois pas que ça revienne exactement à ce que je t'ai proposé.
Je suis pas certain d'avoir bien capté, mais entre chaque seconde, est-ce que la terre continue de bouger ? car ça change tout.
Effectivement si ça consiste juste à déplacer la terre toutes les x secs, et qu'elle reste fixe jusqu'à la prochaine seconde, c'est hyper simple

La méthode que je t'ai proposé, c'est que la terre bouge continuellement, et qu'elle rebondisse sur les bords de l'écran, exactement comme la balle d'un casse brique.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
analxlogik Messages postés 7 Date d'inscription mercredi 2 décembre 2009 Statut Membre Dernière intervention 6 janvier 2010
29 déc. 2009 à 15:01
Re,

Ah okay u_u... Donc tu avais bien raison, je veux faire bouger la terre aléatoirement pour qu'on ait du mal a viser le centre (et lorsqu'on y arrive, ca rajoute des points, contrairement a si on est a coté, ou ca en enléve). Une sorte de jeu... Donc oui, le systéme de balle du pong est celui qu'il me faudrait.

Mais si entre les secondes, il fait une interpolation ou un tween, ca devrait être fluide, non ?
0
dj_ouf Messages postés 221 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 6 septembre 2011
29 déc. 2009 à 15:43
Ah je me disais aussi

En fait c'est pas à cause de la fluidité qu'il faut éviter Tween, car pour un pong le prob de fluidité ne se posera pas (ça l'est quand t'as 20 symboles affichés en même temps sur l'écran et qu'ils se déplacent tous). C'est plutôt car tu peux + difficilement tester les coordonnées en temps réel pour lui faire changer de direction lors d'un rebond sur le bord.

Mais en y réfléchissant, c'est plus souple avec Tween, tu peux gérer n'importe quelle trajectoire, à n'importe quel angle. Par contre ça sera juste un peu + compliquer pour gérer les rebonds.
0
analxlogik Messages postés 7 Date d'inscription mercredi 2 décembre 2009 Statut Membre Dernière intervention 6 janvier 2010
6 janv. 2010 à 15:33
Encore merci, tu m'as évité d'assez grosses bourdes !
Au final, je vous poste ce que j'ai finis par faire, même si ca doit pas être le plus simple, ca marche quand même, sans erreur, et c'est tout ce que je lui demande :D !


(C'est juste la partie pour le rebond)
//Rebond 

//Vitesse initiale
var xspeed:Number = 0;
var yspeed:Number = 0;

//Coeff de vitesse
var speed:Number = 1;

//Detecter où est le curseur
var dessusEqui:Number = 0;
var dessusTerreSing:Number = 0;
var dessusTerreMachin:Number = 0;

addEventListener(Event.ENTER_FRAME,ballmouvement);

function ballmouvement(e:Event):void {

speed=speed+0.05;
if (speed>=24) {

removeEventListener("enterFrame", ballmouvement);
//Résultats:
if (compteur<=700) {
addChild(loos);
}
if (compteur>700) {
addChild(gg);
}
}
if (dessusEqui== 1) {
//Vitesse up, points up
compteur=compteur+Math.round(speed);
hit.text= "Score: "+compteur ;
}
if (dessusTerreMachin== 1||dessusTerreSing==1) {
//Points enlevés: /2
compteur=compteur-Math.round(speed/2);
hit.text= "Score: "+compteur ;
}
if (xspeed < speed && xspeed >= 0) {
xspeed += 1;

}
if (xspeed > -speed && xspeed < 0) {
xspeed -= 1;

}
if (yspeed < speed && yspeed >= 0) {
yspeed += 1;
}
if (yspeed > -speed && yspeed < 0) {
yspeed -= 1;
}
conteneurall.x += xspeed;
conteneurall.y += yspeed;

if (conteneurall.y>=665&&yspeed>0) {
//Touche le bas
yspeed = -yspeed;//Change dir u
}
if (conteneurall.y<=170&&yspeed<0) {
//Touche le haut
yspeed = -yspeed;//Change dir y
}
if (conteneurall.x>=690&&xspeed>0) {
//Touche la droite
xspeed = -xspeed;//Change dir x
}
if (conteneurall.x<=0&&xspeed<0) {
//Touche la gauche
xspeed = -xspeed;//Change dir x
}
}
//Fin rebond



Voila voila ^^ ! J'espère que ca en aidera !
Encore merci !

++
0
Rejoignez-nous