このサイトからの通知を受け取りますか?

ニュース




2024/01/02

第4回 – Phaserゲームでキャラクターと車の衝突検出

Phaserを使用したゲーム開発では、キャラクターとオブジェクトの衝突検出は非常に重要です。この記事では、Phaserを使ってプレイヤーキャラクターが車と衝突した際にどのように処理するかを解説します。

キャラクターと車の作成

プレイヤーキャラクターと車を作成します。プレイヤーキャラクターは物理エンジンを有効にし、アニメーションも追加します。

// プレイヤーキャラクターの作成
player = this.physics.add.sprite(frame_width / 2, frame_height / 2, 'player');
this.physics.world.enable(player);

// アニメーションの追加
this.anims.create({
    key: 'right',
    frames: this.anims.generateFrameNumbers('player', { start: 12, end: 14 }),
    frameRate: 10,
    repeat: -1
});

// 他の設定...

// 車の作成
cars = this.physics.add.sprite(car_x, car_y, 'car');
this.physics.world.enable(cars);
// 他の設定...

衝突処理の実装

プレイヤーキャラクターと車の衝突処理は以下のように実装します。衝突が検出された場合、プレイヤーを赤く変色させる例です。

// 衝突処理
function collisionHandler(player, car) {
    console.log('Player collided with car!');
    // プレイヤーを赤く変色
    player.setTint(0xff0000);
}

// 衝突検出の設定
this.physics.add.collider(player, cars, collisionHandler, null, this);

ゲームの更新処理

最後に、ゲームの更新処理を実装します。これにはキャラクターの移動や、画面外に出た車を再度配置する処理が含まれます。

function update(time, delta) {
    // キャラクターの移動処理...

    // 画面外に出たら再度右から出現
    if (!cars_stop) {
        cars.setVelocityX(-100);
        if ((cars.x - cars.width) <= 0) {
            cars.setX(car_x);
        }
    }
}

以上で、Phaserゲームでのキャラクターと車の衝突検出が実装されました。これにより、ゲーム内での衝突に対する処理が正しく行われ、臨場感あふれるゲームプレイが実現できます。

Phaser Game

全体のコード

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Phaser Game</title>
    <!-- Phaser ライブラリの読み込み -->
    <script src="//cdn.jsdelivr.net/npm/phaser@3.70.0/dist/phaser.js"></script>
</head>

