###初めに
プログラミングの経験は浅く、ベクトルとクラスの使用に関しては完全な初学者です。
イギリス英語圏での課題ですのでColorとColourの綴りの違いには目を瞑って頂けると助かります。
プログラムの完成形の内容
①500×500の白いキャンバスに3つの動く球を描くこと。
②それぞれの球はランダムなスタート位置、ランダムな縁なしの色、20~30のランダムな半径、そしてX/Yの要素において ‐5~5のランダムな速度をもつこと。それぞれの球は壁で跳ね返ること。
③球同士が初めて衝突する時に互いにくっつき、それ以降一緒に動く。合体している2つの球のうち、壁に近いほうが壁にぶつかると2球とも運動の方向が変わること。
###つまずいている点
拙いながらも②まで書きましたが③が上手く行かず、アプローチの仕方すらわかりません。
ついでに、球の色付けにも失敗いています。
該当のソースコード
Processing
1PVector locationA, locationB, locationC; 2PVector velocityA, velocityB, velocityC; 3 4color colourA = getRandomColour(); 5color colourB = getRandomColour(); 6color colourC = getRandomColour(); 7 8color getRandomColour() { 9 return color(random(256), random(256), random(256)); 10} 11 12class BouncingBall 13{ 14 float x, y, r, dx, dy; 15 float ballColour; 16 17 BouncingBall(float xInt, float yInt, float rInt, color colourInt, float dxInt, float dyInt) 18 { 19 x = xInt; 20 y = yInt; 21 r = rInt; 22 ballColour = colourInt; 23 dx = dxInt; 24 dy = dyInt; 25 } 26 27 void render() 28 { 29 noStroke(); 30 fill(ballColour); 31 ellipse(x, y, r*2, r*2); 32 33 if(dist(ballA.x, ballA.y, ballB.x, ballB.y) <= rA + rB) 34 { 35 //This is where I have the problem 36 ballA.dx = ballB.dx; 37 ballA.dy = ballB.dy; 38 } 39 if(dist(ballB.x, ballB.y, ballC.x, ballC.y) <= rB + rC) 40 { 41 //This is where I have the problem 42 } 43 if(dist(ballC.x, ballC.y, ballA.x, ballA.y) <= rC + rA) 44 { 45 //This is where I have the problem 46 } 47 48 } 49 50 void update() 51 { 52 x += dx; 53 y += dy; 54 55 if (x - r <= 0 || x + r >= width) { 56 dx = -dx; 57 if (x - r <= 0) { 58 x = r+1; 59 } 60 if (x + r >= width-1) { 61 x = width-r-1; 62 } 63 } 64 if (y - r <= 0 || y + r >= height) { 65 dy = -dy; 66 if (y - r <= 0) { 67 y = r+1; 68 } 69 if (x + rA >= height-1) { 70 x = height-r-1; 71 } 72 } 73 } 74} 75 76final color WHITE = color(255); 77 78float rA = random(20, 30); 79float rB = random(20, 30); 80float rC = random(20, 30); 81 82float randomVelocity() { 83 return random(-5, 5); 84} 85float randomCoordinate() { 86 return random(501); 87} 88 89BouncingBall ballA, ballB, ballC; 90 91void setup() 92{ 93 size(500, 500); 94 smooth(); 95 96 locationA = new PVector(randomCoordinate(), randomCoordinate()); 97 velocityA = new PVector(randomVelocity(), randomVelocity()); 98 ballA = new BouncingBall(locationA.x, locationA.y, rA, colourA, velocityA.x, velocityA.y); 99 100 locationB = new PVector(randomCoordinate(), randomCoordinate()); 101 velocityB = new PVector(randomVelocity(), randomVelocity()); 102 ballB = new BouncingBall(locationB.x, locationB.y, rB, colourB, velocityB.x, velocityB.y); 103 104 locationC = new PVector(randomCoordinate(), randomCoordinate()); 105 velocityC = new PVector(randomVelocity(), randomVelocity()); 106 ballC = new BouncingBall(locationC.x, locationC.y, rC, colourC, velocityC.x, velocityC.y); 107} 108 109void draw() 110{ 111 //only showing 2 balls for now to make it easier to think 112 113 ballA.update(); 114 ballB.update(); 115 //ballC.update(); 116 background(WHITE); 117 ballA.render(); 118 ballB.render(); 119 //ballC.render(); 120 121}
試したこと
ベクトルの値の合成と球の合体は別々のコードが必要だと考えましたが、値の合成ではballBを変化させられず、球の合体に至っては手の付け方が思い浮かばずにいます。(頭の中ではBの座標をAに依存させようと、A座標‐2球の半径を…のように交錯していますがプログラムに起こせずにいます。)
下のコードは、既存の二つのベクトルを合成して、その値でX/Y成分を上書きしようとしました。
WhatIHaveTried
1velocityA.add(velocityB); 2--------------------------------------- 3velocityA.x = velocityA.x + velocityB.x 4velocityA.y = velocityA.y + velocityB.y 5--------------------------------------- 6velocityA.x = velocityA.x + velocityB.x 7velocityA.y = velocityA.y + velocityB.y 8velocityB.x = velocityB.x + velocityA.x 9velocityB.y = velocityB.y + velocityA.y 10--------------------------------------- 11My current attempt 12Somehow sum the 2 Vectors and make the result a new Vector and enter in the last 2 sections below 13ballA = new BouncingBall(locationA.x, locationA.y rA, colourA, , ); 14//ballA teleports when collides
補足情報
その他気になる点やアドバイスが有りましたら、とてもとても素直に聞くのでどうかお聞かせください。
よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/26 04:13
2020/05/26 04:47
2020/05/26 05:38
2020/05/27 05:40
2020/05/27 23:40