【问题标题】:AS3 Tile Collision platformerAS3 瓷砖碰撞平台游戏
【发布时间】:2014-11-19 08:51:39
【问题描述】:

我是 AS3 的新手,必须为学校制作一个瓷砖平台游戏,遗憾的是我的老师并没有提供太多帮助。我对如何在我的游戏中发生碰撞一无所知。我已经在互联网上搜索了一段时间,真的找不到解决方案。如果您知道任何可以帮助我进步的事情,请发表评论!

package  {

    import flash.display.*;
    import flash.events.*;
    import flash.utils.Timer;
    import flash.events.TimerEvent;
    import flash.geom.Rectangle;
    import flashx.textLayout.formats.BlockProgression;
    import flashx.textLayout.formats.BackgroundColor;


    public class jump extends MovieClip {

        //Var player
        var persoon:testSubject = new testSubject();
        var grond:Ground = new Ground();
        var backGround:Background = new Background();
        var health:Health = new Health();

        var mapWidth = 10;
        var mapHeight = 10;
        var tileSide = 50;
        var totalTiles = mapWidth * mapHeight;

        var accel:Number = 2;
        var speed:Number = 5;
        var jumpSpeed:Number = 0;
        var gravity:Number = 5; 

        var ground:Number = 745 - persoon.height;

        var nr:Number = 3;

        var sprint:Boolean = true;
        var shiftButton:Boolean = false;
        var leftButton:Boolean = false;
        var rightButton:Boolean = false;
        var upButton:Boolean = false;
        var downButton:Boolean = false;
        var isJumping:Boolean = true;

        //Array map
        var myMap:Array = [
           [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
           [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
           [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
           [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
           [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
           [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
           [1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
           [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
           [1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
           [1,0,0,1,1,1,1,1,1,1,1,0,0,0,1,3,2,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
           [1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
           [1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
           [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
           ];

        public function jump() {
            //Event listener up key
            stage.addEventListener(KeyboardEvent.KEY_DOWN, upKeyDown);
            stage.addEventListener(KeyboardEvent.KEY_UP, upKeyUp);
            stage.addEventListener(Event.ENTER_FRAME, moveChar);

            //backGround
            backGround.x = -1000;
            backGround.y = -1000;
            backGround.height = 2000;
            backGround.width = 6000;
            addChild(backGround);

            //Map
            for (var i:int=0; i<13; i++)
            {
             for (var u:int=0; u<36; u++){
              var cell:MovieClip = new tile();
              cell.gotoAndStop(myMap[i][u]+1);
              cell.x=tileSide*u
              cell.y=tileSide*i
              addChild(cell);
             }
            }

            //Player
            persoon.x = 450;
            persoon.y = 490;
            persoon.width = 50;
            persoon.height = 60;
            addChild(persoon);

            //Healthbar
            health.x = 10;
            health.y = 65;
            health.gotoAndStop(4);
            addChild(health);
        }

        //Spring function when key is pressed
        public function upKeyDown(e:KeyboardEvent):void {
            //Buttons  Left - Up - Right - Down - Shift
            if ( e.keyCode == 37 || e.keyCode == 65 ) {
                leftButton = true;
                trace(persoon.y);
            }
            if ( e.keyCode == 38 || e.keyCode == 87 ) {
                upButton = true;
                    if(!isJumping) {  
                        jumpSpeed = 31;  
                        isJumping = true;  
                    }
            }
            if ( e.keyCode == 39 || e.keyCode == 68 ) {
                rightButton = true;
            }
            if ( e.keyCode == 40 || e.keyCode == 83 ) {
                downButton = true;
            }
            if ( e.keyCode == 16 ) {
                shiftButton = true;
                if ( sprint == true ) {
                    speed = speed * accel;
                    sprint = false;
                }
            }
        }

        //Spring function when key is released
        public function upKeyUp(e:KeyboardEvent):void {
            //Buttons  Left - Up - Right - Down - Shift
            if ( e.keyCode == 37 || e.keyCode == 65 ) {
                leftButton = false;
            }
            if ( e.keyCode == 38 || e.keyCode == 87 ) {
                upButton = false;
            }
            if ( e.keyCode == 39 || e.keyCode == 68 ) {
                rightButton = false;
            }
            if ( e.keyCode == 40 || e.keyCode == 83 ) {
                downButton = false;
            }
            if ( e.keyCode == 16 ) {
                shiftButton = false;
                speed = 5;
                sprint = true;
            }
        }

        //Character Movement
        public function moveChar(event:Event):void {
            //Collision


            //Walk Left & Right
            if ( leftButton == true ) {
                if (persoon.x > 78) {
                    persoon.x -= speed;
                    health.x = persoon.x - 440;
                }
            } else if ( rightButton == true ) {
                if ( persoon.x < 1722 ) {
                    persoon.x += speed;
                    health.x = persoon.x - 440;
                }
            }

            //Jump
            if(isJumping) {
                health.y -= jumpSpeed;
                persoon.y -= jumpSpeed;  
                jumpSpeed -= 2;
            }

            if (persoon.y + gravity < ground) {
                persoon.y += gravity; 
                health.y += gravity;
                trace(persoon.y);
            } else {
                health.y = ground - 420;
                persoon.y = ground;  
                isJumping = false;
            }

            //Camera
            root.scrollRect = new Rectangle ( persoon.x - stage.stageWidth/2, persoon.y - 430, stage.stageWidth, stage.stageHeight );
        }
    }
}

【问题讨论】:

    标签: actionscript-3 flash collision tile


    【解决方案1】:

    hitTestObject() 是一个可用于任何扩展 DisplayObject 类的函数。它允许您检测两个对象是否正在接触或相交。

    它的实现很简单:

    if (obj1.hitTestObject(obj2) == true)
    {
        //hit
    }
    

    根据屏幕资源的实现方式,您还可以使用BitmapData.hitTest() 来检测两个位图是否发生碰撞。这更精确,因为它允许您声明 alpha 通道。你可以找到一个很好的教程here

    【讨论】:

      【解决方案2】:

      如果您想获得真正好的碰撞(物理),那么您肯定需要像 Box2D 这样的物理引擎!但要进入它,你必须掌握一点学习曲线,但我保证它绝对值得深入研究。

      请注意:Box2D 最初是用 C++ 开发的,但有许多移植到不同语言的端口,如 AS3、Javascript、Java 等。这就是为什么您有时必须参考原始文档的原因,其中闪存端口的文档非常好。

      这里有一些很好的教程:

      由于您正在构建平铺平台游戏,请查看tiled,它将为您提供手写地图的服务。此外,我可以推荐你看看melonjs 一个不错的基于瓷砖的 Javascript 平台游戏引擎。这些教程可以向您展示工作流程,对于您来说应该与 Flash 非常相似。如果你需要一个浏览器游戏并且不绑定flash,我建议你切换到HTML5并使用melonjs……

      祝你好运!

      【讨论】:

        【解决方案3】:

        在您的情况下,对于非常简单的碰撞检测,我假设您的图块可以用正方形表示,而玩家是一个矩形。鉴于这两点,您需要编写的主要新代码将是找到 2 个通用矩形的交集量(因为正方形也是矩形)。如果您愿意,可以在 rectangle 类中使用内置方法,或者您可以编写自己的方法(它不太复杂)。

        接下来,在您的玩家移动中,您可以存储它并使用上面的矩形与矩形相交方法,而不是立即将移动应用到玩家身上,检查玩家是否会跑到实心瓷砖上。如果他们这样做了,则通过限制允许他们移动的量来阻止/限制玩家跑到它,然后将其应用于玩家。

        这只是众多方法中的一种,甚至我在这里描述的内容也可以改进。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-01-11
          • 2013-01-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多