首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >敲击站台时停止字符

敲击站台时停止字符
EN

Stack Overflow用户
提问于 2014-03-21 17:50:57
回答 2查看 234关注 0票数 0

我做的一个游戏出了点小问题。你看,我想阻止我的角色在我放置的平台上移动,但是因为我的characters实例位于另一个类而不是我的characters类中,所以我不能访问它的速度变量等等。坦率地说,我不确定我应该如何解决这个问题。

这是character类。

代码语言:javascript
复制
     package  com.classes
    {

        import flash.display.MovieClip;
        import flash.display.Stage;
        import com.senocular.utils.KeyO

bject;
    import flash.ui.Keyboard;
    import flash.events.Event;

    public class Gubbe extends MovieClip
    {


        private var stageRef:Stage;
        private var key:KeyObject;


        private var speed:Number = 0.6;
        private var vx:Number = 0;
        private var vy:Number = 0;
        private var gravity:Number = .4;
        private var maxspeed:Number = 21;
        private var maxspeedG:Number = 50
        private var friction:Number = .92;
        private var nospeed = 0;
        private var fall:Boolean = false;
        private var platt:platform;

        public function Gubbe(stageRef:Stage) : void {


            this.stageRef = stageRef;
            key = new KeyObject(stageRef);

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



        }

        public function loop(e:Event) : void
        {
            //Knapptryck
            vy += gravity;
            y += vy;
            x += vx;


            if (key.isDown(Keyboard.LEFT))
                vx -= speed;
            else if (key.isDown(Keyboard.RIGHT))
                vx += speed;
            else
                vx *= friction;

            if (key.isDown(Keyboard.UP))
                vy -= speed;
            else if (key.isDown(Keyboard.DOWN))
                vy += speed;
            else


            //Positions updatering
            x += vx;
            y += vy;

            if(vx > 0)
                fall=true;
            if(vy > 0)
                fall=true;




            if (vx > maxspeed)
                    vx = maxspeed;
            else if (vx < -maxspeed)
                    vx = -maxspeed;

            if (vy > maxspeed)
                    vy = maxspeed;
            else if (vy < -maxspeed)
                    vy = -maxspeed;



            if (x > stageRef.stageWidth)
            {
                    x = stageRef.stageWidth;
                    vx = -vx;
            }
            else if(x < 0)
            {       
                    x = 0;
                    vx = -vx;
            }
            if (y > stageRef.stageHeight)
            {       
                    y = stageRef.stageHeight;               
                    vy = (-vy*.4);
            }
            else if (y < 0)
            {
                    y = 0;
                    vy = -vy;
            }



        }





    }

}

这是Engine类,角色和平台实例位于其中。

代码语言:javascript
复制
package  com.classes{

import flash.display.MovieClip;
import flash.display.Stage;
import flash.events.Event; 
import com.classes.Gubbe;

public class Engine extends MovieClip
{
    public var ourGubbe:Gubbe;


    public function Engine() : void
    {
        ourGubbe = new Gubbe(stage);            
        ourGubbe.x = stage.stageWidth / 2;
        ourGubbe.y = stage.stageHeight / 2;
        stage.addChild(ourGubbe);


        stage.addEventListener(Event.ENTER_FRAME, land);

    }

    public function land(e:Event) : void
    {

        if(ourGubbe.hitTestObject(platform))
        {

        }
    }


}

}

我在想hitTestObject,但我不知道如何让角色实例在与墙壁碰撞时停止。如果我能得到任何帮助,我将不胜感激!

EN

回答 2

Stack Overflow用户

发布于 2014-03-21 18:53:14

你只需要给你的角色添加一些公共布尔值,如下所示:

代码语言:javascript
复制
public var leftfree:Boolean = true;
public var rightfree:Boolean = true;

然后你需要在你的引擎类中为角色的左侧和右侧添加2个不同的命中测试检查,如下所示:

代码语言:javascript
复制
if(ourGubbe.hitTestObject(platform))
{
   if(platform.x > ourGubbe.x) ourGubbe.rightfree = false;
   else ourGubbe.leftfree = false,
}
else
{
   ourGubbe.leftfree = true;
   ourGubbe.rightfree = true;
}

然后,您可以使用角色类中的布尔值在与碰撞侧相关的每个帧中向左或向右移动1个像素(取决于角色的移动速度,使用实际移动速度而不是1个像素),以防止其进入平台。

票数 0
EN

Stack Overflow用户

发布于 2014-03-21 20:35:31

我建议使用Getters和Setters。这样,您就可以从其他类访问变量。

在Gubbe中,您可以添加:

代码语言:javascript
复制
public function getXVelocity():Number
{
    return vx;
}

public function setXVelocity(value:Number):void
{
    //Check if value is within the set limits.
    if (value > maxspeed)
        value = maxspeed;
    else if (value < -maxspeed)
        value = -maxspeed

    vx = value;
}

public function getYVelocity():Number
{
    return vy;
}

public function setYVelocity(value:Number):void
{
    //Check if value is within the set limits.
    if (value > maxspeed)
        value = maxspeed;
    else if (value < -maxspeed)
        value = -maxspeed

    vy = value;
}

正如您所看到的,您可以在setter中构建一些安全性,就像我现在使用maxspeed所做的那样。

然后在Engine中,你可以这样做:

代码语言:javascript
复制
if (ourGubbe.hitTestObject(platform))
{
    //Get the current velocity.
    var ySpeed:Number = ourGubbe.getYVelocity();

    //Move Gubbe back so it is outside the platform again.
    ourGubbe.y -= ySpeed;

    //Set the y velocity to 0.
    ourGubbe.setYVelocity(0);
}

冲突处理仅作为示例。不要只在上面做碰撞处理,否则你的角色会表现出一些奇怪的行为。

祝好运!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22555336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档