2017-09-20 15 views
0

私は、既存のアプリケーション内のWebViewで実行されているHTML5キャンバスベースのゲームを開発しています。最初にゲームを実行すると、バックグラウンドで正常に読み込まれ、すべてのログには準備ができて実行中であることが示唆されます。ただし、WebViewには何も表示されません。 WebViewに何か他のものをロードしてから私のゲームに戻すと、前と同じように正常にロードされてレンダリングされます。キャンバスが最初に実行されているときに表示されないようにすることができますが、それは後続のリロードでのみ機能します。詳細についてはHTML5 - Android WebViewの最初の読み込み時にキャンバスがレンダリングされない

  • 私が初めてゲームをロードするには、コンソールのエラーを取得していません。
  • iOS版のアプリケーションでゲームを実行すると、正常に読み込まれます。
  • キャンバス要素に適用されたCSSはレンダリングされません。表示する前に資産を読み込むことは問題ではないことを示唆しています。

私が調査してきたすべての問題は、彼らが表示される前に資産をレンダリングするために試みることによって引き起こされたので、その後のリロードが表示されているこれらの今、キャッシュされた画像によって固定したが、私はに失敗キャンバスに関する何かを見つけることができませんAndroidにはまったく表示されません。

は、ここでのWebViewによってロードされたHTMLです:

<!doctype html> 
<html lang="en"> 

<head> 
    <meta charset="utf-8"> 
    <meta name="viewport" content="width=device-width, minimum-scale=1, initial-scale=1, user-scalable=yes"> 
    <title>Darts</title> 
    <meta name="description" content="Darts GamePad Game"> 
    <script src="js/dummy-gamepad-functions.js"></script> 
    <script src="js/libs/polyfill.js"></script> 
    <script src="js/gamepad-client.js"></script> 
    <script src="js/darts-boot.js"></script> 
    <script src="js/darts-loader.js"></script> 
    <link rel="stylesheet" href="css/darts.css"> 
</head> 

<body onload=bootGame()> 
    <div id="darts-game-container"></div> 
</body> 

</html> 

そして、これは私のonloadイベントスクリプトです:私は私のキャンバス、リサイズメソッドに絞り込ま後

var bootGame =() => { 

    //create canvas element 
    let canvas = document.createElement('canvas'); 
    canvas.id = "darts-canvas"; 
    canvas.width = 740; 
    canvas.height = 400; 

    let gameContainer = document.getElementById("darts-game-container"); 
    gameContainer.appendChild(canvas); 

    //scale canvas to view window 
    let gamepadViewport = document.getElementById("darts-game-container"), 
    gamepadCanvas = document.getElementById("darts-canvas"), 
    viewportWidth = window.innerWidth, 
    canvasWidth = gamepadCanvas.width, 
    viewportHeight = window.innerHeight, 
    canvasHeight = gamepadCanvas.height; 

    let scaleRatio = Math.min(viewportWidth/canvasWidth, viewportHeight/canvasHeight); 
    if (scaleRatio < 1) { 
    gamepadViewport.style.transform = `scale(${scaleRatio}, ${scaleRatio})`; 
    gamepadViewport.style.webkitTransform = `scale(${scaleRatio}, ${scaleRatio})`; 
    gamepadViewport.style.mozTransform = `scale(${scaleRatio}, ${scaleRatio})`; 
    gamepadViewport.style.oTransform = `scale(${scaleRatio}, ${scaleRatio})`; 
    } 

    //initialise Loader 
    Darts.Loader = new Loader(); 

    //initialise GamePad API, then initialise core classes when loaded 
    GamePadClient = new GamePadClient(); 
    GamePadClient.initialise() 
    .then(() => { 

     //load all scripts 
     return Darts.Loader.loadScripts(LIBS_TO_LOAD, COMMON_LIB_PATH, LIB_NAME_SUFFIX) 
    }) 
    .then(() => { 
     return Darts.Loader.loadScripts(SCRIPTS_TO_LOAD, COMMON_SCRIPT_PATH, SCRIPT_NAME_SUFFIX) 
    }) 
    .then(() => { 
     //initalise core classes 
     Darts.Controller = new Controller(); 
     Darts.Logic = new Logic(); 
     Darts.Display = new Display(); 
     Darts.GameProps = new GameProps(); 
     Darts.GameState = new GameState(); 

     //loads display elements and scripts, then inits game once complete 
     Darts.Controller.initGame(); 
    }); 

} 
+0

ウェブビューの作成と処理に関連するコードを共有できますか? – amacf

+0

@amacf関連するコード例を追加しました – lhmcneil

答えて

1

私はそれを解決してきました。 window.innerWidthとwindow.innerHeightは、window.onloadが呼び出されたときに初期値が0に設定されていません。window.onresizeイベントが呼び出された後にのみ適切に設定されるため、それをリスンしてからキャンバスを拡大縮小します。適切な結果。

関連する問題