前提
画面上のランダムな位置に円が描画され、それをクリックして消すとスコアが入るゲームをつくろうとしています。
実現したいこと
マウスカーソルが円と重なった際に円を塗りつぶしたい
発生している問題・エラーメッセージ
マウスカーソルが円と重なっていなくても図形が緑色に塗りつぶされてしまう
該当のソースコード
processingです
ソースコード
void setup() {
size(1920,1080);
background(0);
}
float x = 0;
float y = 0;
float tx = x - 50;
float ty = y - 50;
float tx2 = x + 50;
float ty2 = y + 50; //x,yが円の中心+-50の位置
void draw() {
x = random(0,1080);
y = random(0,1920);
ellipse(x,y,100,100);
if( tx <= mouseX && mouseX <= tx2){ if( ty <= mouseY && mouseY <= ty2){//マウスカーソルのx座標、y座標がともに円の内部にきたら fill(0,255,0); //塗りつぶす }
}
delay(2500); //円が描画されるスピードを調節
}
###最後に
プログラミング初心者なので、参考のためにも「前提」に書いてあるようなゲームを作るためのコードを作っていただけたらめちゃめちゃありがたいです!!
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
下記のような質問は推奨されていません。
- 質問になっていない投稿
- スパムや攻撃的な表現を用いた投稿
適切な質問に修正を依頼しましょう。
回答2件
0
画面上のランダムな位置に円が描画され、それをクリックして消すとスコアが入るゲームをつくろうとしています。
最近似た質問に回答しました(ちょっと違うというのは理解しています)
ランダムに配置させた図形の色を変える方法
円との当たり判定の「参考」にはなるはずです。
マウスカーソルが円と重なった際に円を塗りつぶしたい
上記回答のmouseClicked
を、mouseMoved
に置き換えてみました(+ちょっと整理)
Processing
1final int NUM = 5; 2float[] x = new float[NUM]; 3float[] y = new float[NUM]; 4float[] r = new float[NUM]; 5boolean[] isMouseHover = new boolean[NUM]; 6 7void setup() { 8 size(400, 300); 9 ellipseMode(RADIUS); 10 11 for (int i = 0; i < NUM; i++) { 12 x[i] = random(width); 13 y[i] = random(height); 14 r[i] = random(50, 100); 15 } 16} 17 18void draw() { 19 background(255); 20 21 for (int i = 0; i < NUM; i++) { 22 if (isMouseHover[i]) { 23 fill(0, 255, 0); 24 } else { 25 fill(255); 26 } 27 circle(x[i], y[i], r[i]); 28 } 29} 30 31void mouseMoved() { 32 for (int i = 0; i < NUM; i++) { 33 if (dist(x[i], y[i], mouseX, mouseY) < r[i]) { 34 isMouseHover[i] = true; 35 } else { 36 isMouseHover[i] = false; 37 } 38 } 39}
プログラミング初心者なので、参考のためにも「前提」に書いてあるようなゲームを作るためのコードを作っていただけたらめちゃめちゃありがたいです!!
代わりに作ってしまっては、それは「プログラミング」と言えるのでしょうか?
claus__さんの理解度もわかりませんし、かといって0から説明するわけにもいきません。
求めている回答ではないでしょうが、比較的簡単にできそうなライブラリを使用した例を出しておきます。
メニューの「スケッチ」-「ライブラリをインポート...」から、Fisica
をインストールしておきます。
Processing
1import fisica.*; 2 3FWorld world; 4int timeLimit = 15; 5int startMS; // ゲーム開始時間 6int countDown; 7int score; 8PImage photo1; 9PImage photo2; 10 11Scene scene = Scene.TITLE; // 現在の画面 12enum Scene { // 画面を表すenum 13 TITLE, PLAY, GAMEOVER, 14} 15 16 17void setup() { 18 fullScreen(); 19 background(255, 255, 0); 20 fill(0); 21 textSize(90); 22 23 Fisica.init(this); 24 world = new FWorld(); 25 world.setEdges(); 26 world.setGravity(0, 0); 27 28 // 画像読み込みは初回1回でよい(同じ画像を使いまわす) 29 //photo = loadImage("2.png"); 30 photo1 = loadImage("https://www.gravatar.com/avatar/65adad388f02d47ab7fb7e48579efe41?d=identicon", "png"); 31 photo2 = loadImage("https://teratail-v2.storage.googleapis.com/uploads/avatars/u13/132786/KnkDDC5A_thumbnail.jpg"); 32} 33 34void draw() { 35 switch(scene) { 36 case TITLE: 37 title(); 38 break; 39 case PLAY: 40 play(); 41 break; 42 case GAMEOVER: 43 gameover(); 44 break; 45 } 46} 47 48void title() { 49 background(255, 255, 0); 50 51 push(); // textAlignやtextSizeの変更がほかに影響しないように、push popで閉じ込める 52 textAlign(CENTER, CENTER); // センタリング 53 text("HOGE GAME", 0, 0, width, height); // 画面中央 54 55 if (frameCount % 60 < 30) { // 点滅 56 textSize(44); 57 text("Mouse Click to Play", 0, height / 2, width, height / 2); // 画面下半分中央 58 } 59 pop(); 60} 61 62void play() { 63 background(255); 64 65 text("SCORE:" + score, width - 600, 100); 66 67 int ms = (millis() - startMS) / 1000; // 開始時間を引く 68 69 countDown = timeLimit - ms; 70 if (countDown <= 0) { 71 scene = Scene.GAMEOVER; // 結果画面に遷移 72 } 73 if (countDown <= 10) { 74 text("COUNT DOWN :" + countDown, 100, 100); 75 } 76 77 if (frameCount % 60 == 1) { 78 add(); 79 } 80 81 world.step(); 82 world.draw(); 83} 84 85void gameover() { 86 background(255, 255, 0); 87 88 push(); 89 textAlign(CENTER, CENTER); 90 text("TIME OVER\nYOUR SCORE " + score, 0, 0, width, height); 91 92 if (frameCount % 60 < 30) { 93 textSize(44); 94 text("Mouse Click to Title", 0, height / 2, width, height / 2); 95 } 96 pop(); 97} 98 99void mouseClicked() { 100 switch(scene) { 101 case TITLE: 102 scene = Scene.PLAY; // ゲーム画面に遷移 103 startMS = millis(); // ゲーム開始時間記録 104 break; 105 case GAMEOVER: 106 scene = Scene.TITLE; // タイトル画面に遷移 107 countDown = 0; // 変数再初期化 108 score = 0; 109 // FCircleだけを取り除くのはそこそこ面倒なので、FWorldごと作り直し(雑いw 110 world = new FWorld(); 111 world.setEdges(); 112 world.setGravity(0, 0); 113 break; 114 } 115} 116 117void mousePressed() { 118 FBody body = world.getBody(mouseX, mouseY); 119 if(body == null) return; 120 121 String name = body.getName(); 122 if ("aaa".equals(name)) { 123 world.remove(body); 124 score += 500; 125 } 126 if ("bbb".equals(name)) { 127 world.remove(body); 128 score += 300; 129 } 130} 131 132void add() { 133 FBody body; 134 135 if (1 < random(2)) { 136 body = new FCircle(135); // (丸い当たり判定) 137 body.attachImage(photo1); 138 body.setName("aaa"); // 区別できればなんでもいい 139 } else { 140 body = new FBox(95, 95); // (四角い当たり判定) 141 body.attachImage(photo2); 142 body.setName("bbb"); 143 } 144 145 float x = random(width - 100) + 50; 146 float y = random(height - 100) + 50; 147 body.setPosition(x, y); 148 149 PVector p = PVector.random2D().mult(10000); 150 body.addForce(p.x, p.y); 151 body.setDamping(0); 152 body.setDensity(0.2); 153 body.setFriction(0); 154 body.setRestitution(1); 155 body.setStroke(1); 156 157 world.add(body); 158}
投稿2022/09/18 10:06
編集2022/09/30 09:51総合スコア8512
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
回答へのコメント
0
Processing
1float x = 0; 2float tx = x - 50; 3 4x=100; 5println(tx);
としたらなにが表示されると思いますか?
tx = x - 50;
(代入と初期化は微妙にちがうけどとりあえず話に関係ない)
というのは、プログラム上その場所に到達したとき xの値から50を減じた結果をtxに設定する
というだけの意味で、以降txを参照するごとに参照したときのxの値から50を引くわけではありません。
それと、原則としてdraw()が(デフォルトでは)毎秒60回実行される、という動作を阻害するようなことはしないほうがベターです。つまり、draw()の中でdelay(2500);
などとしてそこに2.5秒間もとどまるべきではありません。
投稿2022/09/18 05:57
総合スコア7422
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
関連した質問
Q&A
解決済
【WPF】カレンダーをカスタマイズし、日付欄にコメント欄を追加したい
回答1
クリップ1
更新
2023/05/30
Q&A
解決済
Uriの中身(存在)チェックのやり方について
回答2
クリップ0
更新
2023/05/26
Q&A
受付中
calloc(1000, sizeof(char))で「文字列の文字の読み取り中にエラーが発生」
回答2
クリップ0
更新
2023/05/29
Q&A
解決済
atoiに渡すポインターはなぜダブルポインターではダメなのか?
回答1
クリップ0
更新
2023/05/29
Q&A
解決済
Javaの外部ライブラリが使えない
回答1
クリップ0
更新
2023/05/30
Q&A
受付中
Atcoder ABC301 D Bitmaskが分かりません
回答1
クリップ0
更新
2023/05/31
Q&A
解決済
Javaでの不具合となります。
回答1
クリップ0
更新
2023/05/29
Q&A
解決済
円が波の動きをするようにしたい。
回答2
クリップ0
更新
2023/05/24
同じタグがついた質問を見る
Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。