HTMLキャンバスアニメーションが新しい長方形ごとに一時的なギャップをレンダリングするのはなぜですか?

ブラッド

html5キャンバスにレンダリングされる長方形の配列または「パイプ」があります。新しいパイプは、レンダリング(およびアニメーション化)される前に配列に動的に追加されます。問題は、新しいパイプごとに、それ自体と前のパイプの間に小さなギャップがあり、次のパイプが導入されると、このギャップがなくなることです。どの時点でもギャップがあってはなりません。

それはとても奇妙で、私を怒らせています。

以下のCodepenリンクは、この質問をより明確にするはずです。

Codepenの作業例。

const body = document.getElementsByTagName("body")[0];
const canvasWidth = 500;
const canvasHeight = 820;
const canvas = document.createElement('canvas');
var ctx = canvas.getContext("2d");
var frame_count = 0;
var speed = 1;
var pipes = [];

function Pipe(height) {
  this.x = canvasWidth;
  this.height = height;
  this.update = function() {
    ctx.fill();
    ctx.fillStyle = 'black';
    ctx.beginPath();
    ctx.rect(this.x, 0, 100, this.height);
    this.x = this.x - (1 * speed);
  };
}

function setup() {
  // Render blank canvas to dom
  canvas.width = canvasWidth;
  canvas.height = canvasHeight;
  body.appendChild(canvas);
}

function draw() {
  // Clear canvas
  ctx.clearRect(0, 0, canvas.width, canvas.height);

  // Pipe generator
  if (frame_count % 100 === 0) {
    if (frame_count % 200 === 0) {
      pipes.push(new Pipe(100));
    } else {
      pipes.push(new Pipe(120));
    }
  }

  // Draw pipes
  for (i = 0; i < pipes.length; i++) {
    pipes[i].update();
  }

}

function loop() {
  setTimeout(function() {
    draw();
    frame_count++;
    requestAnimationFrame(loop);
  }, 0);
}

setup();
loop();

海道

これは、描画関数ですべてを逆に行うために発生します;-)

現在、最初に現在のパスを入力し、次にそれを宣言して、最後に位置を更新しています。1フレーム待つのではなく、最新バージョンの図面を塗りつぶすように、他の方法で行う必要があります。

同じフレーム内で次のシェイプが前のシェイプの現在の状態を描画していたため、複数のシェイプが描画されたときに修正されたように見えました。

const body = document.getElementsByTagName("body")[0];
const canvasWidth = 500;
const canvasHeight = 820;
const canvas = document.createElement('canvas');
var ctx = canvas.getContext("2d");
var frame_count = 0;
var speed = 1;
var pipes = [];

function Pipe(height) {
  this.x = canvasWidth;
  this.height = height;
  this.update = function() {
    // first update position
    this.x = this.x - (1 * speed);
    ctx.fillStyle = 'black';
    // then declare the path
    ctx.beginPath();
    ctx.rect(this.x, 0, 100, this.height);
    // finally draw it
    ctx.fill();
  };
}

function setup() {
  // Render blank canvas to dom
  canvas.width = canvasWidth;
  canvas.height = canvasHeight;
  body.appendChild(canvas);
}

function draw() {
  // Clear canvas
  ctx.clearRect(0, 0, canvas.width, canvas.height);

  // Pipe generator
  if (frame_count % 100 === 0) {
    if (frame_count % 200 === 0) {
      pipes.push(new Pipe(100));
    } else {
      pipes.push(new Pipe(120));
    }
  }

  // Draw pipes
  for (i = 0; i < pipes.length; i++) {
    pipes[i].update();
  }

}

function loop() {
// do not mix setTimeout and rAF, it's like having a Ferrari parked in a truck...
//  setTimeout(function() {
    draw();
    frame_count++;
    requestAnimationFrame(loop);
//  }, 0);
}

setup();
loop();

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

警告:タイルのメモリ制限を超えました。一部のコンテンツが描画されず、ChromeDriverSeleniumを使用して長いページをレンダリングしているときにスクリーンショットをキャプチャできない場合があります

分類Dev

このキャンバスアニメーションが時々それ自体をスクランブルするのはなぜですか?

分類Dev

キャンバス上の長方形をアニメーション化する

分類Dev

アップロードボタンのクリック時にカメラ、ギャラリーを選択してオプションを選択し、キャンセルしてダイアログまたはアクションセットを表示するにはどうすればよいですか?

分類Dev

キャンバスが長方形のクリアを停止するのはなぜですか?

分類Dev

速度を上げる必要があるのに、キャンバスアニメーションの速度が遅くなるのはなぜですか?

分類Dev

新しいサブスクリプションが作成されたときにスキャンアキュムレータ値がリセットされるのに、shareReplay(1)を使用している場合はリセットされないのはなぜですか?

分類Dev

データメンバーをラムダキャプチャリストに含めることができないのはなぜですか

分類Dev

Start-MpScanを使用してPowershellで単一のファイルをスキャンすると、コンテキストメニューオプションを使用するよりも時間がかかるのはなぜですか?

分類Dev

オペレーティング システムの新しいバージョンが多くのメモリを必要とするのはなぜですか?

分類Dev

ブロードキャスト レシーバーがサービス アプリケーション android で機能しないのはなぜですか?

分類Dev

HTML5キャンバス-長方形の色が常に黒を返すのはなぜですか?

分類Dev

データベースがすでにキャッシュを提供しているのに、なぜアプリケーションレベルのキャッシュを使用するのですか?

