9

これらの両方をキャンバスで試しましたが、何も表示されませんでした。また、それが効率的であるかどうかも疑わしいです:/。画面に降り注ぐ雨を作ろうとしています.これを行う最も効率的な方法は何だろうか. 私はアニメーションの初心者であり、助けていただければ幸いです。

雨のオブジェクトを作成するのが最善だと思います。それぞれが画面を下ってから上に来て、それらを含む配列です...おそらく、キャンバス幅内のランダムな x 値と 0 の y 値を使用しますが、私はそれを実装する方法がわかりません。助けてください!

                xofRain = 20;
        startY = 0;
        ctx.beginPath();
        ctx.moveTo(xofRain, startY);
        ctx.lineTo(xofRain, startY + 20);
        ctx.closePath();
        ctx.fillStyle = "black"; 
        ctx.fill();


     function rain(xofRain){

        startY = canvas.height();

        ctx.moveTo(xofRain, startY);
        ctx.beginPath();
        ctx.lineTo(xofRain, startY + 3);
        ctx.closePath();
        ctx.fillStyle = "blue"; 
        ctx.fill();
    }
4

2 に答える 2

16

これがあなたの答えです。この雪の雨は、純粋な HTML5 Canvas を使用して作成されています。このアニメーションを実現するために使用される手法は、「ダブル バッファ アニメーション」と呼ばれます。まず、ダブル バッファ アニメーション テクニックとは何かを知っておくとよいでしょう。

ダブル バッファ テクニック: これは、アニメーションをクリアにし、ちらつきを少なくするための高度なテクニックです。この手法では 2 つの Canvas が使用されます。1 つ目は結果を表示するために Web ページに表示され、2 つ目はバックプロセスでアニメーション画面を作成するために使用されます。

これがどのように役立つか、非常に多くの移動を伴うアニメーションを作成する必要があるとします。たとえば、降雪の例のように、多くのフレークが独自の速度で移動しているため、それらを動かし続け、位置を変更する必要があります。各フレークをキャンバス上で更新します。これは処理するのが非常に重いプロセスです。

したがって、ページ キャンバスで各フレークを直接更新する代わりに、バッファ キャンバスを作成します。ここでこれらすべての変更が行われ、30 ミリ秒後にバッファ キャンバスから画像をキャプチャして実際のキャンバスに表示します。

このようにして、アニメーションは明確になり、ちらつきがなくなります。そのため、ここにそのライブの例があります。

http://aspspider.info/erishaan8/html5rain/

そのコードは次のとおりです。

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset=utf-8 />
    <title>HTML5 Rain</title>
    <!--[if IE]>
      <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
    <![endif]-->
    <style>
      article, aside, figure, footer, header, hgroup, 
      menu, nav, section { display: block; }
    </style>
    <script type="text/javascript">
        var canvas = null;
        var context = null;
        var bufferCanvas = null;
        var bufferCanvasCtx = null;
        var flakeArray = [];
        var flakeTimer = null;
        var maxFlakes = 200; // Here you may set max flackes to be created 
    
        function init() {
            //Canvas on Page
            canvas = document.getElementById('canvasRain');
            context = canvas.getContext("2d");
            //Buffer Canvas
            bufferCanvas = document.createElement("canvas");
            bufferCanvasCtx = bufferCanvas.getContext("2d");
            bufferCanvasCtx.canvas.width = context.canvas.width;
            bufferCanvasCtx.canvas.height = context.canvas.height;
    
            
            flakeTimer = setInterval(addFlake, 200);
    
            Draw();
    
            setInterval(animate, 30);
             
        }
        function animate() {
            
            Update();
            Draw();
            
        }
        function addFlake() {
    
            flakeArray[flakeArray.length] = new Flake();
            if (flakeArray.length == maxFlakes)
                clearInterval(flakeTimer);
        }
        function blank() {
            bufferCanvasCtx.fillStyle = "rgba(0,0,0,0.8)";
            bufferCanvasCtx.fillRect(0, 0, bufferCanvasCtx.canvas.width, bufferCanvasCtx.canvas.height);
            
        }
        function Update() {
            for (var i = 0; i < flakeArray.length; i++) {
                if (flakeArray[i].y < context.canvas.height) {
                    flakeArray[i].y += flakeArray[i].speed;
                    if (flakeArray[i].y > context.canvas.height)
                        flakeArray[i].y = -5;
                    flakeArray[i].x += flakeArray[i].drift;
                    if (flakeArray[i].x > context.canvas.width)
                        flakeArray[i].x = 0;
                }
            }
            
        }
        function Flake() {
            this.x = Math.round(Math.random() * context.canvas.width);
            this.y = -10;
            this.drift = Math.random();
            this.speed = Math.round(Math.random() * 5) + 1;
            this.width = (Math.random() * 3) + 2;
            this.height = this.width;
        }
        function Draw() {
            context.save();
            
            blank();
    
            for (var i = 0; i < flakeArray.length; i++) {
                bufferCanvasCtx.fillStyle = "white";
                bufferCanvasCtx.fillRect(flakeArray[i].x, flakeArray[i].y, flakeArray[i].width, flakeArray[i].height);
            }
    
            
            context.drawImage(bufferCanvas, 0, 0, bufferCanvas.width, bufferCanvas.height);
            context.restore();
        }
      
    </script>
    </head>
    <body onload="init()">
      <canvas  id="canvasRain" width="800px" height="800px">Canvas Not Supported</canvas>
    </body>
    </html>

また、このヘルプが充実している場合は、回答として受け入れて作成してください。o_O

乾杯!!!

于 2012-05-30T06:10:31.187 に答える