Я работаю над созданием простого приложения обработки, которое создает звуковой эффект всякий раз, когда молот попадает в не движущуюся фигуру. Тем не менее, у меня возникают трудности с попыткой обнаружить код всякий раз, когда объект молота сталкивается с объектом фигуры, и начали прибегать к непрофессиональным обходным решениям, как это видно в блоке кода, прокомментированном в разделе «тестирование». Любая помощь по созданию решения этой проблемы было бы массово оценилиОбнаружение столкновений между движущимся и неподвижным объектом
import oscP5.*;
import netP5.*;
OscP5 oscP5;
NetAddress myRemoteLocation;
float bx;
float by;
int boxSizeX = 160;
int boxSizeY = 30;
boolean overBox = true;
boolean locked = false;
float xOffset = 0.0;
float yOffset = 0.0;
float angle = 4.70;
BeatBall b1 = new BeatBall(210,425,60, 1);
void setup()
{
size(800, 600);
smooth();
frameRate(120);
bx = width/2.0;
by = height/2.0;
oscP5 = new OscP5(this,12001);
/* myRemoteLocation is a NetAddress. a NetAddress takes 2 parameters,
* an ip address and a port number. myRemoteLocation is used as parameter in
* oscP5.send() when sending osc packets to another computer, device,
* application. usage see below. for testing purposes the listening port
* and the port of the remote location address are the same, hence you will
* send messages back to this sketch.
*/
myRemoteLocation = new NetAddress("127.0.0.1",12000);
}
void draw()
{
background(0);
pushMatrix();
translate(400, 425);
rotate(angle);
fill(222,223,255);
Hammer h = new Hammer(135, -67, boxSizeY+25, boxSizeX-25, 1);
h.displayHammer();
rect(-25, -15, boxSizeX, boxSizeY);
popMatrix();
b1.displayBall();
//Testing
if(angle < -2.6561418 && angle > -3.043227)
{
background(120);
b1.collide();
}
println(angle);
}
void mousePressed()
{
xOffset = mouseX-bx;
yOffset = mouseY-by;
}
void mouseDragged()
{
bx = mouseX-xOffset;
by = mouseY-yOffset;
angle = atan2(mouseY - 400, mouseX - 400);
}
//BEATBALL CLASS
class BeatBall {
float x, y;
float diameter;
float vx = 0;
float vy = 0;
int id;
BeatBall(float xin, float yin, float din, int idin) {
x = xin;
y = yin;
diameter = din;
id = idin;
}
void collide()
{
/* Collision Example
float dx = Hammer.x - x;
float dy = Hammer.y - y;
float distance = sqrt(dx*dx + dy*dy);
float minDist = others[i].diameter/2 + diameter/2;
if (distance < minDist)
{
float angle = atan2(dy, dx);
float targetX = x + cos(angle) * minDist;
float targetY = y + sin(angle) * minDist;
float ax = (targetX - others[i].x) * spring;
float ay = (targetY - others[i].y) * spring;
vx -= ax;
vy -= ay;
others[i].vx += ax;
others[i].vy += ay;
*/
OscMessage myMessage = new OscMessage("/bubble");
print(diameter + " ");
myMessage.add(1/(diameter*diameter) * 1000000); /* add an int to the osc message */
/* send the message */
oscP5.send(myMessage, myRemoteLocation);
//}
}
void displayBall()
{
fill(191,89,0);
ellipse(x, y, diameter, diameter);
}
}
//HAMMER CLASS
class Hammer {
float x, y;
float sizeX, sizeY;
float vx = 0;
float vy = 0;
int id;
Hammer(float xin, float yin, float sxin, float syin, int idin) {
x = xin;
y = yin;
sizeX = sxin;
sizeY = syin;
id = idin;
}
void displayHammer()
{
fill(222,223,255);
rect(x, y, sizeX, sizeY);
}
}
Спасибо за ссылку, мне нужно будет проверить их позже. Но с точки зрения вашего второго предложения, в отношении моего кода я уже разработал, как бы вы интегрировали этот алгоритм? Извиняясь за ручную работу, я просто хочу, чтобы мой мозг жарился в данный момент, борясь с этой проблемой и другими проектами, над которыми я работаю, и я был бы благодарен за такую помощь, какую только могу. – Liam
Обновлен как функция. Ничего особенного в алгоритме, как вы его используете. – JeffThompson
Это работало? Пожалуйста, примите ответ, если да :) – JeffThompson