「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > JavaScript IV を使用したテトリスの作成: キャンバス

JavaScript IV を使用したテトリスの作成: キャンバス

2024 年 8 月 1 日に公開
ブラウズ:886

導入

シリーズの今回は、盤面と現在進行中の駒を画面上に表示する方法を見ていきます。これを行うには、ブラウザで描画する必要があります。そのためのオプションは Canvas HTML 要素です。

class Canvas {
    static SEPARATION = 2;
    #_painting = false;
    #_element = null;
    #_board = null;
    #_piece = null;

    constructor(element, board)
    {        
        element.width = 5   ( board.cols * Board.PIXEL_SIZE );
        element.height = 5   ( board.rows * Board.PIXEL_SIZE );

        this._board = board;
        this._element = element;
    }

    // más cosas...
}

このクラス Canvas は、コンストラクターのパラメーターとして渡される、同じ名前の HTML 要素を表します。ボードを描画するので、描画するポイントにアクセスするために、ボードもパラメーターとして渡されます。

最初に行うことは、ボード自体がプロパティ cols および rows。また、ボードは、PIXEL_SIZE. を通じて、ボードの各ピースまたは各セルのポイントを構成する ピクセル の数も示します。 ゲームの描き直し

寄り道はやめよう。その瞬間に降っている盤面と駒を塗らなければなりませんよね?さて、それでは、始めましょう。


