画布绘制不正确(不稳定)

时间:2013-06-19 14:33:31

标签: javascript html5 canvas

我正在构建一个HTML5 / javascript“简单”游戏,但我的画布图有一个不寻常的问题。它很不稳定。

我有一张地图,需要这样绘制:

enter image description here

背景有2层:海洋和岛屿。 用户界面有6个或更多按钮/图像。

有时会这样画:

enter image description here

有时甚至不会绘制UI:

但是在一些错误的图纸(F5)之后,它开始正确地绘制出来。 所以,它很不稳定,我不明白为什么。 这是我的代码:

// Background Layers
    Game.m_gameUI.drawBG();

    // Draw User Interface
    Game.m_gameUI.drawUI();     

    // Draw Score
    Game.m_gameUI.drawScore();

drawBG : function () {  

    // Layer 1
    var img1 = new Image();

    img1.id = 'map2_bg';
    img1.src = GameUI.BKGIMG3_SRC;

    GameUI.m_canvasDraw.drawImage( img1, 0,0, GameUI.actualCanvasWidth, GameUI.actualCanvasHeight );

    // Layer 2
    var img2 = new Image();

    img2.id = 'map_bg';
    img2.src = GameUI.GAME_MAP_SRC;

    GameUI.m_canvasDraw.drawImage( img2, 0,0, GameUI.actualCanvasWidth, GameUI.actualCanvasHeight );
},


drawUI : function () {  

    GameUI.m_canvasDraw.globalAlpha = 1;

    // BagPack
    GameUI.drawUiImage( 'mochila' , GameUI.actualCanvasWidth - 59, 110 , 59, 66 );

    // Home
    GameUI.drawUiImage( 'home' , GameUI.actualCanvasWidth - 102, 0 , 102, 58 );
    //GameUI.setUiEvent( 'home' );

    // Points
    GameUI.drawUiImage( 'bandeira' , 0, 0 , 164, 34 );

    // Help
    GameUI.drawUiImage( 'ajuda' , 0, GameUI.actualCanvasHeight - 71 , 84, 71 );

    // Email
    GameUI.drawUiImage( 'email' , GameUI.actualCanvasWidth - 102 - 96, 0 , 131, 58 );

    // Volume
    GameUI.drawUiImage( 'volume' , GameUI.actualCanvasWidth - 66, GameUI.actualCanvasHeight - 71 , 66, 71 );
},

drawUiImage : function ( image, x, y, width, height ) {

    GameUI.m_canvasDraw.restore();

    var img = new Image();

    var filename_off = image + '_off.png';
    var filename_on = image + '_on.png';

    img.id = image;

    // Assuming you instantiated the image url on class atributes
    img.src = GameUI.ui_img_folder + filename_off;

    // Add the variable into class
    GameUI[image] = image;

    // Draw it
    GameUI.m_canvasDraw.drawImage( img, x, y, width, height );  
    GameUI.m_canvasDraw.restore();
},

我是盲人还是什么? 或者只是画错了订单?

任何提示都会被贬低。 谢谢, Victor Souto

1 个答案:

答案 0 :(得分:2)

加载(创建)图像是一种异步操作。在你的代码中,你正在做这样的事情(伪代码):

var img = new Image();
img.src = "http://example.com/myImage.png";
canvas.drawImage(img, ...);

如果您有快速连接(本地局域网,......)或图像已缓存,那么“img.src = ...”之后的图像可能已准备好用于绘图。

多次按F5后,我猜你的图像在缓存中,因此接缝工作。

要解决您的问题,您必须等待加载的事件。

var img = new Image();
img.onload = function() { /* insert draw code here */ }
img.src = "http://example.com/myImage.png";

对于游戏开发,我建议构建或使用资产库,处理图像资源的加载/缓存。

顺便说一下,在开发过程中关闭浏览器缓存(例如:chrome - >开发工具 - >设置)以避免缓存问题。