【问题标题】:Canvas Images does not Persist while using KineticJS?使用 KineticJS 时画布图像不会持续存在?
【发布时间】:2013-03-02 15:39:21
【问题描述】:

我正在使用 Kinetic JS 构建一个小游戏,其中汽车在赛道上运行。我使用了草的图像,但试图自己建造道路。我的问题是,每当我运行项目时,道路的黑色补丁会闪烁然后消失并且草会出现,而我需要将道路建在草地上。请帮忙。我已经分享了小提琴。

http://jsfiddle.net/shivkumarganesh/aKh7V/embedded/result/

我还提到了下面的代码:-

/*
Declaration of Road,Since the Road will be in 
both the directions I would be making an algorithm 
to get the road on the canvas and
the the car onto it.
*/
function Car(){}

Car.prototype={
    x:0,
    y:0,
    position:0,
    driver:0,
    booster:true,
    positionNext:0,
    getPosition : function(){return this.position;},
    setPosition : function(position){this.position=position;},
    getDriver : function(){return this.driver;},
    setDriver : function(driver){this.driver},
    getBooster : function(){return this.booster;},
    setBooster : function(booster){this.booster=booster;},
    getPositionNext : function(){return this.positionNext;},
    setPositionNext : function(positionNext){this.positionNext=positionNext;},
    drive : function(newPosition){
        /*Code to steer the car to the new box. Either Animate or keep Dynamic*/}
};

/*Making the Booster Class with Appropriate Getters and Setters*/
function Booster(){}
Booster.prototype={
    position:0,
    x:0,
    y:0,
    getX : function(){return this.x;},
    setX : function(x){this.x=x;},
    getY : function(){return this.y;},
    setY : function(y){this.y=y;},
    getPosition : function(){return this.position;},
    setPosition : function(position){this.position=position;}  
};

/*Road Block Class*/
function Road(){}
Road.prototype={
    x:0,
    y:0,
    bomb:false,
    booster:false,
    position:0,
    getX : function(){return this.x;},
    setX : function(x){this.x=x;},
    getBomb : function(){return this.bomb;},
    setBomb : function(bomb){this.bomb=bomb;},
    getBooster : function(){return this.booster;},
    setBooster : function(booster){this.booster=booster;},
    getPosition : function(){return this.position;},
    drawRoadPatch : function(roadLayer,stage){
        var rect = new Kinetic.Rect({
            x:0,
            y:0,
            width:100,
            height:100,
            fill:'black'
        });
        roadLayer.add(rect);
        stage.add(roadLayer);
    }
};

/*Grass For Background*/
function Grass(){}
Grass.prototype={
    grassImage:'',
    grassX:0,
    grassY:0,
    grassWidth:1000,
    grassHeight:500,
    getGrassX : function(){return this.grassX;},
    setGrassX : function(x){this.grassX=x;},
    getGrassY : function(){return this.grassY},
    setGrassY : function(y){this.grassY=y},
    getWidth : function(){return this.grassWidth;},
    setWidth : function(width){this.grassWidth=width;},
    getHeight : function(){return this.grassHeight;},
    setHeight : function(height){this.grassHeight=height;},

    /*Grass Utility Functions*/
    drawGrass : function(background,stage,image){
        image.onload=function(){
        var grass = new Kinetic.Image({
            x:this.grassX,
            y:this.grassY,
            image:image,
            width:this.grassWidth,
            height:this.grassHeight
            });
        background.add(grass);
        stage.add(background);
        }
    },
    changeBackgroud : function(background,stage,image){
      //This can be used to change the backgroud of page  
    }

};





/*Declaring the Stage*/
var stage = new Kinetic.Stage({
    width:1000,
    height:500,
    container:'container'
    });

/*Defining the assets (Images)*/
var backgroundImage = new Image();
var roadImage = new Image();
/*Defining the Layer (Layers)*/
var background = new Kinetic.Layer();
var roadLayer = new Kinetic.Layer();

var backgrass = new Grass();
var road = new Road();
/*Drawing Functions*/
backgrass.drawGrass(background,stage,backgroundImage);
road.drawRoadPatch(roadLayer,stage);



