0

编辑:解决上面的一些行。

我正在尝试使用 html5、canvas 和一些 jQuery 来弹跳图片。我已经成功地制作了一些弹跳的球,但我不知道如何绘制图片而不是简单的“粒子”。

我尝试过不同的方式,但实际上我认为我错过了一些东西。我发布了整个 html,因此您可以轻松地复制/粘贴它。

在我的尝试下,有一个带有工作弹跳球的评论部分。

太感谢了!

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>HTML5 Canvas Explode Demo</title>
<link rel="stylesheet" href="styles.css" />
<meta name="viewport" content="width=320 initial-scale=1.0, user-scalable=no" />
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>

<style type="text/css">
* {
    margin: 0; padding: 0;
}

html, body {
    width: 100%;
    height: 100%;
}

canvas {
    display: block;
    background: whiteSmoke;
    width: 100%;
    height: 100%;
}
#presentation{
    position: fixed;
    background: rgba(0,0,0,0.7);
    width: 100%;
    height: 70px;
    box-shadow: 7px 7px 13px rgba(0,0,0,0.3);
    color: white;
    font-family:futura;
    font-size: 30px;
    padding-left: 50px;
    padding-top: 10px;
}
</style>

</head>
<body>
<div id="presentation">Bouncing Baaaaalls!</div>
<canvas id="output" ></canvas>



<script type="text/javascript">


        (function() {
        window.requestAnimationFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame||function(f){window.setTimeout(f,40/60)
            }}});

        var canvas = document.querySelector('canvas');
        var ctx = canvas.getContext('2d');

        function Particle() {
            var W = canvas.width = window.innerWidth;
            var H = canvas.height = window.innerHeight;
            this.radius = 20;
            this.x = parseInt(Math.random() * W);
            this.y = H;

            this.color = 'rgb(' +
            parseInt(Math.random() * 255) + ',' +
            parseInt(Math.random() * 255) + ',' +
            parseInt(Math.random() * 255) + ')';


            if (this.x > W/2 ){

                this.vx = Math.random() * (-15 - -5) + -5;

            }else{

                this.vx = Math.random() * (15 - 5) + 5;

            }


            this.vy = Math.random() * (-32 - -25) + -25;


            this.draw = function() {

                var img = new Image();
                img.src = 'troll1.png';
                ctx.beginPath();
                ctx.fillStyle = "rgb(255,255,255)";
                ctx.fillRect(0, 0, canvas.width, canvas.height);
                ctx.closePath();

                ctx.beginPath();
                ctx.arc(this.x, this.y, 20, 0, 6.28, false); 
                ctx.clip(); 
                ctx.stroke();
                ctx.closePath();
                ctx.drawImage(img, 0, 0);

                //  WORKING PARTICLES STARTS HERE

                // ctx.fillStyle = this.color;

                // ctx.beginPath();

                // ctx.arc(this.x, this.y, this.radius, 0, Math.PI*2, false);
                // ctx.fill();


                // ctx.closePath();

                //  WORKING PARTICLES ENDS HERE


            };

        }
        var particle_count = 20;  
        var particles = [];



        // Now lets quickly create our particle
        // objects and store them in particles array
        for (var i = 0; i < particle_count; i++) {
            var particle = new Particle();
            particles.push(particle);
        }

        function renderFrame() {


            requestAnimationFrame(renderFrame);

            // Clearing screen to prevent trails
            var W = canvas.width = window.innerWidth;
            var H = canvas.height = window.innerHeight;
            ctx.clearRect(0, 0, W, H);

            particles.forEach(function(particle) {

                // The particles simply go upwards
                // It MUST come down, so lets apply gravity
                particle.vy += 1;

                // Adding velocity to x and y axis
                particle.x += particle.vx;
                particle.y += particle.vy;

                // We're almost done! All we need to do now
                // is to reposition the particles as soon
                // as they move off the canvas.
                // We'll also need to re-set the velocities

                if (
                    // off the right side
                    particle.x + particle.radius > W ||
                    // off the left side
                    particle.x - particle.radius < 0 ||
                    // off the bottom
                    particle.y + particle.radius > H
                ) {

                    // If any of the above conditions are met
                    // then we need to re-position the particles
                    // on the base :)


                    // If we do not re-set the velocities then
                    // the particles will stick to base :D

                    // Velocity X
                    particle.x = parseInt(Math.random() * W);
                    particle.y = H;
                    if (particle.x > W/2 ){

                        particle.vx = Math.random() * (-15 - -5) + -5;

                    }else{

                        particle.vx = Math.random() * (15 - 5) + 5;


                    }
                    particle.vy = Math.random() * (-32 - -28) + -28;


                }

                particle.draw();

            });
        }

        $(document).ready(function(){


            renderFrame();

        }); 


</script>
</body>
</html>

编辑解决方案: 首先,感谢markE

我按照他的说法编辑了代码,问题实际上是关于时间的(以及理解我在做什么)。他的回答对我帮助很大。

图像没有移动,因为我实际上并没有告诉它这样做(使用 ctx.drawImage(img, this.x, this.y))。

