ПОВТОРНО ОТРЕДАКТИРОВАНО Если вы хотите, чтобы объект останавливался НЕПОСРЕДСТВЕННО ПЕРЕД фактическим столкновением, не разделяя один и тот же фактический пиксель края, попробуйте следующее:
bool Collision(int x1,int y1,int h1,int w1,int x2,int y2,int h2,int w2){
if((x1 + w1) >= (x2 - 1) || // object 1 hitting left side of object 2
(x1 - 1) <= (x2 + w2) || // object 1 hitting right side of object 2
(y1 - 1) <= (y2 + h2) || // Object 1 hitting bottom of object 2 (assuming your y goes from top to bottom of screen)
(y1 + h1) >= (y2 - 1)) // Object 1 hitting top of object 2
return 1;
return 0;
}
ИЛИ
int Collision(int x1,int y1,int h1,int w1,int x2,int y2,int h2,int w2){
if((x1 + w1) >= (x2 - 1)) return 1; // object 1 hitting left side of object 2
if((x1 - 1) <= (x2 + w2)) return 2; // object 1 hitting right side of object 2
if((y1 - 1) <= (y2 + h2)) return 3; // Object 1 hitting bottom of object 2 (assuming your y goes from top to bottom of screen)
if((y1 + h1) >= (y2 - 1)) return 4; // Object 1 hitting top of object 2
return 0; // no collision
}
Таким образом, они никогда не должны использовать один и тот же пиксель.
ОРИГИНАЛ Я думаю, что вы хотите пойти дальше:
bool Collision(int x1,int y1,int h1,int w1,int x2,int y2,int h2,int w2){
if((x1 + w1) >= x2 || // object 1 hitting left side of object 2
x1 <= (x2 + w2) || // object 1 hitting right side of object 2
y1 <= (y2 + h2) || // Object 1 hitting bottom of object 2 (assuming your y goes from top to bottom of screen)
(y1 + h1) >= y2) // Object 1 hitting top of object 2
return 1;
return 0;
}
Этот ответ предполагает, что вы хотите знать, когда два объекта не повреждены, ЗАНИМАЮТ одно и то же координатное ребро (т.е. меньше/больше или равно по сравнению с без равенства)
Однако этот ответ не возвращает, КАКОЕ РЕБРО является взаимодействующим ребром. Если бы вы хотели этого, вы могли бы сделать что-то еще в этом направлении.
int Collision(int x1,int y1,int h1,int w1,int x2,int y2,int h2,int w2){
if((x1 + w1) >= x2) return 1; // object 1 hitting left side of object 2
if(x1 <= (x2 + w2)) return 2; // object 1 hitting right side of object 2
if(y1 <= (y2 + h2)) return 3; // Object 1 hitting bottom of object 2 (assuming your y goes from top to bottom of screen)
if((y1 + h1) >= y2) return 4; // Object 1 hitting top of object 2
return 0; // no collision
}
Теперь снаружи вам просто нужно декодировать случаи обнаружения краев 1-4.
person
trumpetlicks
schedule
03.10.2014
if (Collision(x1,y1,h1,w1,x2,y2,h2,w2)) StopAndNotContinueThroughTheObject();
? - person Marlon   schedule 04.10.2014