Приложение Haxe закрывается при развертывании в Windows

Я делаю игровой движок в haxe/openfl. до сих пор он просто должен отображать изображение, которое принадлежит объекту вещи. то, что я создал до сих пор, отлично работает при развертывании в качестве приложения флэш-памяти, но мгновенно закрывается при развертывании его как приложения Windows. Он просто создает пустой экран в HTML5. Я не проверял другие цели. Я использую HIDE, и каждый раз, когда происходит сбой, HIDE выводит сообщение: "Файл c:\Users\Adu\Documents\HaxeProjects\Downloaded\Export\windows\cpp\bin\Downloaded.exe был изменен. Перезагрузить?" и дает мне варианты да или нет. Мой ответ не меняет ситуацию. Когда я вручную захожу в каталог экспорта и запускаю приложение, оно выдает ошибку: "Ошибка Custom([file_write,stderr]). Вот мой код:

Главный:

package;
import openfl.display.Graphics;

import openfl.Assets;
import openfl.display.Bitmap;
import openfl.display.Sprite;
import openfl.events.Event;
import openfl.Lib;
import openfl.text.TextField;
import openfl.text.TextFormat;
import openfl.ui.Keyboard;
import openfl.events.*;

class Main
{

    static var obj(default,default):ObjectManager; //contains the list that all gameobjects add themselves to
    static var stage = Lib.current.stage;

    public static function main() // this is the gameloop
        {
            // static entry point
            startUp();
            var running = true; // gives me a way to exit the gameloop
            while (running)
                {
                    logic();
                    render();
                    Lib.current.stage.addEventListener(KeyboardEvent.KEY_DOWN, function(event)
                                {
                                    if (event.keyCode == Keyboard.ESCAPE)
                                        {
                                            running=false;
                                        }
                                });
                }
        }

    static function startUp() // runs once, when the game is started
        {
            obj= new ObjectManager();
            stage.align = openfl.display.StageAlign.TOP_LEFT;
            stage.scaleMode = openfl.display.StageScaleMode.NO_SCALE;
        }           


    static function logic() // loops, this handles the logic
        {
            var thing = new GameObject("assets/pixel_thing.png", 1, obj);

            var mech = new GameObject("assets/mechwarrior.png", 0, obj);
        }

    static function render() // runs right after logic and draws everything to the screen
        {
            for (i in obj.objects) //iterates through a list of gabeobjects and draws them, it is 2 dimensional so that I can draw objects in blocks
                {
                    for (j in i)
                        {
                            Lib.current.addChild(j);
                        }

                }


        }   


}

GameObject:

package ;
import openfl.display.BitmapData;
import openfl.Assets;
import openfl.display.Bitmap;
import openfl.display.Sprite;
import openfl.events.Event;
import openfl.Lib;
import openfl.text.TextField;
import openfl.text.TextFormat;

class GameObject extends Sprite
{
public function new(?image:String, zOrder:Int, objectManager:ObjectManager) // image is the image, zorder is which layer it's drawn on, lower layers are drawn on top objectmanager is just there to help me pass the list to the object
{
    super();

    var data = Assets.getBitmapData(image);//this is the image data
    var bitmap:Bitmap = new Bitmap(data);//this is the actual image
    Lib.current.stage.addChild(bitmap);//this sraws the image when the object is instantiated
    objectManager.objects[zOrder].push(this);// this adds it to the list of objects
}
}

ObjectManager:

package ;


class ObjectManager
{
public var objects = new Array<Array<GameObject>>();
}

почему работает на флеше, а не на windows? Как это исправить?

1 ответ

Решение

Во-первых, на флэш-памяти это тоже не работает. Вы запускаете это в проигрывателе Flash Debug? Если вы этого не сделаете, что, как я полагаю, имеет место, вы не увидите никаких исключений.

В этой строке есть нулевая ссылка:

objectManager.objects[zOrder].push(this);// this adds it to the list of objects

Вы обращаетесь к массиву по индексу zOrder, которого не существует objects инициализируется в [], который не включает в себя "внутренние массивы" (на самом деле он не может знать, сколько их должно быть?).


Теперь сборки Windows не дают вам очень полезной отладочной информации по умолчанию. Простой способ обойти это - использовать neko (который в основном ведет себя так же, как сборки hxcpp, за исключением того, что он компилируется быстрее и работает хуже) для отладки, где вы получаете трассировку стека по умолчанию при сбоях.

Конечно же, это та же проблема, что и во флэш-памяти, с той лишь разницей, что нативные сборки терпят крах, в то время как флэш-память просто "игнорирует" и пытается продолжить.

Invalid field access : objects
Called from GameObject::new line 92
Called from GameObject::$init line 83
Called from Main::logic line 61
Called from Main::main line 38
Called from Reflect::callMethod line 58
Called from ApplicationMain::main line 91
Called from openfl.Lib::create line 113

Для лучшей информации по отладке сборки hxcpp, вы можете взглянуть на библиотеку crashdumper.

Другие вопросы по тегам