所以我在网上发现了这个教程,并且在一小时内学会这个教程的想法吸引了我:
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段,并且不会继续学习本教程的其余部分,直到我能解决这个问题。谢谢你的帮助。
答案 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;
另外,学习使用调试器调试应用程序。如果我不确定发生了什么(我现在应该是正确的),我会启动一个远程调试会话。调试器将精确定位要使用的确切违规行。
调试的另一种方法,虽然速度较慢,但输入一堆跟踪语句并查看哪些语句无法触发。中间的代码导致问题。我不推荐这个。
确保您学习使用调试器,它会在一年或两年内(我的情况下)为您节省数百小时。
独立播放器下载是相同的,唯一不同的是:
选择调试&gt;开始远程调试会话&gt; ActionScript 3.0。
在Flash开发中,这是:
调试&gt;启动远程会话
现在查看该跟踪,如果您不知道如何修复它,请在此处发布第二个问题或更多代码。 然后学习使用调试器。
本教程采用不同的语言(Java),但专注于调试器概念,而不是代码(Step over,Step Into,Step out,yada yada)。 Flex中没有调试器的跟踪部分,因此在2:50之后无视。
适应Step Into,Step Out,Step Over。非常强大。
此外,在左侧(左下角),您可以查看内存中对象的状态(属性内的数据)。它击败跟踪变量来计算出值(如上所述)。