注意:要使用 chrome 调试画布渲染,请查看HTML5 画布检查器?

所以这里是弹跳巨魔面孔的工作代码(和超评论,感谢课程markE)(将troll1.png图片放在同一文件夹中):

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>HTML5 Canvas Explode Demo</title>
<!--    <link rel="stylesheet" href="styles.css" /> --> <meta name="viewport" content="width=320 initial-scale=1.0, user-scalable=no" />
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>

<style type="text/css">
* {
    margin: 0; padding: 0;
}

html, body {
    width: 100%;
    height: 100%;
}

canvas {
    display: block;
    background: whiteSmoke;
    width: 100%;
    height: 100%;
}
#presentation{
    position: fixed;
    background: rgba(0,0,0,0.7);
    width: 100%;
    height: 70px;
    box-shadow: 7px 7px 13px rgba(0,0,0,0.3);
    color: white;
    font-family:futura;
    font-size: 30px;
    padding-left: 50px;
    padding-top: 10px;
}
</style>

</head>
<body>
<div id="presentation">Bouncing Baaaaalls!</div>
<canvas id="output" ></canvas>



<script type="text/javascript">


(function() {
    //define the animation refresh (frame rendering) with built-in browser timing
    window.requestAnimationFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame||function(f){window.setTimeout(f,40/60)
        }}});

//define some variables: canvas, context, img to put inside the context and an array of bouncing objects
        var canvas = document.querySelector('canvas');
        var ctx = canvas.getContext('2d');
        var img = new Image();
        //IMPORTANT: Wait for the picture to be loaded!
        img.onload = function(){
                alert('troll1 is LOADED.');

                beginAnimation();
        };
        //yes, the src goes after
        img.src = 'troll1.png';

        //how many bouncing objects?
        var particle_count = 4;  
        var particles = [];
        var particle;

        function Particle() {

            //define properties of a bouncing object, such as where it start, how fast it goes

            var W = canvas.width = window.innerWidth;
            var H = canvas.height = window.innerHeight;
            this.radius = 20;
            this.x = parseInt(Math.random() * W);
            this.y = H;

            //Uncomment for coloured particles: 

            // this.color = 'rgb(' +
            // parseInt(Math.random() * 255) + ',' +
            // parseInt(Math.random() * 255) + ',' +
            // parseInt(Math.random() * 255) + ')';

            //end coloured particles

            if (this.x > W/2 ){

                this.vx = Math.random() * (-15 - -5) + -5;

            }else{

                this.vx = Math.random() * (15 - 5) + 5;

            }


            this.vy = Math.random() * (-32 - -25) + -25;

            //we will call this function to actually draw the bouncing object at EVERY FRAME

            this.draw = function() {
                // Bouncing pictures were not bouncing because there were no this.x this.y . Shame on me. 

                 ctx.drawImage(img,this.x,this.y);


                // WORKING PARTICLES STARTS HERE

                // ctx.fillStyle = this.color;

                // ctx.beginPath();

                // ctx.arc(this.x, this.y, this.radius, 0, Math.PI*2, false);
                // ctx.fill();


                // ctx.closePath();

                //WORKING PARTICLES ENDS HERE


            };

        }



        function renderFrame() {

            //RENDER THE PARTICLEEEEEEES!

            requestAnimationFrame(renderFrame);

            // Clearing screen to prevent trails
            var W = canvas.width = window.innerWidth;
            var H = canvas.height = window.innerHeight;
            ctx.clearRect(0, 0, W, H);

            particles.forEach(function(particle) {

                // The bouncing objects simply go upwards
                // It MUST come down, so lets apply gravity
                particle.vy += 1;

                // Adding velocity to x and y axis
                particle.x += particle.vx;
                particle.y += particle.vy;

                // We're almost done! All we need to do now
                // is to reposition the bouncing objects as soon
                // as they move off the canvas.
                // We'll also need to re-set the velocities

                if (
                    // off the right side
                    particle.x + particle.radius > W ||
                    // off the left side
                    particle.x - particle.radius < 0 ||
                    // off the bottom
                    particle.y + particle.radius > H
                ) {

                    // If any of the above conditions are met
                    // then we need to re-position the bouncing objects
                    // on the base :)


                    // If we do not re-set the velocities then
                    // the bouncing objects will stick to base :D

                    // Velocity X
                    particle.x = parseInt(Math.random() * W);
                    particle.y = H;
                    if (particle.x > W/2 ){

                        particle.vx = Math.random() * (-15 - -5) + -5;

                    }else{

                        particle.vx = Math.random() * (15 - 5) + 5;


                    }
                    particle.vy = Math.random() * (-32 - -28) + -28;


                }

                particle.draw();

            });
        }

        function beginAnimation(){
                    //create the particles and start to render them

                   for (var i = 0; i < particle_count; i++) {
                        particle = new Particle();
                        particles.push(particle);
                    }

                    //BOUNCE MOFOS!
                    renderFrame();

            }


</script>

4

1 回答 1

1
于 2013-05-05T05:53:23.203 回答