分類Dev

RCPアプリケーションのユニットテストをフラグメントとして行う必要があるのはなぜですか

分類Dev

キャンバスアニメーション:更新ループとレンダリングループを分離する利点は?

分類Dev

このhtml5キャンバスアニメーションがそれほど集中的であるのはなぜですか?

分類Dev

HTMLをDOM呼び出しに変換するときに、キャンバスがそれ自体をスケーリングするのはなぜですか?

分類Dev

単純なスケーリングアニメーションを実行する方法と、これが機能しないのはなぜですか?

分類Dev

ナビゲーションとヘッダーdivの間にギャップ/スペースがあるのはなぜですか?

分類Dev

キャンバスが特定の部分だけでなく、キャンバス全体を再レンダリングするのはなぜですか?

分類Dev

オペレーティングシステムにシャットダウンするオプションがあるのはなぜですか?

分類Dev

EaselJS:キャッシュによってレンダリングが遅くなるのはなぜですか?

分類Dev

キャラクターアニメーションが範囲外になるのはなぜですか

分類Dev

CSSテキストスケーリングアニメーションが「湾曲した」モーションを作成するのはなぜですか?

分類Dev

CSSテキストスケーリングアニメーションが「湾曲した」モーションを作成するのはなぜですか?

分類Dev

常にアニメーション化されているUIActivityIndicatorがメインスレッドをブロックしないのはなぜですか?

分類Dev

どのキャンバスオブジェクトが最初にランダムな速度のアニメーションを完了したかを判断する方法

分類Dev

2回目にメニューを新しいアイテムにドラッグしようとすると、メニューがジャンプするのはなぜですか?

分類Dev

アニメーションがキーフレーム間で一時停止するのを防ぎ、さらに、マウスをホバーしていないときでもアニメーションを実行する方法

Related 関連記事

  1. 1

    警告:タイルのメモリ制限を超えました。一部のコンテンツが描画されず、ChromeDriverSeleniumを使用して長いページをレンダリングしているときにスクリーンショットをキャプチャできない場合があります

  2. 2

    このキャンバスアニメーションが時々それ自体をスクランブルするのはなぜですか?

  3. 3

    キャンバス上の長方形をアニメーション化する

  4. 4

    アップロードボタンのクリック時にカメラ、ギャラリーを選択してオプションを選択し、キャンセルしてダイアログまたはアクションセットを表示するにはどうすればよいですか?

  5. 5

    キャンバスが長方形のクリアを停止するのはなぜですか?

  6. 6

    速度を上げる必要があるのに、キャンバスアニメーションの速度が遅くなるのはなぜですか?

  7. 7

    新しいサブスクリプションが作成されたときにスキャンアキュムレータ値がリセットされるのに、shareReplay(1)を使用している場合はリセットされないのはなぜですか?

  8. 8

    データメンバーをラムダキャプチャリストに含めることができないのはなぜですか

  9. 9

    Start-MpScanを使用してPowershellで単一のファイルをスキャンすると、コンテキストメニューオプションを使用するよりも時間がかかるのはなぜですか?

  10. 10

    オペレーティング システムの新しいバージョンが多くのメモリを必要とするのはなぜですか?

  11. 11

    ブロードキャスト レシーバーがサービス アプリケーション android で機能しないのはなぜですか?

  12. 12

    HTML5キャンバス-長方形の色が常に黒を返すのはなぜですか?

  13. 13

    データベースがすでにキャッシュを提供しているのに、なぜアプリケーションレベルのキャッシュを使用するのですか?

  14. 14

    RCPアプリケーションのユニットテストをフラグメントとして行う必要があるのはなぜですか

  15. 15

    キャンバスアニメーション:更新ループとレンダリングループを分離する利点は?

  16. 16

    このhtml5キャンバスアニメーションがそれほど集中的であるのはなぜですか?

  17. 17

    HTMLをDOM呼び出しに変換するときに、キャンバスがそれ自体をスケーリングするのはなぜですか?

  18. 18

    単純なスケーリングアニメーションを実行する方法と、これが機能しないのはなぜですか?

  19. 19

    ナビゲーションとヘッダーdivの間にギャップ/スペースがあるのはなぜですか?

  20. 20

    キャンバスが特定の部分だけでなく、キャンバス全体を再レンダリングするのはなぜですか?

  21. 21

    オペレーティングシステムにシャットダウンするオプションがあるのはなぜですか?

  22. 22

    EaselJS:キャッシュによってレンダリングが遅くなるのはなぜですか?

  23. 23

    キャラクターアニメーションが範囲外になるのはなぜですか

  24. 24

    CSSテキストスケーリングアニメーションが「湾曲した」モーションを作成するのはなぜですか?

  25. 25

    CSSテキストスケーリングアニメーションが「湾曲した」モーションを作成するのはなぜですか?

  26. 26

    常にアニメーション化されているUIActivityIndicatorがメインスレッドをブロックしないのはなぜですか?

  27. 27

    どのキャンバスオブジェクトが最初にランダムな速度のアニメーションを完了したかを判断する方法

  28. 28

    2回目にメニューを新しいアイテムにドラッグしようとすると、メニューがジャンプするのはなぜですか?

  29. 29

    アニメーションがキーフレーム間で一時停止するのを防ぎ、さらに、マウスをホバーしていないときでもアニメーションを実行する方法

ホットタグ

アーカイブ