processingを使用してミニゲームをつくろうとしていましたが、
どこが間違っているのかわかりませんでした。
「プログラミングとゲームの杜」の緑を救えを参考にしました。
発生している問題・エラーメッセージ
実行してゲームの画面が表示したあと、
マウスカーソルを動かして緑だけを拾い、赤に当たらないようにするときに
赤にあたっていないにもかかわらずHPが減ってしまいます。
Java
1int px=200; 2int py=350; 3int pw=40; 4int ph=20; 5int ow=30; 6int oh=30; 7int[] oy=new int[10]; 8int[] oColor=new int[10]; 9int[] oWait=new int[10]; 10int score; 11int hp; 12int gseq; 13int mcnt; 14 15void setup(){ 16 size(400,400); 17 noStroke(); 18 gameInit(); 19} 20void draw(){ 21 background(0); 22 if(gseq==0){ 23 gamePlay(); 24 }else if(gseq==1){ 25 gameOver(); 26 } 27} 28void playerDisp(){ 29 fill(255); 30 rect(px,py,pw,ph,5); 31} 32void playerMove(){ 33 px=mouseX; 34 if((px+pw)>width){ 35 px=width-pw; 36 } 37} 38void objDisp(){ 39 for(int i=0;i<10;i++){ 40 if(oColor[i]==0){ 41 fill(255,0,0); 42 }else{ 43 fill(0,255,0); 44 } 45 rect(i*40+5,oy[i],ow,oh,5); 46 } 47} 48void objMove(){ 49 for(int i=0;i<10;i++){ 50 if(oWait[i]>0){ 51 oWait[i]--; 52 }else{ 53 oy[i]+=2; 54 } 55 if(oy[i]>height){ 56 if(oColor[i]==1){ 57 hp--; 58 } 59 objInit(i); 60 } 61 } 62} 63void objInit(int no){ 64 oy[no]=40; 65 oColor[no]=int(random(2)); 66 oWait[no]=int(random(60,240)); 67} 68void hitCheck(){ 69 int ox; 70 for(int i=0;i<10;i++){ 71 ox=i*40+5; 72 if((px<(ox+ow))&&((px+pw)>ox) 73 &&(py<(oy[i]+oh))&&((py+ph)>oy[i])){ 74 if(oColor[i]==1){ 75 score+=10; 76 }else{ 77 hp--; 78 } 79 objInit(i); 80 } 81 } 82} 83void scoreDisp(){ 84 textSize(24); 85 fill(255); 86 text("score:"+score,10,25); 87 text("HP:"+hp,300,25); 88} 89void gamePlay(){ 90 objMove(); 91 objDisp(); 92 playerMove(); 93 playerDisp(); 94 hitCheck(); 95 scoreDisp(); 96 if(hp<1){ 97 gseq=1; 98 } 99} 100void gameOver(){ 101 objDisp(); 102 playerDisp(); 103 scoreDisp(); 104 textSize(50); 105 fill(255,255,0); 106 text("GAME OVER",60,200); 107 mcnt++; 108 if((mcnt%60)<40){ 109 textSize(20); 110 fill(255); 111 text("Click to retry!!",140,260); 112 } 113} 114void gameInit(){ 115 for(int i=0;i<10;i++){ 116 objInit(i); 117 } 118 score=0; 119 hp=10; 120 gseq=0; 121 mcnt=0; 122} 123void mousePressed(){ 124 if(gseq==1){ 125 gameInit(); 126 } 127}
当たり判定のソースコードはここだと思うので追加いたしました。
ご指摘ありがとうございます。
試したこと
ソースコードを全部見返し間違っているところはないかを探しましたが
見つかりませんでした。
> 「プログラミングとゲームの杜」の緑を救えを参考にしました。
こちらのことでしょうか?
■ みどりを救えゲームを作ろう | プログラミングとゲームの杜
https://www.greenowl5.com/gprogram/processing/processing131.html
> ソースコードを全部見返し間違っているところはないかを探しましたが
> 見つかりませんでした。
ソースコードの提示をお願いします。
> 当たり判定のソースコード
そこはあってそうです。
判断が付かない為、ソースコード全部提示してもらえますか?
ご指摘ありがとうございます。
追加いたしました。
自分でもソースコード打ち込んでみましたが、特段、差異は無さそうでした。
差異としては "Click to retry!" が "Click to retry!!" になっていたくらいです。
たぶん、コードはあっているのではないでしょうか。
> 赤にあたっていないにもかかわらずHPが減ってしまいます。
緑を取りこぼすとHPが減るようなので、そのことでしょうか?
ありがとうございます。
前の質問 https://teratail.com/questions/369248 は放置ですか?
(あれ?cx20さんの回答へのコメントみると、そっちと間違えたか?)
(質問者さんには関係のない単なる感想ですが...画像を見て手で打ち込め、なんてなんの苦行でしょうね...>参照先サイト
いやまぁ、紙媒体しかなかった40年前のマイコン少年達は通った道ではありますが)
「プログラミング言語」はプログラミング言語間の特徴比較だとかそういうことを話題にするためのタグでしょう。プログラミングの話題で何らかのプログラミング言語を使うのは当たり前なので、何らかの言語を使うからとタグ付けしていたらほぼすべての質問に「プログラミング言語」のタグがついてしまいタグの意味が無くなってしまいます。
> 画像を見て手で打ち込め、なんてなんの苦行でしょうね
転載防止とかそういうところなんでしょうね。
まぁ、手で打ち込むのも学習の一環と思えば悪いくないかと思います。
「i」と「1」の打ち間違いとか、コピペだと気が付かないですからね。。
いわゆる「写経」というやつですか。まぁ、間違えそうなところに気づく効果もゼロとは言いませんが、費用対効果比でいうとどうなんでしょうねぇ。
回答1件
あなたの回答
tips
プレビュー