<body>
    <!-- ゲームコンテナのスタイル -->
    <style>
        #game-container {
            margin: auto 0;
            padding: 0;
        }

        #game-container {
            width: 100%;
            height: 100%;
            display: flex;
            align-items: center;
            justify-content: center;
        }

        #game-container canvas {
            border-radius: 5px;
        }
    </style>

    <!-- ゲームコンテナ -->
    <div id="game-container"></div>

    <!-- ゲームスクリプト -->
    <script>
        // ウィンドウスケールの設定
        let window_scale = 0.9;

        if (window.innerWidth > 800)
            window_scale = 0.5;

        // フレームの初期値
        let frame_width = window.innerWidth * window_scale;
        let frame_height = 400;

        let car_x = frame_width;
        let car_y = frame_height - 30;

        // Phaser ゲームの設定
        const config = {
            type: Phaser.AUTO,
            width: frame_width,
            height: frame_height,
            backgroundColor: "#222222",
            parent: "game-container",
            physics: {
                default: 'arcade',
                arcade: {
                    gravity: { y: 600 }, // 重力の設定
                    debug: false // デバッグ表示の有無
                }
            },
            scene: {
                // ゲームの事前読み込み処理
                preload: preload,
                // ゲームの初期化処理
                create: create,
                // ゲームのフレームごとの更新処理
                update: update
            }
        };

        // Phaser ゲームの作成
        const game = new Phaser.Game(config);

        // プレイヤーのスプライト
        let player;

        // カーソルのキー
        let cursors;

        // 車のスプライト
        let cars;

        // 車の停止
        let cars_stop = false;

        // ゲームの事前読み込み処理
        function preload() {
            // 画像などのリソースの基本URLを設定
            this.load.setBaseURL("https://honda-workshop.com/works/phaser/");

            // 背景画像の読み込み
            this.load.image("backgroud", "/assets/city.png");
            // プレイヤーのスプライトシートの読み込み
            this.load.spritesheet('player', '/assets/player.png', { frameWidth: 48, frameHeight: 48 });

            // 車の画像の読み込み
            this.load.image("car", "./assets/car.png");
        }

        // ゲームの初期化処理
        function create() {
            // ゲームの幅と高さを取得
            const { width, height } = this.sys.game.config;

            // 背景スプライトの作成
            const bg = this.add.tileSprite(0, 0, width, height, "backgroud");
            bg.setOrigin(0, 0);

            // プレイヤーのスプライトを作成
            player = this.physics.add.sprite(frame_width / 2, frame_height / 2, 'player');

            // プレイヤースプライトに物理エンジンを有効にする
            this.physics.world.enable(player);

            // プレイヤースプライトにアニメーションを追加
            this.anims.create({
                key: 'right',
                frames: this.anims.generateFrameNumbers('player', { start: 12, end: 14 }),
                frameRate: 10,
                repeat: -1
            });

            // プレイヤースプライトにアニメーションを追加
            this.anims.create({
                key: 'left',
                frames: this.anims.generateFrameNumbers('player', { start: 6, end: 8 }),
                frameRate: 10,
                repeat: -1
            });

            // プレイヤースプライトに物理エンジンの設定
            player.body.setBounce(0.1);
            player.body.setCollideWorldBounds(true);

            // カーソルのキーを有効にする
            cursors = this.input.keyboard.createCursorKeys();

            // アニメーションの再生
            player.anims.play('right', true);

            // 車のスプライトを作成
            cars = this.physics.add.sprite(car_x, car_y, 'car');
            cars.setBounce(0.0);
            cars.setCollideWorldBounds(true);

            // 車のスプライトに物理エンジンの設定
            cars.body.setSize(32, 28, true); // 車の余白を考慮した設定
            // 車に物理エンジンを有効にする
            this.physics.world.enable(cars);

            // プレイヤーと車の衝突処理
            this.physics.add.collider(player, cars, collisionHandler, null, this);
        }

        // 衝突処理
        function collisionHandler(player, car) {
            console.log('Player collided with car!');
            // プレイヤーを赤くする。
            player.setTint(0xff0000);
        }

        // ゲームのフレームごとの更新処理
        function update(time, delta) {
            // カーソルキーの入力に応じてプレイヤーを移動
            if (cursors.left.isDown) {
                player.setVelocityX(-160);
                player.anims.play('left', true);
            } else if (cursors.right.isDown) {
                player.setVelocityX(160);
                player.anims.play('right', true);
            } else {
                player.setVelocityX(0);
            }

            // UPキーでplayerが地面に接しているとき
            if (cursors.up.isDown && player.body.onFloor()) {
                // プレイヤーが地面に触れているときだけジャンプする
                player.setVelocityY(-400);
                // プレイヤーを白くする。
                player.setTint(0xffffff);
            }

            cars.setVelocityX(-100);
            // 画面外に出たら再度右から出現
            if ( (cars.x - cars.width) <= 0) {
                cars.setX(car_x);
            }
        }

        // ウィンドウのリサイズ時の処理
        window.addEventListener('resize', function () {
            // ゲームの幅と高さをリサイズ
            frame_width = window.innerWidth * window_scale;
            frame_height = 200;

            console.log(frame_width);
            console.log(frame_height);

            game.scale.resize(frame_width, frame_height);

            // プレイヤースプライトの位置をリサイズ後に更新
            player.setPosition(frame_width / 2, frame_height / 2);
        });

    </script>

</body>

</html>

プロフィール

運営者 HONDA

福島県在住、

WBEシステム開発の勉強を兼ねて本ブログを開設しました。

ConoHa WINGのレンタルサーバでWordPress環境で、自分の興味あるプログラムを「作っては見直し」「作っては見直し」しています。

最近は、SNSの自動化に力を入れてます。X、Instgram、LINEなどの自動化のご相談を承っております。どうぞよろしくお願いいたします。

趣味:家族旅行

メルマガ登録

カテゴリ

DoChat
not iphone
Support voice
Support speech
-90
0
0

20時16分

9時10分

SNS連携、WEBシステム

お任せください。

時計表示

都道府県

センサー許可

センサースクロール

音声発話

音声種別

プッシュ通知

スクリーンセーバー起動時間

デバッグ

はじめに

HONDA WORK SHOPでは、ご利用のユーザ様個人情報の取り扱いに細心の注意を払っております。

また当サイトではアフィリエイトプログラムを利用しております。

第三者配信事業者(Amazonアソシエイト、楽天アフィリエイト、A8.net)がCookie を使用して、サイト利用者が当サイトや他のサイトに過去にアクセスした際の情報に基づいて広告を配信します。

