2017-09-20 4 views
0

기존 애플리케이션에서 WebView에서 실행되는 HTML5 캔버스 기반 게임을 개발 중입니다. 게임을 처음 실행하면 백그라운드에서 성공적으로로드되며 모든 로그는 준비가되어 있고 실행 중이라고 제안합니다. 그러나 WebView에는 아무 것도 표시되지 않습니다. WebView에 다른 것을로드 한 다음 내 게임으로 돌아 오면 이전과 같이 성공적으로로드 된 다음 렌더링됩니다. 캔버스가 처음 실행될 때 표시되는 것을 막을 수있는 것은 무엇입니까? 이후의 재로드에서만 작동합니까? 세부 사항에 대한HTML5 - Android WebView에서 첫 번째로드시 렌더링되지 않는 캔버스

:

  • 나는 처음으로 게임을로드에는 콘솔 오류를 얻을.
  • iOS 버전의 응용 프로그램에서 실행하면 게임이 성공적으로로드됩니다.
  • 캔버스 요소에 적용된 CSS가 렌더링되지 않습니다. 표시하기 전에 내 애셋을로드하는 데 문제가 없다고 제안합니다.

내가 조사한 모든 문제는 자산이 표시되기 전에 렌더링하려고했기 때문에 후속 다시로드가 이제는 현재 캐시 된 이미지에 의해 수정되었지만 캔버스와 관련하여 아무 것도 찾을 수 없습니다. Android에서 전혀 표시되지 않습니다.

다음은 웹보기에 의해로드 된 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> 

그리고 이것은 내 온로드 스크립트입니다 : 내 캔버스 크기를 조정하는 방법으로 좁혀 후

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.onloadize 이벤트가 호출 된 후에 만 ​​window.onload가 호출 될 때 window.innerWidth 및 window.innerHeight가 설정되지 않습니다. 초기 값은 0입니다. 따라서 해당 값을 수신 한 다음 캔버스 크기를 조절하면 적절한 결과.

관련 문제