【问题标题】:How to create a Collisions var in the Back class如何在 Back 类中创建 Collisions var
【发布时间】:2013-01-16 12:11:51
【问题描述】:

编辑:我现在包含了一个 Player.as 和一个 addchild

我整天都在努力了解如何做到这一点,并在此过程中再次学到了很多东西。但我已经到了需要帮助的地步。

我知道我必须这样做: 在 Back1 类中创建一个 Collisions 变量。

因为名为 Back1 的背景是包含碰撞图像的影片剪辑

我找到了一个或 2 个很好的网站,它很好地解释了变量和类,但我仍然不明白我应该如何解决这个问题

研究变量和类:

http://www.republicofcode.com/tutorials/flash/as3variables/

http://www.photonstorm.com/archives/1136/flash-game-dev-tip-1-creating-a-cross-game-communications-structure

上述问题导致以下错误,但我认为这是由于未在 Back1 类中创建 Collisions var 造成的

ArgumentError:错误 #1063:Bumper() 上的参数计数不匹配。预期:2,值 0。

  • 在 flash.display::MovieClip/gotoAndStop() 在 DocumentClass/onRequestStart()DocumentClass.as:64] 在 flash.events::EventDispatcher/dispatchEventFunction() 在 flash.events::EventDispatcher/dispatchEvent() 在 MenuScreen/onClickStart()MenuScreen.as:18]

    package 
     {
    import flash.display.MovieClip;
    import flash.events.*;
    import flash.events.KeyboardEvent;
    import flash.ui.Keyboard;
    import flash.geom.Point;
    import Bumper;
    //import Back1;
    
    public class Test extends MovieClip
    {
    
        public var leftBumping:Boolean = false;
    public var rightBumping:Boolean = false;
    public var upBumping:Boolean = false;
    public var downBumping:Boolean = false;
    
    public var leftBumpPoint:Point = new Point(-30,-55);
    public var rightBumpPoint:Point = new Point(30,-55);
    public var upBumpPoint:Point = new Point(0,-120);
    public var downBumpPoint:Point = new Point(0,0);
    
    public var scrollX:Number = 0;
    public var scrollY:Number = 500;
    
    public var xSpeed:Number = 0;
    public var ySpeed:Number = 0;
    
    public var speedConstant:Number = 4;
    public var frictionConstant:Number = 0.9;
    public var gravityConstant:Number = 1.8;
    public var jumpConstant:Number = -35;
    public var maxSpeedConstant:Number = 18;
    
    public var doubleJumpReady:Boolean = false;
    public var upReleasedInAir:Boolean = false;
    
    public var keyCollected:Boolean = false;
    public var doorOpen:Boolean = false;
    
    public var currentLevel:int = 1;
    
    public var animationState:String = "idle";
    
    public var bulletList:Array = new Array();
    public var enemyList:Array = new Array();
    public var bumperList:Array = new Array();
     public var back1:Back1;
    public var collisions:Collisions;
    //public var back1:Collisions = new Collisions ;
     public var player:Player;
    
    public function Test()
    {
        addEventListener(Event.ADDED_TO_STAGE, init);
    }
    
    public function init(e:Event):void
    {
    
        player = new Player(320, 360);
        back1 = new Back1();
        collisions = new Collisions();
        //back1.collisions = new Collisons();
              addBumpersToLevel1();
    }
    public function addBumpersToLevel1():void
    {
        addBumper(500, -115);
        addBumper(740, -115);
    }
            public function addPlayerTolevel1():void 
    {
        addPlayer(320, 360);
    }
    public function loop(e:Event):void
    {
        trace("back1.collisions "+back1.collisions);
                    trace("back1 "+back1);
                    trace("collisions "+collisions);
        if (back1.collisions.hitTestPoint(player.x + leftBumpPoint.x,player.y + leftBumpPoint.y,true))
        {
    

以防万一我添加了 Bumper.as

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

public class Bumper extends MovieClip{
    public function Bumper(xLocation:int, yLocation:int) {
        // constructor code
        x = xLocation;
        y = yLocation;

        addEventListener(Event.ENTER_FRAME, bumper);
    }

    public function bumper(e:Event):void{
        //code here
    }
}

}

播放器.as

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

    public class Player extends MovieClip {

        public function Player(xLocation:int, yLocation:int) {
            // constructor code
            x = xLocation;
            y = yLocation;
           }



     //   public function removeSelf():void {
      //      trace("remove enemy");
       //     removeEventListener(Event.ENTER_FRAME, loop);
       //     this.parent.removeChild(this);
       // }



 }
 }

Back1.as 文件(注意它的实例化错误)

package  {
import flash.display.MovieClip;


public class Back1 extends MovieClip {
    //public var collisions:Back1;
           //what should i put here?
}
}

【问题讨论】:

  • 错误说你向 Bumper 类的构造函数传递了零个参数。你是如何创建它的?
  • 我添加了一些我删减的公共变量以使其更加透明......例如......public var bumperList:Array = new Array();
  • 我认为它现在缺少保险杠的代码
  • 听起来您可能在时间线上有一个“Bumper”影片剪辑,这导致公共函数 Bumper() 在没有 xLocation 和 yLocation 的情况下运行。
  • 不,它不在使用 addchild 创建的时间线上。 Serge 刚刚解决了其中一个问题,但它仍然给线路带来了问题 if (back1.collisions.hitTestPoint(player.x + leftBumpPoint.x,player.y + leftBumpPoint.y,true)) 它返回的错误是一个空

标签: actionscript-3 flash class var


【解决方案1】:

我不确定我是否完全理解您的意思。这个问题措辞很奇怪。

我假设您想在背景对象(Back 类)和播放器对象之间实现碰撞?我无法从您发布的代码中看到播放器对象是什么,因为您的 Test 类中没有这样的变量。

要测试两个对象之间的碰撞检查,请使用以下代码:

if(someObject.hitTestObject(anotherObject))

或者在您使用 hitTestPoint 时:

if(back1.hitTestPoint(player.x, player.y,true))

再一次,我不知道您发布的代码中 back1 类的外观如何。如果它扩展了 MovieClip 或 Sprite,并且您有一个执行相同操作(或任何 DisplayObject)的 Player 类,则应该可以。

这个: Bumper() 上的参数计数不匹配。预期:2,值为 0。

您得到的错误似乎来自代码中未显示的另一个地方。我假设您没有将任何参数传递给 Bumper 类的构造函数。

顺便说一句,这是 Flash IDE 示例还是其他程序,例如 FlashDevelop 或 FlashBuilder?如果您使用 Flash IDE 并尝试将代码附加到放置在场景中的影片剪辑实例,我认为不可能将参数传递给它。抱歉,我已经有一段时间没有使用 Flash IDE 了。

编辑:

这里有一些示例代码:

//::  Change Back1 class to this

package  {
import flash.display.MovieClip;


public class Back1 extends MovieClip {
    public function Back1()
    {
        graphics.beginFill(0xFF0000);
        graphics.drawRect(0, 0, 50, 50);
        graphics.endFill();
    }
}
}


//::  Then in your Main class (Or the Test class) add the following

var player:Player = new Player(25, 25);
var collidable:Back1 = new Back1();

addChild(player);
addChild(collidable);

//::  Goes in your loop/update
if (collidable.hitTestPoint(player.x, player.y, true))
{
    trace("HIT PLAYER");
}

如何将图形应用到 Back1 类取决于您,我只是画了一个简单的框。可以是任何东西。

【讨论】:

  • 我想与 Back1 影片剪辑中的“碰撞”图像发生碰撞。您可能是正确的“将代码附加到放置在场景中的电影剪辑实例”我会尝试在播放器上做一个 addchild 谢谢
  • 好的,我已将其更改为使用 addchild 创建一个播放器(请参阅已编辑的第一篇文章),感谢 Serge,它现在提供了正确的错误代码。
  • 碰撞对象是否在 Back1 类中定义和实例化?
  • 抱歉这么愚蠢,但要明确一点:你的意思是一个单独的 Back1.as 文件或/with.. 像这个 public var back1:Collisions = new Collisions ;或碰撞:Back1 = new Back1
  • 看看你的代码,你在 back1 对象中引用了一个碰撞对象,所以我假设它在 Back1 类中。我只是想确保你在类中实例化了它,这样你就可以实际引用它。可能是它崩溃的原因。
【解决方案2】:

为 Bumper 类设置默认参数:

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

    public class Bumper extends MovieClip{
        public function Bumper(xLocation:int = 0, yLocation:int = 0) {
            // constructor code
            x = xLocation;
            y = yLocation;

            addEventListener(Event.ENTER_FRAME, bumper);
        }

        public function bumper(e:Event):void{
            //code here
        }
    }

    }

【讨论】:

  • 这有帮助,但现在它给出了正确的错误。 TypeError:错误#1009:它基本上告诉以下行给出null..... if (back1.collisions.hitTestPoint(player.x + leftBumpPoint.x,player.y + leftBumpPoint.y,true))... ..(由于其他用户的建议,我还添加了 Player 和 player.as 文件的 addchild)
猜你喜欢
  • 2022-11-23
  • 1970-01-01
  • 2015-09-12
  • 1970-01-01
  • 2019-11-17
  • 1970-01-01
  • 2020-03-13
  • 2017-10-16
  • 1970-01-01
相关资源
最近更新 更多