Haxeflixel: после tut только черный экран

Я следую инструкциям здесь... http://x01010111.com/haxeflixel.php#w3

Я добрался до той части, где он говорит «Отлично, но», и попытался скомпилировать, но ничего не отобразилось. Я пытался сравнить свой код с его несколько раз, углубляясь в туториал (сначала я остановился, когда он впервые упомянул, что должен быть только белый фон, и я скомпилировал для сравнения), чтобы увидеть, исчезнет ли проблема (думая, что это может быть несколько устаревшим и т. д.). Я искал объяснение и обнаружил, что не совсем знаю, что искать, и не нашел ничего полезного.

Я ничего не менял в своей установке, я много раз компилировал ранее без проблем (много раз в этом же учебнике), так что это что-то в разделе «Двигаясь вперед», я думаю, что я сделал что-то неправильно.

Итак, ничего не отображается, вот мой код PlayState.hx.

package;

import flixel.FlxG;
import flixel.FlxSprite;
import flixel.FlxState;
import flixel.FlxObject;
import flixel.tile.FlxTilemap;
import flixel.text.FlxText;
import flixel.ui.FlxButton;
import flixel.util.FlxMath;
import flixel.util.FlxStringUtil;
import flixel.FlxCamera;
import flixel.group.FlxGroup;
import flixel.text.FlxText;
import flixel.util.FlxTimer;
import openfl.Assets;


/**
 * A FlxState which can be used for the actual gameplay.
 */
class PlayState extends FlxState
{

    var level:FlxTilemap;
    var player:FlxSprite;


    /**
     * Function that is called up when to state is created to set it up. 
     */
    override public function create():Void
    {

        FlxG.camera.bgColor = 0xFF6DC2CA;

        addLevel();
        addPlayer(2, 22);
        setCamera();

        super.create();
    }

    /**
     * Function that is called when this state is destroyed - you might want to 
     * consider setting all objects this state uses to null to help garbage collection.
     */
    override public function destroy():Void
    {
        super.destroy();
    }

    /**
     * Function that is called once every frame.
     */
    override public function update():Void
    {
        super.update();

        FlxG.collide(level, player);
        playerMovement();
    }   

    function playerMovement():Void
    {
        player.velocity.x = 0;
        if(FlxG.keys.pressed.LEFT) player.velocity.x -= 100;
        if(FlxG.keys.pressed.RIGHT) player.velocity.x += 100;

        if(FlxG.keys.justPressed.SPACE && player.isTouching(FlxObject.FLOOR)) player.velocity.y = -200;
    }

    function addLevel():Void
    {
        level = new FlxTilemap();
        level.loadMap(Assets.getText("assets/data/Map1_Level.csv"), "Assets/images/tiles.png", 16, 16);
        add(level);
    }

    function setCamera():Void
    {
        FlxG.camera.follow(player, FlxCamera.STYLE_PLATFORMER);
        FlxG.camera.setBounds(0, 0, level.width - 16, level.height - 16, true);
    }

    function addPlayer(X:Int, Y:Int):Void
    {
        player = new FlxSprite(X * 16, Y * 16 - 8);
        player.makeGraphic(6, 8, 0xFFFF0000);
        player.acceleration.y = 800;
        add(player);
    }
}

И Main.hx...

package;

import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.Lib;
import flixel.FlxGame;
import flixel.FlxState;

class Main extends Sprite 
{
    var gameWidth:Int = 320; // Width of the game in pixels (might be less / more in actual pixels depending on your zoom).
    var gameHeight:Int = 240; // Height of the game in pixels (might be less / more in actual pixels depending on your zoom).
    var initialState:Class<FlxState> = PlayState; // The FlxState the game starts with.
    var zoom:Float = 2; // If -1, zoom is automatically calculated to fit the window dimensions.
    var framerate:Int = 60; // How many frames per second the game should run at.
    var skipSplash:Bool = false; // Whether to skip the flixel splash screen that appears in release mode.
    var startFullscreen:Bool = false; // Whether to start the game in fullscreen on desktop targets

    // You can pretty much ignore everything from here on - your code should go in your states.