Google が広告 Cookie を使用することにより、サイト利用者が当サイトや他のサイトにアクセスした際の情報に基づいて、Google やそのパートナーは適切な広告をサイト利用者に対して表示します。

広告設定でパーソナライズ広告を無効にすることができます。

Cookieの利用について

Cookieは、当サイトや他サイトへのアクセスに関する情報が含まれており、多くのサイトで利用者に有益な機能を提供する目的で使用されています。

Cookieには、サイト利用者の個人情報(氏名、住所、メールアドレス、電話番号)は一切含まれません。

アクセス解析ツールについて

当サイトでは、アクセス解析ツール「Google Analytics」を利用しています。

「Google Analytics」はトラフィックデータの収集のためにCookieを使用しています。

このトラフィックデータは匿名で収集されており、個人を特定するものではありません。

この機能はCookieを無効にすることで収集を拒否することができますので、ご利用のブラウザ設定をご確認のうえ、拒否設定を行ってください。

本ポリシーの変更

当サイトは、個人情報に関して適用される日本の法令を遵守するとともに、本ポリシーの内容を適宜見直しその改善に努めます。

修正された最新のプライバシーポリシーは常に本ページにて開示されます。

2025年 4月 巳(み)

30311

赤口

2

先勝

3

友引

4

先負

5

仏滅

6

大安

7

赤口

8

先勝

9

友引

10

先負

11

仏滅

12

大安

13

赤口

14

先勝

15

友引

16

先負

17

仏滅

18

大安

19

赤口

20

先勝

21

友引

22

先負

23

仏滅

24

大安

25

赤口

26

先勝

27

友引

28

仏滅

29

大安
昭和の日

30

赤口

123

本日の日の出・日の入り(東京)

20時16分

9時10分

六曜

先勝(せんしょう)

午前中は吉、午後は凶とされる。

意味:午前中に用事を済ませると吉。午後からは控えた方が良い。

友引(ともびき)

友を惹きつけるという意味。

意味:万事において良い日とされるが、不幸が起きた場合、それが自分だけでなく友にも及ぶとされるため、葬式など凶事を忌む。

先負(せんぷ)

午前は吉、午後は凶とされる。

意味:午前中に用事を済ませると吉。午後からは控えた方が良い。

仏滅(ぶつめつ)

万事が大凶とされる。

意味:何事も控えるべき日。特に新しいことを始めるのは避けるべき。

大安(たいあん)

万事が大吉とされる。

意味:何事を始めるにも良い日。

赤口(しゃっこう)

朝夕は吉、正午は凶とされる。

意味:口論や災いが起こりやすい日。特に正午は注意が必要。

西暦和暦干支年齢対応表

