无法获得教程:在一小时内构建一个基于物理的平台游戏

时间:2011-10-19 16:43:51

标签: flash actionscript-3 box2d

所以我在网上发现了这个教程,并且在一小时内学会这个教程的想法吸引了我:

http://active.tutsplus.com/tutorials/games/build-a-physics-based-platformer-in-under-an-hour/

问题是我无法在达到第14步时开始工作 - 当我测试电影时,第二段说我得到了错误。 修改问题已缩小到第31行world = null。也许更具体的我想知道的是世界假设是什么?我如何定义世界以便得到教程中演示的最终结果?

编辑2 好的,所以我在这里取得进步,对于任何想要了解的人。我用 addEventListener 方法替换了本教程中使用的 listenWhileVisible 方法,所以我甚至不需要提及world属性。所以现在没有错误但是在教程的这一点上,我想能够左右移动英雄,这是没有发生的。任何帮助为什么?新代码更新如下


我在每一步之后尝试过测试影片,直到我将 view.characters.HeroCharacter 类应用到我的英雄影片剪辑后才出现任何错误。所以似乎问题出现在HeroCharacter.as中。所以我从说明中流氓,并摆弄HeroCharacter.as。当我复制粘贴教程中的代码时,FlashDevelop没有自动生成所有必需的导入。我将问题缩小到最终在Flash中的输出窗口中出现此错误:

TypeError: Error #1009: Cannot access a property or method of a null object reference.
at misc::Entity/listenWhileVisible()
at view.characters::HeroCharacter/create()
at misc::Entity/ensureCreated()
at Function/<anonymous>()

这是Actionscript

package view.characters 
{
import Box2DAS.Collision.b2WorldManifold;
import Box2DAS.Common.V2;
import Box2DAS.Dynamics.b2World;
import Box2DAS.Dynamics.ContactEvent;
import Box2DAS.Dynamics.StepEvent;
import misc.Input;
import misc.Util;   
import shapes.Box;
import wck.BodyShape;
import wck.ContactList;
import wck.World;

/**
 * ...
 * @author Hexel Colorado
 */
public class HeroCharacter extends Box {

    private var contacts:ContactList;

    public override function create():void {
        reportBeginContact = true;
        reportEndContact = true;
        contacts = new ContactList();
        contacts.listenTo(this);

        fixedRotation = true;

        addEventListener(StepEvent.STEP, world_stepEventHandler, false, 0, true);
        addEventListener(ContactEvent.BEGIN_CONTACT, this_beginContactHandler, false, 0, true);

        super.create();
    }

    private function world_stepEventHandler(e:StepEvent):void
    {
        var left:Boolean = Input.kd('LEFT', 'A');
        var right:Boolean = Input.kd('RIGHT', 'D');
        var jump:Boolean = Input.kp('UP', ' ', 'W');

        if (jump) {
            b2body.ApplyImpulse(new V2(0, -2), b2body.GetWorldCenter());
        }
        else if(left) {
            b2body.ApplyImpulse(new V2(-2, 0), b2body.GetWorldCenter());
        }
        else if(right) {
            b2body.ApplyImpulse(new V2(2, 0), b2body.GetWorldCenter());
        }
    }

    private function this_beginContactHandler(e:ContactEvent):void
    {
    }

}
}

我已经停在第14步的第2段,并且不会继续学习本教程的其余部分,直到我能解决这个问题。谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

编辑:我认为我实际上错了,似乎它在super.create()函数中。无论如何测试此跟踪以防万一,然后找出调试器并返回导致问题的特定代码行。 编辑2:不,它不在super.create()中,错误数据混淆了我一秒钟,请执行此操作。

很可能未定义变量“world”。

将第一行(trace)输入到您的代码中,如下所示:

trace("world = "+world);
listenWhileVisible(world, StepEvent.STEP, world_stepEventHandler, false, 0, true);
listenWhileVisible(this, ContactEvent.BEGIN_CONTACT, this_beginContactHandler, false, 0, true);

它应该显示如下: world = null world = undefined;

另外,学习使用调试器调试应用程序。如果我不确定发生了什么(我现在应该是正确的),我会启动一个远程调试会话。调试器将精确定位要使用的确切违规行。

调试的另一种方法,虽然速度较慢,但​​输入一堆跟踪语句并查看哪些语句无法触发。中间的代码导致问题。我不推荐这个。

确保您学习使用调试器,它会在一年或两年内(我的情况下)为您节省数百小时。

remote debug in flash

独立播放器下载是相同的,唯一不同的是:

选择调试&gt;开始远程调试会话&gt; ActionScript 3.0。

在Flash开发中,这是:

调试&gt;启动远程会话

现在查看该跟踪,如果您不知道如何修复它,请在此处发布第二个问题或更多代码。 然后学习使用调试器

Debugger tutorial

本教程采用不同的语言(Java),但专注于调试器概念,而不是代码(Step over,Step Into,Step out,yada yada)。 Flex中没有调试器的跟踪部分,因此在2:50之后无视。

适应Step Into,Step Out,Step Over。非常强大。

此外,在左侧(左下角),您可以查看内存中对象的状态(属性内的数据)。它击败跟踪变量来计算出值(如上所述)。