0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【11日目】p5.js動き回る図形をつぶすゲームを作成[Monaca]

Posted at

今回はp5.jsを使用して簡単なゲームを作ります。開発環境にはMonacaを使用します。

簡単なゲームの概要としては、画面をランダムに動く〇(丸)をマウス(またはタッチパネル)でクリックしてポイントを稼いでいくゲームです。加点の〇と減点の〇もそれぞれ作ります。

完成したプログラムはページの最後に張り付けておきます。

まずはプログラムの説明から入ります。

図形の作成

図形は今回ellipseを使用し、その丸の複製でクラスを使用します。今回は5つに増やしていきます。また、図形はポイントアップ用とポイントダウン用の2種類を作成します。

let c1 = []; //配列に
let c2 = [];

class Circle {
    constructor(x, y, mx, my, s) {
        this.x1 = x;
        this.y1 = y;
        this.mx1 = mx;
        this.my1 = my;
        this.x2 = x;
        this.y2 = y;
        this.mx2 = mx;
        this.my2 = my;
        this.s = s;
        this.dis1;
        this.dis2;
    }
    moveUp() {
        fill(0, 255, 255);
        ellipse(this.x1, this.y1, this.s, this.s);
        this.x1 += this.mx1;
        this.y1 += this.my1;
        if (this.x1 <= -50) {
            this.x1 = 420;
            this.y1 = random(-50, 830);
            this.mx1 = random(-4, 4);
            this.my1 = random(-4, 4);
        }
        if (this.x1 >= 420) {
            this.x1 = -50;
            this.y1 = random(-50, 830);
            this.mx1 = random(-4, 4);
            this.my1 = random(-4, 4);
        }

        if (this.y1 < -50) {
            this.x1 = random(-50, 420);
            this.y1 = 830;
            this.mx1 = random(-4, 4);
            this.my1 = random(-4, 4);
        }
        if (this.y1 > 830) {
            this.x1 = random(-50, 420);
            this.y1 = -50;
            this.mx1 = random(-4, 4);
            this.my1 = random(-4, 4);
        }

    }

    moveDown() {
        fill(255, 255, 0);
        ellipse(this.x2, this.y2, this.s, this.s);
        this.x2 += this.mx2;
        this.y2 += this.my2;
        if (this.x2 < -50) {
            this.x2 = 420;
            this.y2 = random(-50, 830);
            this.mx2 = random(-4, 4);
            this.my2 = random(-4, 4);
        }
        if (this.x2 > 420) {
            this.x2 = -50;
            this.y2 = random(-50, 830);
            this.mx2 = random(-4, 4);
            this.my2 = random(-4, 4);
        }

        if (this.y2 < -50) {
            this.x2 = random(-50, 420);
            this.y2 = 830;
            this.mx2 = random(-4, 4);
            this.my2 = random(-4, 4);
        }
        if (this.y2 > 830) {
            this.x2 = random(-50, 420);
            this.y2 = -50;
            this.mx2 = random(-4, 4);
            this.my2 = random(-4, 4);
        }

    }

    del() {
        // console.log(`x:${mouseX}, y:${mouseY}`);
        this.dis1 = dist(this.x1, this.y1, mouseX, mouseY);
        this.dis2 = dist(this.x2, this.y2, mouseX, mouseY);
        if (this.dis1 < this.s / 2) {
            return 1;

        } else if (this.dis2 < this.s / 2) {
            return 2;
        }
        else {
            return 0;
        }
    }
}

......

function draw() {
            for (let i = 0; i < 5; i++) {
            c1.push(new Circle(0, 0, random(-4, 4), random(-4, 4), 80)); //pushは関数
            c1[i].moveUp();
            if (c1[i].del() == 1 && mouseIsPressed) {
                c1.splice(i, 1);
                console.log('up');
            }
        }

        for (let i = 0; i < 5; i++) {
            c2.push(new Circle(0, 0, random(-4, 4), random(-4, 4), 60)); //pushは関数
            c2[i].moveDown();
            if (c2[i].del() == 2 && mouseIsPressed) {
                c2.splice(i, 1);
                console.log('down');
            }
        }
}

クラス名はここではCircleと名付けます。
クラスで図形を増やすときには最初の宣言を配列に、そしてdraw内の繰り返しの中でpushという関数でnew Circleという処理で数を増やしていきます。

...
続き執筆中
...

let c1 = []; //配列に
let c2 = [];

let timeLimit = 11;
let time;

let timeBegin;


class Circle {
    constructor(x, y, mx, my, s) {
        this.x1 = x;
        this.y1 = y;
        this.mx1 = mx;
        this.my1 = my;
        this.x2 = x;
        this.y2 = y;
        this.mx2 = mx;
        this.my2 = my;
        this.s = s;
        this.dis1;
        this.dis2;
    }
    moveUp() {
        fill(0, 255, 255);
        ellipse(this.x1, this.y1, this.s, this.s);
        this.x1 += this.mx1;
        this.y1 += this.my1;
        if (this.x1 <= -50) {
            this.x1 = 420;
            this.y1 = random(-50, 830);
            this.mx1 = random(-4, 4);
            this.my1 = random(-4, 4);
        }
        if (this.x1 >= 420) {
            this.x1 = -50;
            this.y1 = random(-50, 830);
            this.mx1 = random(-4, 4);
            this.my1 = random(-4, 4);
        }

        if (this.y1 < -50) {
            this.x1 = random(-50, 420);
            this.y1 = 830;
            this.mx1 = random(-4, 4);
            this.my1 = random(-4, 4);
        }
        if (this.y1 > 830) {
            this.x1 = random(-50, 420);
            this.y1 = -50;
            this.mx1 = random(-4, 4);
            this.my1 = random(-4, 4);
        }

    }