    public static function main():Void
    {   
        Lib.current.addChild(new Main());
    }

    public function new() 
    {
        super();

        if (stage != null) 
        {
            init();
        }
        else 
        {
            addEventListener(Event.ADDED_TO_STAGE, init);
        }
    }

    private function init(?E:Event):Void 
    {
        if (hasEventListener(Event.ADDED_TO_STAGE))
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
        }

        setupGame();
    }

    private function setupGame():Void
    {
        var stageWidth:Int = Lib.current.stage.stageWidth;
        var stageHeight:Int = Lib.current.stage.stageHeight;

        if (zoom == -1)
        {
            var ratioX:Float = stageWidth / gameWidth;
            var ratioY:Float = stageHeight / gameHeight;
            zoom = Math.min(ratioX, ratioY);
            gameWidth = Math.ceil(stageWidth / zoom);
            gameHeight = Math.ceil(stageHeight / zoom);
        }

        addChild(new FlxGame(gameWidth, gameHeight, initialState, zoom, framerate, framerate, skipSplash, startFullscreen));
    }
}

До сих пор я сталкивался с рядом проблем с Haxeflixel, и, за исключением предыдущего устаревшего руководства, всегда было что-то глупое, что я делал неправильно.

Изменить: я попытался использовать режим отладки, чтобы показать больше информации, но он не показал никаких ошибок или чего-либо еще в этом отношении. Я нажал ~, чтобы посмотреть, не пропустил ли я что-нибудь, и снова ничего. Что я ищу в режиме отладки?

Я использую отладчик содержимого проектора Flash Player для запуска файла .swf.

Добавлен файл Main.hx


person Ajacmac    schedule 08.11.2015    source источник
comment
Существует ли файл Map1_level.csv?   -  person 5Mixer    schedule 08.11.2015
comment
Во флэш-памяти черный экран обычно означает, что возникло исключение. Вам нужно использовать Debug Flash Player для просмотра исключений. Сообщение об ошибке должно помочь определить проблему.   -  person Gama11    schedule 08.11.2015
comment
Map1_Level.csv существует, находится в правильной папке. Я видел ошибки в выпуске, поэтому решил, что все будет хорошо, спасибо, что поправили меня!   -  person Ajacmac    schedule 09.11.2015
comment
@ Gama11 Gama11 Я больше ничего не получил из режима отладки (дополнительная информация в редактировании вопроса). Что я делаю неправильно?   -  person Ajacmac    schedule 09.11.2015
comment
Я не говорю об режиме отладки или встроенном отладчике flixel, я говорю о запуске вашего .swf с помощью отладочного флеш-плеера (отладчик содержимого проектора Flash Player).   -  person Gama11    schedule 09.11.2015
comment
Кроме того, дважды проверьте, что оно PlayState передано вызову FlxGame super в качестве начального состояния в Main (в отличие от MenuState, которое используется по умолчанию в шаблоне).   -  person Gama11    schedule 09.11.2015
comment
@ Gama11 Gama11 На самом деле это то, что я использовал все время, я не видел никаких исключений. Он запускается в PlayState.hx. Я добавил свой код Main.hx   -  person Ajacmac    schedule 09.11.2015


Ответы (1)


При попытке запустить этот код с помощью ресурсов, предоставленных в учебнике, я получил следующую ошибку времени выполнения на панели вывода моего редактора (я использую возвышенный текст)

Assets.hx:149: [openfl.Assets] Нет ресурса BitmapData с идентификатором «Assets/images/tiles.png».

Если мы посмотрим на PlayState.hx в строке 76, то увидим, что он пытается загрузить ресурс "Assets/images/tiles.png". Поиск активов чувствителен к регистру, а каталог активов по умолчанию имеет строчные буквы, поэтому это нужно изменить на "assets/images/tiles.png".

После этого этот код у меня работал нормально.

Обратите внимание, что для отладки я использую не flash, а neko. если у вас возникли проблемы с чтением отладочного вывода во флеш-памяти, возможно, вам лучше сначала протестировать с помощью neko, а затем развернуть для флэш-памяти или целевой платформы.

person ProPuke    schedule 11.11.2015