Не могу получить учебник для работы: Построить физический платформер за час - PullRequest
1 голос
/ 19 октября 2011

Итак, я нашел этот учебник в Интернете, и идея изучения этого в течение часа привлекла меня:

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

Проблема в том, что я не могу заставить его работать после достиженияШаг 14 - когда я тестирую фильм, как говорится во втором абзаце, я получаю ошибки. Редактировать Проблема была сужена до строки 31 world = null.Возможно, что я хочу узнать более конкретно: Каким будет мир? Как мне определить мир, чтобы получить конечный результат, продемонстрированный в учебнике?

Редактировать 2 Хорошо, я делаю успехи здесь, для всех, кто хочет знать.Я заменил метод listenWhileVisible , используемый в руководстве, на метод addEventListener , поэтому мне даже не нужно упоминать свойство world.Так что теперь нет ошибок, НО на этом этапе в уроке я предполагаю, что смогу перемещать героя влево и вправо, чего не происходит.Любая помощь, почему?новый код обновлен ниже


Я пробовал тестировать фильм после каждого шага, и в нем не было ошибок, пока я не применил класс view.characters.HeroCharacter к муви клипу my hero,Так что, похоже, проблема в 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
    {
    }

}
}

Я остановился на параграфе 2 шага 14 ине буду продолжать с остальной частью учебника, пока я не смогу разобраться с этим.Спасибо за любую помощь.

1 Ответ

0 голосов
/ 19 октября 2011

Редактировать: Я думаю, что я ошибся ниже, на самом деле, кажется, что это в функции super.create (). В любом случае на всякий случай протестируйте приведенную ниже трассировку, а затем найдите отладчик и вернитесь с этой конкретной строкой кода, вызывающей проблемы. Edit 2: нет, это не в super.create (), данные об ошибках на секунду меня смутили, сделайте это ниже.

Скорее всего, переменная "мир" не определена.

введите первую строку (трассировку) в ваш код следующим образом:

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

Это должно показать что-то вроде: мир = ноль мир = не определено;

Также научитесь отлаживать приложение с помощью отладчика. Я начинаю сеанс удаленной отладки в тех случаях, когда я не уверен, что происходит (сейчас я должен быть прав). Отладчик точно определит нужную строку, которую нужно использовать.

Еще один способ отладки, хотя и медленнее, - ввести несколько операторов трассировки и посмотреть, какие из них не сработали. Код между ними вызывает проблему. Я не рекомендую это.

Убедитесь, что вы научитесь использовать отладчик, это сэкономит вам сотни часов в течение года или двух (мой случай).

удаленная отладка во флэш-памяти

загрузка отдельного плеера такая же, отличается только:

Выберите «Отладка»> «Начать сеанс удаленной отладки»> ActionScript 3.0.

Во флэш-разработке это:

Отладка> Начать удаленный сеанс

А пока проверьте эту трассировку, и если вы не знаете, как ее исправить, опубликуйте второй вопрос или более код здесь. Тогда научитесь пользоваться отладчиком .

Учебник по отладчику

Учебное пособие написано на другом языке (Java), но сосредоточено на концепциях отладчика, а не на коде (Шаг за шагом, Шаг вперед, Шаг за шагом, yada yada). Часть отслеживания отладчика отсутствует во Flex, поэтому не обращайте внимания после 2: 50.

Полегче с Step Into, Step Out, Step Over. Очень мощный.

Кроме того, слева (слева внизу) вы можете просматривать состояние объектов в памяти (данные внутри свойств). Он превосходит переменные трассировки для определения значений (как указано выше).

...