実現したいこと
円同士が衝突したときにモンストのような反射の挙動をしてほしい
前提
Processingでモンストのようなゲームを作っています。
発生している問題・エラーメッセージ
衝突したときにめり込んだ影響で、振動してしまってうまく反射してくれない。
該当のソースコード
Processing(java)
1//dx,dyをvelocityに変更した影響でdx,dyがコメントアウトがしてあります 2class Chara { 3 float[][] position = new float[4][2]; 4 float[] dx = new float[4]; 5 float[] dy = new float[4]; 6 float[][] velocity=new float[4][2]; 7 float[] start_x = new float[4]; 8 float[] start_y = new float[4]; 9 float[] speed = new float[4]; 10 int[] attack = new int[4]; 11 int[] HP = new int[4]; 12 int allHP; 13 int currentHP; 14 int damage; 15 float r = 80; 16 boolean[] isDrag = new boolean[4]; 17 boolean[] isStopped = new boolean[4]; 18 19 int currentPhase; 20 int nowCP; 21 22 Chara() { 23 nowCP=0; 24 currentPhase = 0; 25 for (int i = 0; i < 4; i++) { 26 position[i][0] = (i + 1) * 128; 27 position[i][1] = 600; 28 // dx[i] = 0; 29 velocity[i][0]=0; 30 // dy[i] = 0; 31 velocity[i][1]=0; 32 start_x[i] = 0; 33 start_y[i] = 0; 34 speed[i] = 30; 35 attack[i]=30000; 36 HP[i]=25000; 37 allHP+=HP[i]; 38 isDrag[i] = false; 39 isStopped[i] = false; 40 } 41 currentHP=allHP; 42 } 43 44 void update() { 45 switch (nowCP) { 46 case 0: 47 updateBall(0); 48 break; 49 case 1: 50 updateBall(1); 51 break; 52 case 2: 53 updateBall(2); 54 break; 55 case 3: 56 updateBall(3); 57 break; 58 } 59 } 60 61 62 void updateBall(int index) { 63// dx[index] *= 0.99; 64// dy[index] *= 0.99; 65 velocity[index][0]*=0.99; 66 velocity[index][1]*=0.99; 67 68 if (abs(velocity[index][0]) < 0.5 && abs(velocity[index][1]) < 0.5) { 69 velocity[index][0] = 0; 70 velocity[index][1] = 0; 71 stop(index); 72 } 73 move(index, position[index][0], position[index][1], velocity[index][0], velocity[index][1]); 74 bound(index, position[index][0], position[index][1]); 75 76} 77 78 void display() { 79 showChara(); 80 showArrow(); 81 showHP(); 82 } 83 84 85 86 void mousePressed() { 87 88 if (scene_number == SCENE_GAME&&isStopped[nowCP]&&!m.phase) { 89 nowCP=currentPhase; 90 currentPhase++; 91 if (currentPhase >= 4) { 92 currentPhase = 0; 93 } 94 } 95 if(!m.phase){ 96 start_x[nowCP] = mouseX; 97 start_y[nowCP] = mouseY; 98 isDrag[nowCP] = true; 99 } 100} 101 102 103 void mouseReleased() { 104 if (scene_number == SCENE_GAME && isStopped[nowCP]&&!m.phase) { 105 resume(nowCP); 106 m.phase=true; 107 arrow(position[nowCP][0], position[nowCP][1], start_x[nowCP], start_y[nowCP]); 108 float l = mag(start_x[nowCP] - mouseX,start_y[nowCP] - mouseY); 109 110 //dx[nowCP] = (start_x[nowCP] - mouseX) * speed[nowCP]/l; 111 // dy[nowCP] = (start_y[nowCP] - mouseY) * speed[nowCP]/l; 112 velocity[nowCP][0] = (start_x[nowCP] - mouseX) * speed[nowCP]/l; 113 velocity[nowCP][1] = (start_y[nowCP] - mouseY) * speed[nowCP]/l; 114 isDrag[nowCP] = false; 115 116 if (l < r/2) { 117 // dx[nowCP] = 0; 118 // dy[nowCP] = 0; 119 velocity[nowCP][0]=0; 120 velocity[nowCP][1]=0; 121 currentPhase--; 122 m.phase=false; 123 } 124 } 125} 126void showChara(){ 127 fill(0); 128 for (int i = 0; i < 4; i++) { 129 strokeWeight(1); 130 stroke(0); 131 circle(position[i][0], position[i][1], r); 132 fill(63*i); 133 } 134 // text(nowCP,width/2,height/2,0); 135} 136 137void showArrow(){ 138 for (int i = 0; i < 4; i++) { 139 if (isDrag[i]) { 140 arrow(position[i][0], position[i][1], start_x[i], start_y[i]); 141 } 142 } 143} 144void arrow(float x, float y, float start_x, float start_y) { 145 PVector arrow = new PVector(x + start_x - mouseX, y + start_y - mouseY); 146 if (isStopped[nowCP]) { 147 stroke(0); 148 strokeWeight(10); 149 line(arrow.x, arrow.y, x, y); 150 151 } 152} 153 154void showHP(){ 155 float HPbar; 156 HPbar=map(currentHP,0,allHP,0,width); 157 textSize(50); 158 strokeWeight(10); 159 stroke(255,255,0); 160 line(0,height,HPbar,height); 161 textAlign(RIGHT); 162 text(allHP,width,height); 163 textAlign(LEFT); 164 text("/",width-155,height); 165 textAlign(RIGHT); 166 text(currentHP,width-150,height); 167} 168 169 170 171 void bound(int index, float x, float y) { 172 boolean collision[]=new boolean[6]; 173 for(int i=0;i<m.M;i++){ 174 if(m.HP[i]>=0){ 175 collision[i]=false; 176 } 177 } 178 179 if (x > width && velocity[index][0] > 0) { 180 //dx[index] *= -1; 181 velocity[index][0]*=-1; 182 } 183 if (x < 0 && velocity[index][0] < 0) { 184 // dx[index] *= -1; 185 velocity[index][0]*=-1; 186 } 187 if (y > height && velocity[index][1] > 0) { 188 // dy[index] *= -1; 189 velocity[index][1]*=-1; 190 } 191 if (y < 0 && velocity[index][1] < 0) { 192 //dy[index] *= -1; 193 velocity[index][1]*=-1; 194 } 195 196 for(int i=0;i<m.M;i++){ 197 if(m.HP[i]>=0){ 198 199 float d=distance(m.position[i][0],m.position[i][1],x,y); 200 if(d<r/2+m.r/2){ 201 collision[i]=true; 202 text("collision",width/2,100); 203 if(abs(velocity[index][0])>=abs(velocity[index][1])&&collision[i]){ 204 velocity[index][0] *= -1; 205 m.HP[i]-=attack[nowCP]; 206 } 207 if(abs(velocity[index][0])<abs(velocity[index][1])&&collision[i]){ 208 velocity[index][1]*=-1; 209 m.HP[i]-=attack[nowCP]; 210 } 211 } 212 } 213 } 214 } 215 216 217float distance(float x1, float y1, float x2, float y2) { 218 float dx = x2 - x1; 219 float dy = y2 - y1; 220 return sqrt(dx * dx + dy * dy); 221} 222 223 void move(int index, float x, float y, float dx, float dy) { 224 position[index][0] = x + dx; 225 position[index][1] = y + dy; 226 } 227 228 229 230 void stop(int index) { 231 isStopped[index] = true; 232 233 } 234 235 void resume(int index) { 236 isStopped[index] = false; 237 } 238}
試したこと
bound関数の中身をずっといじっているのですが見当違いなのでしょうか?
補足情報(FW/ツールのバージョンなど)
Processing 4.2
回答2件
あなたの回答
tips
プレビュー