HitTest在一个类的舞台上使用movieClips

时间:2013-12-17 11:27:08

标签: actionscript-3 class

我按照一个简单的教程尝试制作一个简单的自上而下的游戏,到目前为止我已经有了这个课程,但我无法弄清楚如何在舞台上用影片剪辑进行点击测试。

package
{
import flash.display.Stage;
import flash.display.MovieClip;
import flash.events.Event;
import KeyObject;

public class Player extends MovieClip
{
    public var stageRef:Stage;
    public var key:KeyObject;

    public var leftPressed:Boolean = false;
    public var rightPressed:Boolean = false;
    public var upPressed:Boolean = false;
    public var downPressed:Boolean = false;
    public var lastMove:String;

    public var speed:Number = 5;

    public function Player(stageRef:Stage, X:int, Y:int):void
    {
        this.stageRef = stageRef;
        this.x = X;
        this.y = Y;

        key = new KeyObject(stageRef);

        addEventListener(Event.ENTER_FRAME, loop, false, 0, true);
    }

    public function loop(e:Event):void
    {
        checkKeypresses();

        if(leftPressed){
            x -= speed;
            if(this.currentFrame < 7 || this.currentFrame > 9){
                this.gotoAndPlay("left");
                lastMove="left";
                checkKeypresses();
            }
        } else if(rightPressed){
            x += speed;
            if(this.currentFrame < 12 || this.currentFrame > 14){
                this.gotoAndPlay("right");
                lastMove="right";
                checkKeypresses();
            }
        }
        if(upPressed){
            y -= speed;
            if(this.currentFrame < 17 || this.currentFrame > 19){
                this.gotoAndPlay("up");
                lastMove="up";
                checkKeypresses();
            }
        } else if(downPressed){
            y += speed;
            if(this.currentFrame < 2 || this.currentFrame > 4){
                this.gotoAndPlay("down");
                lastMove="down";
                checkKeypresses();
            }
        }
    }

    public function detectPlayer(){

    //HOW  VVVVVVVVVVV ?
        if(lvl.wall_mc.hitTestPoint(this.x,this.y,true)){ 
            if( lastMove == "right"){
                this.x -= speed;
            }
            if( lastMove == "left"){
                this.x += speed;
            }
            if( lastMove == "up"){
                this.y += speed;
            }
            if( lastMove == "down"){
                this.y -= speed;
            }
        }
    }

    public function checkKeypresses():void
    {
        if(key.isDown(37) || key.isDown(65)){ // left arrow or A
            leftPressed = true;
        } else {
            leftPressed = false;
        }

        if(key.isDown(38) || key.isDown(87)){ //up arrow or W
            upPressed = true;
        } else {
            upPressed = false;
        }

        if(key.isDown(39) || key.isDown(68)){ //right arrow or D
            rightPressed = true;
        } else {
            rightPressed = false;
        }

        if(key.isDown(40) || key.isDown(83)){ //down arrow or S
            downPressed = true;
        } else {
            downPressed = false;
        }
    }
}
}

在行中“如果(lvl.wall_mc.hitTestPoint(this.x,this.y,true))”我遇到了问题。请指出我正确的方向。

1 个答案:

答案 0 :(得分:1)

lvl在哪里定义?如果它是MovieClip上的stage,那么您需要了解Player的实例很可能是lvl的兄弟,这意味着您需要“上升到一个级别“以便访问它。

虽然这是糟糕的设计,但它应该有效:

if ( MovieClip( stage.getChildByName("lvl") ).wall_mc.hitTestPoint(this.x,this.y,true) )

这是在stage找到名为“lvl”的孩子,将其作为MovieClip投射,然后访问wall_mc孩子。

如果您希望改进此设计以使其不那么紧密耦合,您应该将此逻辑上升到文档类或其他可以同时访问Player和{{{ 1}}。


更新:

查看完整代码后,有几种方法可以解决您的问题。

首先,您有lvl作为文档类,但是在构造函数中,您将Main.as实例添加到舞台而不是在Player下将其括起来。这会导致Main成为您Player文档类的兄弟,而不是孩子。

解决此问题的一种方法是将Main添加到main,然后更改Player方法以检查detectPlayer的父级:

Player

其次,看起来好像你实际上没有调用检查墙壁碰撞的方法(if ( MovieClip( parent.getChildByName("lvl") ).wall_mc.hitTestPoint(this.x,this.y,true) ))。要解决此问题,您可以在detectPlayer方法的末尾拨打detectPlayer

如前所述,这不是最佳做法。另外,我注意到你正在通过你的Player.loop课程并稍后将其传递给Player,因此以这种方式重新育儿KeyObject可能会破坏你的一些预期游戏玩法

如果您对松散耦合的重构感兴趣,我建议您修改Player方法以接受Player.detectPlayer作为参数,并在DisplayObject内调用ENTER_FRAME侦听器1}} class:

Main

这需要在package { import flash.display.Stage; import flash.display.MovieClip; import flash.events.Event; public class Main extends MovieClip { public var player:Player; public function Main():void { player = new Player(stage, 320, 240); stage.addChild(player); addEventListener(Event.EXIT_FRAME, loop); } private function loop($event:Event):void { player.detectPlayer(lvl.wall_mc); } } } 中进行以下更改:

Player