/*Image for Backgroud*/
backgroundImage.src='https://c9.io/shivkumarganesh/kiectcars/workspace/images/grass.jpg';

只要运行上面的代码,你就会明白问题所在。有一个黑色闪烁,我想在草地上作为道路。

【问题讨论】:

    标签: javascript performance canvas html5-canvas kineticjs


    【解决方案1】:

    已修复...

    您的 backgroundImage 在被 backgroundImage.src 完全加载之前已在 drawGrass() 中使用。

    我将你所有的场景设置移到了 backgroundImage.onload 回调函数中,一切都已修复。

    这里是重做的代码和小提琴:http://jsfiddle.net/m1erickson/GyrXr/

    <!doctype html>
    <html>
    <head>
    <link rel="stylesheet" type="text/css" media="all" href="css/reset.css" /> <!-- reset css -->
    <script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
    <script type="text/javascript" src="kinetic-v4.3.3.min.js"></script>
    
    <style>
        body{ background-color: ivory; }
    </style>
    
    <script>
        $(function(){
    
    /*Road Block Class*/
    function Road(){}
    Road.prototype={
        x:0,
        y:0,
        bomb:false,
        booster:false,
        position:0,
        getX : function(){return this.x;},
        setX : function(x){this.x=x;},
        getBomb : function(){return this.bomb;},
        setBomb : function(bomb){this.bomb=bomb;},
        getBooster : function(){return this.booster;},
        setBooster : function(booster){this.booster=booster;},
        getPosition : function(){return this.position;},
        drawRoadPatch : function(roadLayer,stage){
            var rect = new Kinetic.Rect({
                x:0,
                y:0,
                width:100,
                height:100,
                fill:'black'
            });
            roadLayer.add(rect);
            stage.add(roadLayer);
        }
    };
    
    /*Grass For Background*/
    function Grass(){}
    Grass.prototype={
        grassImage:'',
        grassX:0,
        grassY:0,
        grassWidth:1000,
        grassHeight:500,
        getGrassX : function(){return this.grassX;},
        setGrassX : function(x){this.grassX=x;},
        getGrassY : function(){return this.grassY},
        setGrassY : function(y){this.grassY=y},
        getWidth : function(){return this.grassWidth;},
        setWidth : function(width){this.grassWidth=width;},
        getHeight : function(){return this.grassHeight;},
        setHeight : function(height){this.grassHeight=height;},
    
        /*Grass Utility Functions*/
        drawGrass : function(background,stage,image){
            var grass = new Kinetic.Image({
                x:this.grassX,
                y:this.grassY,
                image:image,
                width:this.grassWidth,
                height:this.grassHeight
                });
            background.add(grass);
            stage.add(background);
        },
        changeBackgroud : function(background,stage,image){
          //This can be used to change the backgroud of page  
        }
    
    };
    
    /*Declaring the Stage*/
    var stage = new Kinetic.Stage({
        width:1000,
        height:500,
        container:'container'
        });
    
    /*Defining the assets (Images)*/
    // after waiting for the backgroundImage to load...!
    var backgroundImage = new Image();
    backgroundImage.onload=function(){
        var roadImage = new Image();
        /*Defining the Layer (Layers)*/
        var background = new Kinetic.Layer();
        var roadLayer = new Kinetic.Layer();
    
        var backgrass = new Grass();
        var road = new Road();
        /*Drawing Functions*/
        backgrass.drawGrass(background,stage,backgroundImage);
        road.drawRoadPatch(roadLayer,stage);
    }
    backgroundImage.src='http://c9.io/shivkumarganesh/kiectcars/workspace/images/grass.jpg';
    
        }); // end $(function(){});
    </script>
    
    </head>
    
    <body>
    <div id="container"></div>
    </body>
    </html>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-24
      • 1970-01-01
      • 2018-06-15
      • 2020-08-21
      • 1970-01-01
      • 2014-06-02
      • 2014-08-20
      • 1970-01-01
      相关资源
      最近更新 更多