2013-06-06 3 views
-1

Je suis un débutant avec AS3 et j'essaie de faire un jeu de base joueur vs CPU pong (en utilisant un tutoriel comme référence). Je m'excuse si cela semble stupide ou évident. J'ai une classe de document et des classes individuelles pour Ball, Player et CPU. Mon problème est que je ne sais pas comment faire en classe CPU utiliser les coordonnées de la boule de clip sur la scène afin qu'il puisse se déplacer par rapport à la balle comme nécessaire pour former l'IA. Le tutoriel auquel j'ai fait référence a tout le code pour la balle, le joueur et le cpu dans la classe document seulement mais j'ai écrit du code pour tout dans leurs classes respectives.Pong: Comment passer la position de la balle sur la scène à la pagaie du CPU? -AS3

Le lien tutoriel http://as3gametuts.com/2011/03/19/pong-1/

Ma version de code. Actuellement, le ballon rebondit sur les murs mais HitTest n'a été appliqué à rien. La palette du joueur se déplace avec les touches fléchées. Aucun avertissement ou erreur n'est affiché.

principal

public class Main extends MovieClip 
{ 

    public function Main() 
    { 
     this.addEventListener(Event.ADDED_TO_STAGE, onAddedToStage); 
    } 

    private function onAddedToStage(e:Event):void 
    { 
     removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage); 

     trace("Initialized"); 
    } 
} 

balle

public class Ball extends MovieClip 
{ 
    public var ballSpeedX:int = 5; 
    public var ballSpeedY:int = 6; 


    public function Ball() 
    { 
     this.addEventListener(Event.ADDED_TO_STAGE, onAddedToStage) 
    } 

    public function onAddedToStage(e:Event):void 
    { 
     removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage) 

     this.x = stage.stageWidth/2; 
     this.y = stage.stageHeight/2; 

     this.addEventListener(Event.ENTER_FRAME, loop) 
    } 

    public function loop(e:Event):void 
    { 

     this.y += ballSpeedY; 
     this.x += ballSpeedX; 

     if ((this.y <= 0 + this.height/2) || (this.y >= stage.stageHeight - this.height/2)) 
     { 
      ballSpeedY *= -1; 
     } 
     else if ((this.x <= 0 + this.width/2) || (this.x >= stage.stageWidth - this.width/2)) 
     { 
      ballSpeedX *= -1; 
     } 
    } 
} 

TheCpu

public class TheCpu extends MovieClip 
{ 
    public var cpu:TheCpu; 
    public var ball:Ball; 
    private var vx:Number = 5; 

    public function TheCpu() 
    { 
     this.addEventListener(Event.ADDED_TO_STAGE, onAddedToStage); 
    } 
    private function onAddedToStage(e:Event):void 
    { 
     removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage); 
     this.x = 240; 
     this.y = 10; 

     this.addEventListener(Event.ENTER_FRAME, loop); 
    } 

    private function loop(e:Event):void 
    { 
     /*if (this.x < ball.x - 10) 
     { 
      this.x += vx; 
     } 
     else if (this.x > ball.x + 10) 
     { 
      this.x -= vx; 
     }*/ 
    } 
} 

J'ajouté à ma classe principale

private function onAddedToStage(e:Event):void 
    { 
     removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage); 

     trace("It's Alive!"); 
     addBall(); 
     addCPU(); 
    } 

    public function addBall():void 
    { 
     var ball:MovieClip = stage.getChildByName("ball") as MovieClip 
     stage.addChild(ball); 

    } 

    public function addCPU():void 
    { 
     var cpu:MovieClip = stage.getChildByName("cpu") as MovieClip 
     stage.addChild(cpu); 
    } 
} 

mais maintenant il donne erreur TypeError: Erreur # 2007: enfant de paramètre doit être non nulle. à flash.display :: DisplayObjectContainer/addChild() à flash.display :: Scène/addChild() à src :: Main/addBall() à src :: Main/onAddedToStage()

et si J'utilise

var ball:Ball = new Ball(); 
    var cpu:TheCpu = new TheCpu(); 

Je reçois TypeError: erreur # 1009: Impossible d'accéder à une propriété ou une méthode d'une référence d'objet nul. à src :: TheCpu() à src :: Main/addCPU() à src :: Main/onAddedToStage()

Je pense que je suis maintenant être vraiment stupide.

+0

Essayez de lire sur http://www.kirupa.com/forum/showthread.php?223798-ActionScript-3-Tip-of-the-Day/page28&p=2167721#post2167721. En résumé, vous devrez utiliser des événements ou des références. Si vous débutez, vous n'avez probablement pas encore appris comment créer et envoyer vos propres événements (ou utiliser des références, d'ailleurs). Donc, à la place, je vous recommande de mettre tout votre code dans votre classe de document pour l'instant, et d'utiliser les classes une fois que vous en apprendrez plus sur la POO et comment communiquer entre les classes. –

+0

Je ne suis pas d'accord avec Garry, à moins que vous ne soyez à court de temps, prenez le temps maintenant d'apprendre à utiliser les événements et les auditeurs. http://www.adobe.com/devnet/actionscript/articles/event_handling_as3.html La principale chose à comprendre est que les événements proviennent de certains répartiteurs et que vous écoutez les événements sur ce répartiteur. Lorsque le répartiteur distribue un événement, toutes les fonctions enregistrées pour cet événement seront déclenchées. Aussi, si vous utilisez des trucs sur la bulle d'événements de scène de l'enfant au parent. Montrez le tutoriel ou montrez votre code pour plus d'aide. – shaunhusain

Répondre

0

Comme une solution plus simple.

Fondamentalement, lorsque vous créez la balle, vous pouvez passer l'instance de la balle à la CPU afin que le CPU puisse simplement vérifier où se trouve la balle sur chaque trame de mise à jour/entrée. Quelque chose comme ceci:

var ball:Ball = new Ball(); 
var cpu:CPU = new CPU(ball); 

Je pense que vous idéalement avoir une boucle de mise à jour qui indique que chaque partie de se mettre à jour en séquence et passe le long de toutes les informations importantes entre les objets afin qu'ils puissent se mettre à jour de façon appropriée (et la mise à jour principale boucle peut suivre des choses comme la balle hors de la région/point marqué, etc.)

EDIT

Si je vous comprends bien, vous avez placé des symboles sur la scène dans Flash et attribué ces blocs de code à chacun d'eux. Donc, votre problème est que vous ne savez pas comment référencer chacune des instances. Vous pouvez utiliser cette méthode pour récupérer les instances que vous mettez sur la scène en les nommant et en se référant à leur disposition par nom: How do I access a movieClip on the stage using as3 class?

Sinon, vous pouvez créer les instances dans la classe principale dans la valeur ajoutée à l'étape gestionnaire en créant des instances comme affiché dans le bloc de code ci-dessus puis appelant: stage.addChild (cpu); stage.addChild (balle); Assurez-vous d'utiliser le nom du symbole MovieClip de la bibliothèque à la place du CPU et de la bille.

0

Dans votre code commenté dans la classe TheCpu, vous mettez "ball.y" quand je pense que vous vouliez dire "ball.x".

+0

Oh oui. Merci d'avoir fait remarquer cela. – Rakesh

Questions connexes