    moveDown() {
        fill(255, 255, 0);
        ellipse(this.x2, this.y2, this.s, this.s);
        this.x2 += this.mx2;
        this.y2 += this.my2;
        if (this.x2 < -50) {
            this.x2 = 420;
            this.y2 = random(-50, 830);
            this.mx2 = random(-4, 4);
            this.my2 = random(-4, 4);
        }
        if (this.x2 > 420) {
            this.x2 = -50;
            this.y2 = random(-50, 830);
            this.mx2 = random(-4, 4);
            this.my2 = random(-4, 4);
        }

        if (this.y2 < -50) {
            this.x2 = random(-50, 420);
            this.y2 = 830;
            this.mx2 = random(-4, 4);
            this.my2 = random(-4, 4);
        }
        if (this.y2 > 830) {
            this.x2 = random(-50, 420);
            this.y2 = -50;
            this.mx2 = random(-4, 4);
            this.my2 = random(-4, 4);
        }

    }

    del() {
        // console.log(`x:${mouseX}, y:${mouseY}`);
        this.dis1 = dist(this.x1, this.y1, mouseX, mouseY);
        this.dis2 = dist(this.x2, this.y2, mouseX, mouseY);
        if (this.dis1 < this.s / 2) {
            return 1;

        } else if (this.dis2 < this.s / 2) {
            return 2;
        }
        else {
            return 0;
        }
    }
}


async function setup() {
    createCanvas(390, 800);
    background(0);

    scoreResult = 0;
    scene = "start";

    const { data, error } = await _supabase
        .from("scoreStrage")
        .select()

    highScore = 0;

    for (let s = 0; s < data.length; s++) {
        console.log(data[s].score)
        if (highScore < data[s].score)
            highScore = data[s].score;
    }
    console.log(highScore);

}

async function draw() {
    if (scene == "start")
        startScene();

    if (scene == "play") {

        background(180, 180, 255);

        // background(0);
        fill(255);
        translate(12, 12);
        // if(c.length > 0){
        for (let i = 0; i < 5; i++) {
            c1.push(new Circle(0, 0, random(-4, 4), random(-4, 4), 80)); //pushは関数
            c1[i].moveUp();
            if (c1[i].del() == 1 && mouseIsPressed) {
                c1.splice(i, 1);
                console.log('up');
                scoreCal(10);
            }
        }

        for (let i = 0; i < 5; i++) {
            c2.push(new Circle(0, 0, random(-4, 4), random(-4, 4), 60)); //pushは関数
            c2[i].moveDown();
            if (c2[i].del() == 2 && mouseIsPressed) {
                c2.splice(i, 1);
                console.log('down');
                scoreCal(-10);
            }
        }
        scoreText();
        time = timeLimit - (millis() - timeBegin) / 1000;
        text("制限時間→ " + int(time), 100, 200);
        if (time < 0) {
            scene = "result";
            const { Data, Error } = await _supabase
                .from("scoreStrage")
                .insert([{ score: scoreResult }])
        }
    }

    if (scene == "result")
        endScene();

}

function scoreCal(score) {
    scoreResult += score;
}

function scoreText() {
    fill(0);
    textSize(24);
    text("score→" + scoreResult, 10, 30);
    text("high score→" + highScore, 10, 70);
}

function startScene() {
    background(255, 0, 255);
    fill(0);
    textSize(48);


    text("スタート画面", 50, 400);
    text("画面タップして", 30, 500);
    if (mouseIsPressed) {
        timeBegin = millis();
        scene = "play";
    }

}

function endScene() {
    background(0);

    if (scoreResult > highScore) {
        fill(255, 255, 0);
        text("new score!!!", 150, 500)
    }



    //スタート、コンティニューボタン
    fill(0, 255, 0);
    ellipse(65, 590, 70, 70);

    fill(0, 0, 255);
    ellipse(65, 693, 70, 70);




    fill(255);
    text("high score→" + highScore, 10, 70);
    text("結果", 50, 450);
    text("s   ←スタート画面", 50, 600);
    text("c   ←コンティニュー", 50, 700);
    textSize(30);
    text(scoreResult + "pt", 50, 500);
    if (mouseIsPressed) {
        if (dist(65, 693, mouseX, mouseY) <= 70) {
            if (scoreResult > highScore)
                highScore = scoreResult;
            scoreResult = 0;
            timeBegin = millis();
            scene = "play";
        }
        if (dist(65, 590, mouseX, mouseY) <= 70) {
            if (scoreResult > highScore)
                highScore = scoreResult;
            scoreResult = 0;
            scene = "start";
        }
    }
}

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?