首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >AS3瓦片碰撞平台

AS3瓦片碰撞平台
EN

Stack Overflow用户
提问于 2014-11-19 16:51:39
回答 3查看 254关注 0票数 0

我是AS3的新手,不得不为学校做一个瓷砖平台,遗憾的是我的老师帮不上忙。我一点也不知道如何在我的游戏中获得碰撞。我已经在互联网上找了一段时间了,真的找不到解决方案。如果你知道任何可以帮助我进步的东西,请留下评论!

代码语言:javascript
运行
复制
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 );
        }
    }
}
EN

回答 3

Stack Overflow用户

发布于 2014-11-19 18:52:37

扩展DisplayObject类的任何东西都可以使用hitTestObject()函数。它允许您检测两个对象是否接触或相交。

它的实现是直接公平的:

代码语言:javascript
运行
复制
if (obj1.hitTestObject(obj2) == true)
{
    //hit
}

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

票数 1
EN

Stack Overflow用户

发布于 2014-11-19 18:13:35

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

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

这里有一些很好的教程:

  • Box2D Flash
  • toods b2d videos
  • iforce
  • official box2d manual
  • Box2D Website

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

祝好运!

票数 0
EN

Stack Overflow用户

发布于 2014-11-19 18:25:13

对于您的情况,对于非常简单的碰撞检测,我将假设您的瓦片可以由正方形表示,并且玩家是一个矩形。有了这两点,您需要编写的新代码的主要部分将是查找两个通用矩形的交叉量(因为正方形也是一个矩形)。如果您愿意,您可以在rectangle类中使用内置的方法,也可以编写自己的方法(它并不太复杂)。

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

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

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

https://stackoverflow.com/questions/27012482

复制
相关文章

相似问题

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