1

HaxeFlixel と OpenFL 2.1.3 を使用して Android を対象として書いているゲームで問題が発生しています。ゲームはランダムにクラッシュし、時には開始直後に、時には数分後に、メッセージや明らかなバグなしで即座にアプリを閉じます. なんらかの理由で、IDE が接続されたアプリのデバッグに問題があるため、デバイスで実行中に logcat を接続し、次のトレースに絞り込みました。

I/trace   ( 8505): Lib.hx:324: Null Object Reference
I/trace   ( 8505): Called from openfl._v2.display.Stage.__render (openfl/_v2/display/Stage.hx line 1035)
I/trace   ( 8505): Called from openfl._v2.display.DisplayObjectContainer.__broadcast (openfl/_v2/display/DisplayObjectContainer.hx line 280)
I/trace   ( 8505): Called from openfl._v2.display.DisplayObject.__broadcast (openfl/_v2/display/DisplayObject.hx line 174)
I/trace   ( 8505): Called from openfl._v2.display.DisplayObject.__dispatchEvent (openfl/_v2/display/DisplayObject.hx line 195)
I/trace   ( 8505): Called from openfl._v2.events.EventDispatcher.dispatchEvent (openfl/_v2/events/EventDispatcher.hx line 100)
I/trace   ( 8505): Called from openfl._v2.events.Listener.dispatchEvent (openfl/_v2/events/EventDispatcher.hx line 270)
I/trace   ( 8505): Called from flixel.FlxGame.onEnterFrame (flixel/FlxGame.hx line 493)
I/trace   ( 8505): Called from flixel.FlxGame.step (flixel/FlxGame.hx line 648)
I/trace   ( 8505): Called from flixel.FlxGame.update (flixel/FlxGame.hx line 696)
I/trace   ( 8505): Called from flixel.system.frontEnds.SoundFrontEnd.update (flixel/system/frontEnds/SoundFrontEnd.hx line 278)
I/trace   ( 8505): Called from flixel.group.FlxTypedGroup.update (flixel/grou
I/WindowState(  467): WIN DEATH: Window{2b71e64d u0 com.al.shb/com.al.shb.MainActivity}
W/WindowManager(  467): Force-removing child win Window{d7de13 u0 SurfaceView} from container Window{2b71e64d u0 com.al.shb/com.al.shb.MainActivity}
W/WindowManager(  467): Failed looking up window
W/WindowManager(  467): java.lang.IllegalArgumentException: Requested window android.os.BinderProxy@2038b502 does not exist
W/WindowManager(  467):     at com.android.server.wm.WindowManagerService.windowForClientLocked(WindowManagerService.java:8539)
W/WindowManager(  467):     at com.android.server.wm.WindowManagerService.windowForClientLocked(WindowManagerService.java:8530)
W/WindowManager(  467):     at com.android.server.wm.WindowState$DeathRecipient.binderDied(WindowState.java:1142)
W/WindowManager(  467):     at android.os.BinderProxy.sendDeathNotice(Binder.java:551)
I/WindowState(  467): WIN DEATH: null
I/InputDispatcher(  467): Dropping event because there is no touchable window at (87, 430).
I/Zygote  (  130): Process 8505 exited cleanly (1)
I/ActivityManager(  467): Process com.al.shb (pid 8505) has died
W/ActivityManager(  467): Force removing ActivityRecord{3f0e8887 u0 com.al.shb/.MainActivity t13}: app died, no saved state

SoundFrontEnd/FlxTypedGroupは、ゲーム内の効果音のグループに問題があることを示唆しています。サウンドは正常に再生され、.ogg ファイルとしてエンコードされているようです。特にサウンドを再生しようとするとクラッシュするのではなく、ランダムに発生します。

HaxeFlixel で推奨されているように、Android ターゲットのサウンドをキャッシュしますがinit()、Main クラスにキャッシュします。これは問題になりません。

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

    #if android
    FlxG.sound.cache("button");
    FlxG.sound.cache("t1");
    FlxG.sound.cache("t2");
    FlxG.sound.cache("fx");
    #end

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

を使用して再生されFlxG.sound.play("button")ます。

Lib.hxを確認するために OpenFLも調べNull Object Referenceました。次のメソッドの一番下のコード ブロックに問題があるように見えますが、これはニシンであると思われます。

public static function rethrow (error:Dynamic):Void {   
    var event = new UncaughtErrorEvent (UncaughtErrorEvent.UNCAUGHT_ERROR, true, true, error);

    if (__uncaughtExceptionHandler != null && __uncaughtExceptionHandler (event)) {
        return;
    }

    Lib.current.loaderInfo.uncaughtErrorEvents.dispatchEvent (event);   

    if (!event.__getIsCancelled ()) {
        var message = "";
        if (error != null && error != "") {
            message = error + "";
        }

        var stack = CallStack.exceptionStack ();
        if (stack.length > 0) {
            message += CallStack.toString (stack) + "\n";
        } else {
            message += "\n";
        }

        #if (mobile && !ios)
        trace (message);
        #else
        Sys.stderr ().write (Bytes.ofString (message));
        #end
        Sys.exit (1);
    }
}

Flash や Windows をターゲットにしてもまったく問題はありません。Android をターゲットにする場合のみです。違いは、Android が使用するのに対し、Flash と Windows はmp3エンコードされたファイルを使用することoggです。

4

0 に答える 0