和暦西暦満年齢干支
令和7年2025年0巳(み)
令和6年2024年1辰(たつ)
令和5年2023年2卯(う)
令和4年2022年3寅(とら)
令和3年2021年4丑(うし)
令和2年2020年5子(ね)
平成31年 / 令和元年2019年6亥(い)
平成30年2018年7戌(いぬ)
平成29年2017年8酉(とり)
平成28年2016年9申(さる)
平成27年2015年10未(ひつじ)
平成26年2014年11午(うま)
平成25年2013年12巳(み)
平成24年2012年13辰(たつ)
平成23年2011年14卯(う)
平成22年2010年15寅(とら)
平成21年2009年16丑(うし)
平成20年2008年17子(ね)
平成19年2007年18亥(い)
平成18年2006年19戌(いぬ)
平成17年2005年20酉(とり)
平成16年2004年21申(さる)
平成15年2003年22未(ひつじ)
平成14年2002年23午(うま)
平成13年2001年24巳(み)
平成12年2000年25辰(たつ)
平成11年1999年26卯(う)
平成10年1998年27寅(とら)
平成9年1997年28丑(うし)
平成8年1996年29子(ね)
平成7年1995年30亥(い)
平成6年1994年31戌(いぬ)
平成5年1993年32酉(とり)
平成4年1992年33申(さる)
平成3年1991年34未(ひつじ)
平成2年1990年35午(うま)
昭和64年 / 平成元年1989年36巳(み)
昭和63年1988年37辰(たつ)
昭和62年1987年38卯(う)
昭和61年1986年39寅(とら)
昭和60年1985年40丑(うし)
昭和59年1984年41子(ね)
昭和58年1983年42亥(い)
昭和57年1982年43戌(いぬ)
昭和56年1981年44酉(とり)
昭和55年1980年45申(さる)
昭和54年1979年46未(ひつじ)
昭和53年1978年47午(うま)
昭和52年1977年48巳(み)
昭和51年1976年49辰(たつ)
昭和50年1975年50卯(う)
昭和49年1974年51寅(とら)
昭和48年1973年52丑(うし)
昭和47年1972年53子(ね)
昭和46年1971年54亥(い)
昭和45年1970年55戌(いぬ)
昭和44年1969年56酉(とり)
昭和43年1968年57申(さる)
昭和42年1967年58未(ひつじ)
昭和41年1966年59午(うま)
昭和40年1965年60巳(み)
昭和39年1964年61辰(たつ)
昭和38年1963年62卯(う)
昭和37年1962年63寅(とら)
昭和36年1961年64丑(うし)
昭和35年1960年65子(ね)
昭和34年1959年66亥(い)
昭和33年1958年67戌(いぬ)
昭和32年1957年68酉(とり)
昭和31年1956年69申(さる)
昭和30年1955年70未(ひつじ)
昭和29年1954年71午(うま)
昭和28年1953年72巳(み)
昭和27年1952年73辰(たつ)
昭和26年1951年74卯(う)
昭和25年1950年75寅(とら)
昭和24年1949年76丑(うし)
昭和23年1948年77子(ね)
昭和22年1947年78亥(い)
昭和21年1946年79戌(いぬ)
昭和20年1945年80酉(とり)
昭和19年1944年81申(さる)
昭和18年1943年82未(ひつじ)
昭和17年1942年83午(うま)
昭和16年1941年84巳(み)
昭和15年1940年85辰(たつ)
昭和14年1939年86卯(う)
昭和13年1938年87寅(とら)
昭和12年1937年88丑(うし)
昭和11年1936年89子(ね)
昭和10年1935年90亥(い)
昭和9年1934年91戌(いぬ)
昭和8年1933年92酉(とり)
昭和7年1932年93申(さる)
昭和6年1931年94未(ひつじ)
昭和5年1930年95午(うま)
昭和4年1929年96巳(み)
昭和3年1928年97辰(たつ)
昭和2年1927年98卯(う)
大正15年 / 昭和元年1926年99寅(とら)
大正14年1925年100丑(うし)
大正13年1924年101子(ね)
大正12年1923年102亥(い)
大正11年1922年103戌(いぬ)
大正10年1921年104酉(とり)
大正9年1920年105申(さる)
大正8年1919年106未(ひつじ)
大正7年1918年107午(うま)
大正6年1917年108巳(み)
大正5年1916年109辰(たつ)
大正4年1915年110卯(う)
大正3年1914年111寅(とら)
大正2年1913年112丑(うし)
明治45年 / 大正元年1912年113子(ね)
明治44年1911年114亥(い)
明治43年1910年115戌(いぬ)
明治42年1909年116酉(とり)
明治41年1908年117申(さる)
明治40年1907年118未(ひつじ)
明治39年1906年119午(うま)
明治38年1905年120巳(み)
明治37年1904年121辰(たつ)
明治36年1903年122卯(う)
明治35年1902年123寅(とら)
明治34年1901年124丑(うし)
明治33年1900年125子(ね)
明治32年1899年126亥(い)
明治31年1898年127戌(いぬ)
明治30年1897年128酉(とり)
明治29年1896年129申(さる)
明治28年1895年130未(ひつじ)
明治27年1894年131午(うま)
明治26年1893年132巳(み)
明治25年1892年133辰(たつ)
明治24年1891年134卯(う)
明治23年1890年135寅(とら)
明治22年1889年136丑(うし)
明治21年1888年137子(ね)
明治20年1887年138亥(い)
明治19年1886年139戌(いぬ)
明治18年1885年140酉(とり)
明治17年1884年141申(さる)
明治16年1883年142未(ひつじ)
明治15年1882年143午(うま)
明治14年1881年144巳(み)
明治13年1880年145辰(たつ)
明治12年1879年146卯(う)
明治11年1878年147寅(とら)
明治10年1877年148丑(うし)
明治9年1876年149子(ね)
明治8年1875年150亥(い)
明治7年1874年151戌(いぬ)
明治6年1873年152酉(とり)
明治5年1872年153申(さる)
明治4年1871年154未(ひつじ)
明治3年1870年155午(うま)
明治2年1869年156巳(み)
明治元年1868年157辰(たつ)
card
number
spacewar