不完全なシューティング
float score = 0; float x = 50, y = 250, s = 50; //自キャラの座標 float t1X = 50, t1Y=50, t1Vx=2, t1Vy=2, t1S = 50; //敵キャラ1 float t1Life = 1; boolean shotFlag = false; float b1X = 50, b1Y=300, b1Vx=2, b1Vy=-1, b1S = 10; //弾1 int countDown = 600; int stage = 0; //ステージを管理する変数 void setup() { size(300, 300); frameRate(60); } void draw() { switch(stage) { case 0: stage0(); break; case 1: stage1(); break; case 2: //ゲームオーバー、ゲームクリア画面などを追加 break; default: break; } } //スタート画面 void stage0() { background(255); fill(0); text("Right Click", width/2, height/2); if (mousePressed) { stage = 1; mousePressed = false; } } //ゲーム画面 void stage1() { countDown--; background(255); //背景図形 fill(0, 0, 255); rect(0, 0, width, 10); //自キャラの移動 if (x < mouseX) { x += 1; } else if (x > mouseX) { x -= 1; } //y方向についても同様の処理を記述 if (y < mouseY) { y += 1; } else if (y > mouseY) { y -= 1; } if (shotFlag) { b1Y += b1Vy; if (b1Y < 0) { //もし、b1Yが0未満なら・・・ } fill(0, 0, 0); ellipse(b1X, b1Y, b1S, b1S); } if (mousePressed && shotFlag == false) { shotFlag = true; } fill(255, 0, 0, 20); ellipse(x, y, s, s); //ゴールした時の処理 if (y < 10) { fill(0); text("Clear!!", 20, 50); noLoop(); } //敵キャラ1の移動 if (t1Life > 0) { if (t1X > width) { t1Vx = -2; } else if (t1X < 0) { t1Vx = 2; } t1X += t1Vx; fill(0, 255, 0, 20); ellipse(t1X, t1Y, t1S, t1S); //敵1との当たり判定 if (checkCollision(x, y, s, t1X, t1Y, t1S)) { //敵と自キャラの距離が20未満なら fill(0); text("game over!!", 20, 50); //ゲームオーバー noLoop(); } if (checkCollision(b1X, b1Y, b1S, t1X, t1Y, t1S)) { //敵と弾の距離が20未満なら fill(0); text("game over!!", 20, 50); //ゲームオーバー noLoop(); } } //ここに敵キャラ2, 3と処理を追加していく fill(0, 0, 0); text("残り時間:" + countDown, 10, 40); //もしもcountDownが0以下なら・・・ } /*(円1のx, y, 幅, 円2のx, y, 幅)を引数として渡すと、衝突判定の結果を返す 返り値はtrueかfalse */ boolean checkCollision(float x1, float y1, float w1, float x2, float y2, float w2) { boolean hit = false; if (dist(x1, y1, x2, y2)<=w1/2+w2/2) { hit = true; } return hit; }
Copy