クラス キャンバス { // より多くの事... ペイント() { if (this._painting) { 戻る; } const ctx = this.element.getContext( "2d" ); const SEP = Canvas.SEPARATION; this._painting = true; this.clear(); this.paintBoard( ctx, SEP ); this.paintPiece( ctx, SEP ); this._painting = false; } クリア() { const ctx = this.element.getContext( "2d" ); ctx.clearRect( 0, 0, this.element.width, this.element.height ); } }

class Canvas {
    // más cosas...

    paint()
    {
        if ( this._painting ) {
            return;
        }

        const ctx = this.element.getContext( "2d" );
        const SEP = Canvas.SEPARATION;

        this._painting = true;
        this.clear();

        this.paintBoard( ctx, SEP );
        this.paintPiece( ctx, SEP );

        this._painting = false;
    }

    clear()
    {
        const ctx = this.element.getContext( "2d" );

        ctx.clearRect( 0, 0, this.element.width, this.element.height );
    }
}

いくつかのガード (

_painting

) があり、特定の時点で複数のスレッドが同時に (異なるポイントで) メソッドを実行するのを防ぎます。これは、メソッドが再描画間の時間よりも長く実行された場合に発生する可能性があります。まぁ、その場合は他にも色々問題が起きるだろうけど… 次のステップでは、前回の再描画で画面上にあったもの (

frame

) を削除します。これは clear() メソッドで行います。このメソッドは clearRect() を使用してキャンバス上の画像を削除します。 そしてボードをペイントし、その瞬間に落ちてくるピースをペイントします。まあ、それはそれでしょう。エール、配達完了しました。

私はノーと言った。ボードと駒がどのようにペイントされるかを見てみましょう。まずは基板の塗装です。 SEP は、駒とボードの正方形の間に残す分離です。このボックスは、

Draw Frame

というタイトルのコード段落で最初に描画するものです。 これは ストロークRect() で描画できる単純な長方形で、左上の頂点の位置、その幅と高さの 4 つのパラメーターを受け取ります。 ボードの塗装

クラス キャンバス { // より多くの事... ペイントボード(ctx、SEP) { //フレームを描画する ctx.ストローク幅 = 1; ctx.ストロークスタイル = this.board.color; ctx.ストロークRect( 1, 1, this.element.width - 1、 this.element.height -1 ); //ボードを描く for(let numRow = 0; numRow
class Canvas {
    // más cosas...

    paintBoard(ctx, SEP)
    {       
        // Draw frame
        ctx.strokeWidth = 1;
        ctx.strokeStyle = this.board.color;
        ctx.strokeRect( 1, 1,
                  this.element.width - 1,
                  this.element.height  -1 );

        // Draw board
        for(let numRow = 0; numRow 

したがって、最初のループは

Board

.rows まで行をループします。次に、メソッド getRow() を使用して完全な行を取得し、Board.cols. まで内部ループでそれを走査します。 つまり、行/列

f

/cBoard.getCell(f, c) のセルがあるとします。 JavaScript には、0 を除く任意の値を持つ整数を受け入れる Boolean のコンストラクターがあることを考慮して、true を意味する、辺が PIXEL_SIZE の正方形をペイントします。したがって、行 f をどこにペイントするかを知るには、PIXEL_SIZE を乗算し、ボード ボックスと最初のセルの間の間隔を追加する必要があります。これらは正方形であるため、同じ方法で列 c を見つけます: SEP (c * PIXEL_SIZE). 作品をペイントする

ピースでも同様のことを行います。単なる行列であるシェイプ (

shape

) を使用すると、再び 2 つのループができます。外側のループは行用で、内側のループは列用です。
クラス キャンバス { // より多くの事... ペイントピース(ctx、SEP) { const SHAPE = this.piece.shape; for(let numRow = 0; numRow

class Canvas {
    // más cosas...

    paintPiece(ctx, SEP)
    {
        const SHAPE = this.piece.shape;

        for(let numRow = 0; numRow Piece

.row/Piece. ] キャベツ)。これに PIXEL_SIZE を掛けて、ボックスによる区切りを追加する必要があります。

El juego Insertrix en su estado actual今のところ、私たちが見ることができるものはかなり...当たり障りのないものです。ボードは空で、ゲームループがないので、駒も落ちません。このトピックについては次回の記事で説明し、上の画像のようなものを確認できるようにします。

リリースステートメント この記事は次の場所に転載されています: https://dev.to/baltasarq/creando-un-tetris-con-javascript-iv-canvas-1h7k?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>
  • ウェブをさらに接続する
    ウェブをさらに接続する
    Web のつながりをさらに高める - Infometka は「見えない Web サイト」問題をどのように解決しているか Web 開発者および ????️??????️ の作成者として、私は常に現実世界の問題を解決することに情熱を持ってきました。今日は、私が開発したソリューションを共有したいと思います...
    プログラミング 2024 年 11 月 6 日に公開
  • React を使用した Loop Studio の構築
    React を使用した Loop Studio の構築
    導入 Loop Studio は、さまざまな仮想現実 (VR) プロジェクトを紹介するために設計された没入型 Web サイトです。 React を使用すると、さまざまなコンポーネントを効率的に管理およびレンダリングして、一貫性のあるインタラクティブなユーザー エクスペリエンスを構築...
    プログラミング 2024 年 11 月 6 日に公開
  • PHP を使用して CURL で多次元配列を送信するときに発生する「配列から文字列への変換」エラーを解決する方法
    PHP を使用して CURL で多次元配列を送信するときに発生する「配列から文字列への変換」エラーを解決する方法
    CURL および PHP を使用した多次元配列の送信CURL を使用して多次元配列を含むフォーム データを送信するときに、「配列から文字列への変換」エラーが発生することがよくあります。この問題は、配列を含む配列で CURLOPT_POSTFIELDS を設定しようとすると発生します。ファイル転送を容...
    プログラミング 2024 年 11 月 6 日に公開
  • Selenium で「span:contains(\'String\')」\ による InvalidSelectorException を解決する方法
    Selenium で「span:contains(\'String\')」\ による InvalidSelectorException を解決する方法
    「span:contains('String')」による Selenium の無効な SelectorExceptionFirefox で Python の Selenium を使用するときに、 CSS セレクター「span:contains('コントロール パネル'...
    プログラミング 2024 年 11 月 6 日に公開
  • InnerHTML の落とし穴を回避して HTML をコンテナ要素に追加するにはどうすればよいですか?
    InnerHTML の落とし穴を回避して HTML をコンテナ要素に追加するにはどうすればよいですか?
    innerHTML を使用しないコンテナ要素への HTML の追加再訪当面の問題は、制限を回避しながら HTML をコンテナ要素に追加する方法です。 innerHTML プロパティを使用する場合の落とし穴。 OP が正しく指摘しているように、innerHTML は既存のコンテンツを置き換える動作によ...
    プログラミング 2024 年 11 月 6 日に公開
  • 継続的テスト: DevOps パイプラインの品質を確保する
    継続的テスト: DevOps パイプラインの品質を確保する
    継続的なテストは、最新のソフトウェア開発、特に DevOps フレームワーク内での重要な実践です。これには、コードベースに加えられたすべての変更が完全に検証されていることを確認するために、ソフトウェア配信パイプライン全体でのテストの自動実行が含まれます。開発プロセスのすべての段階にテストを統合する...
    プログラミング 2024 年 11 月 6 日に公開
  • 背景色の変更動画
    背景色の変更動画
    インスタグラムをフォローしてください このビデオチュートリアルでは、HTML、CSS、JavaScript を使用して素晴らしい Instagram カードを作成する方法を説明します。このカードには、色が変化する鮮やかな境界線、円形のプロフィール写真、およびオンラインでの存在感に魅力的なタッチを加え...
    プログラミング 2024 年 11 月 6 日に公開
  • PHPを使用してブラウザのキャッシュをクリアするにはどうすればよいですか?
    PHPを使用してブラウザのキャッシュをクリアするにはどうすればよいですか?
    PHP を使用したブラウザ キャッシュのクリアブラウザ キャッシュにより、頻繁にアクセスされるファイルがローカルに保存され、Web サイトの読み込み時間が短縮されます。ただし、キャッシュされたファイルが古い場合は、テストや開発に支障をきたす可能性もあります。この記事では、PHP を使用してブラウザの...
    プログラミング 2024 年 11 月 6 日に公開
  • Go を使用した AWS Lambda、初期定型文
    Go を使用した AWS Lambda、初期定型文
    Unsplash の Lukáš Vaňátko による写真 導入 Go はそのシンプルさから、常に私のお気に入りの言語の 1 つです。最近、Go で書かれたラムダ関数を使用した単純な定型的なサーバーレス プロジェクトを作成するには何が必要かを理解することにしました。ツールと開発者の...
    プログラミング 2024 年 11 月 6 日に公開
  • Laravelで空の値が一番下にあり空でない値がある行を降順で並べ替える
    Laravelで空の値が一番下にあり空でない値がある行を降順で並べ替える
    データベースを操作する場合、一部のフィールドが空または NULL になる状況がよく発生します。よく発生する課題の 1 つは、空のフィールドを含む行が結果セットの最後に表示され、空ではない値を含む行が意味のある方法 (降順など) で並べられるようにレコードを並べ替える方法です。この投稿では、実用的な例...
    プログラミング 2024 年 11 月 6 日に公開
  • オリーブオイルの利点
    オリーブオイルの利点
    オリーブオイルの利点 地中海食の基礎としてよく称賛されるオリーブオイルは、さまざまな料理に風味を加えるだけでなく、健康上の利点も満載です。オリーブの木の果実から抽出されるオリーブオイルは何世紀にもわたって使用されており、現代の研究によりその多くの利点が明らかになり続けています。オリ...
    プログラミング 2024 年 11 月 6 日に公開
  • JSON Diff: 開発者向けの完全ガイド
    JSON Diff: 開発者向けの完全ガイド
    JSON (JavaScript Object Notation) は、システム間で情報を交換するために広く使用されているデータ形式です。開発者が API、データベース、構成を操作する場合、JSON データの一貫性と正確性を確保することが不可欠です。ここで JSON diff が役に立ちます。 J...
    プログラミング 2024 年 11 月 6 日に公開
  • 知っておくべき avascript のヒント
    知っておくべき avascript のヒント
    ジョアブ・チュア著 1. コンソール.ログ コンソール ログに色を追加 これだけはやめてください! ❌ 代わりにこれを試してください。 ✅ しかし、オブジェクトの配列がある場合は、これを試してみるとさらに良いでしょう ? コード内で特定の操作がどのくらい速く実行されるかを測定したい場...
    プログラミング 2024 年 11 月 6 日に公開
  • Python を使用して Google Scholar をスクレイピングする技術を習得する
    Python を使用して Google Scholar をスクレイピングする技術を習得する
    学術研究やデータ分析に取り組んでいる場合、Google Scholar のデータが必要になる場合があります。残念ながら、公式の Google Scholar API Python サポートがないため、このデータの抽出は少し難しくなります。ただし、適切なツールと知識があれば、Google Schola...
    プログラミング 2024 年 11 月 6 日に公開
  • Go、クリーン アーキテクチャ、PostgreSQL による堅牢な電子商取引プラットフォームの構築
    Go、クリーン アーキテクチャ、PostgreSQL による堅牢な電子商取引プラットフォームの構築
    概要 私たちの目標は、商品管理から注文処理まですべてを処理できる総合的な電子商取引ソリューションを開発することです。このプラットフォームは、オンライン ビジネスの強固な基盤として機能し、需要の増大に合わせて拡張し、市場のニーズの変化に適応することができます。 当社の e コマース ...
    プログラミング 2024 年 11 月 6 日に公開

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3