Search code examples
haxehaxeflixel

Haxeflixel: following tut, only getting a black screen


I'm following the tutorial here... http://x01010111.com/haxeflixel.php#w3

I got to the part where he says "Awesome, but" and tried compiling, only to have nothing displayed. I tried comparing my code to his a bunch of times, going farther into the tutorial (I initially stopped when he first mentioned that there should only be a white background, and I compiled for comparison) to see if the problem would disappear (thinking it may have been somewhat outdated, etc.). I searched around looking for an explanation and found I didn't quite know what to search for, and didn't find anything that was helpful.

I haven't changed anything in my install, I've compiled many times previously without issue (numerous times in this same tutorial), so it's something in the Moving Forward section that I did wrong I'm thinking.

So, nothing is displayed, here's my PlayState.hx code.

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);
    }
}

And 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));
    }
}

I've been running into a number of problems so far with Haxeflixel and with the exception of a previous out of date tutorial it's always been something stupid that I did wrong.

Edit: I tried using debug mode to show more information, but it didn't show any errors, or anything else for that matter. I hit ~ to see if there was anything I missed there and, again, nothing. What am I looking for in debug mode?

I'm using the Flash Player Projector Content Debugger to run my .swf

Added Main.hx


Solution

  • Attempting to run that code with the assets provided by the tutorial I received the following runtime error in my editor output panel (I am using sublime text)

    Assets.hx:149: [openfl.Assets] There is no BitmapData asset with an ID of "Assets/images/tiles.png"

    If we look at PlayState.hx on line 76 we can see it is attempting to load the asset "Assets/images/tiles.png". Asset lookups are case sensitive and the asset directory is in fact lowercase by default, so this needs changing to "assets/images/tiles.png"

    After doing so that code ran fine for me.

    Note that I'm not using flash for debugging this, but neko. if you're having trouble reading debug output in flash you might be best testing with neko first, and then later deploying for flash or your target platfokrm.