我的问题在于,当我使用CGRectIntersects(rect,rect)时,我正在使用的球最终在球拍内部被永久卡住。这通常发生在计算机拨片上,很少发生在玩家拨片上。
所有这一切的目的是让球拍方向在“Y轴”或“X轴”上反转球的方向,这取决于它在哪个球拍上击中的击球盒。
我将发布我尝试修复此方法的所有方法(没有一个特别好的结果)。 我试图修复这个(未注释的部分)的第一种方法是使用“命中框”。我在每个球拍上放置了三个空的UIImageViews来表示顶部/底部和右/左。 “命中框”实际上只是不同UIImageViews上的CGRectIntersects。到目前为止,这是最有效的。
我也试图用“隐形障碍”来反射球。这些是“// Invisible Barrier Method”下注释掉的部分。这些工作没问题,球有时会卡住,但我无法正确击中球的两侧/角落。
原始版本是CGRectIntersects方法。这将带球并将其反射良好(直到高速)但如果它击中桨的后端也会反射球。这是我不希望它做的事情。
由于我无法发布图片,我将描述游戏视图。你有四个角球挡住球(每个角落一个)。有四个拨片,两个球员拨片和两个电脑拨片。计算机拨片占据屏幕的顶部和左侧,而播放器拨片则采用屏幕的底部和右侧。每个桨是一个66x20(水平桨)和20x66(垂直桨)的矩形。球为24x24,角落各为30x30。
Game.m
-(void) Collision {
/* if (ball.center.x - 12 >= Player.center.x - 35 && ball.center.x + 12 <=
Player.center.x + 35 && ball.center.y + 12 <= Player.center.y - 10 && ball.center.y + 12
>= Player.center.y - 15)
{
y = -y;
} */
// Player Paddle
// Invisible Barrier Method
/*
if (ball.center.x + 12 <= Player.center.x + 35 && ball.center.x - 12 >=
Player.center.x - 35 && ball.center.y +12 >= Player.center.y - 10 && ball.center.y + 12
<= Player.center.y - 3)
{
y = -y;
}
*/
if (CGRectIntersectsRect(ball.frame,PlayerLeft.frame))
{
x = -x;
}
if (CGRectIntersectsRect(ball.frame, PlayerRight.frame))
{
x = -x;
}
if (CGRectIntersectsRect(ball.frame, PlayerTop.frame))
{
y = -y;
}
// Player Vert paddle
// Invisible Barrier Method
/*
if (ball.center.y -12 <= PlayerVert.center.y + 33 && ball.center.y +12 >=
PlayerVert.center.y - 33 && ball.center.x + 12 >= PlayerVert.center.x -10 &&
ball.center.x +12 <= PlayerVert.center.x -3)
{
x = -x;
}
*/
//=============================
if (CGRectIntersectsRect(ball.frame, PlayerVertBottom.frame))
{
y = -y;
}
if (CGRectIntersectsRect(ball.frame, PlayerVertTop.frame))
{
y = -y;
}
if (CGRectIntersectsRect(ball.frame, PlayerVertLeft.frame))
{
x = -x;
}
// Computer Paddle
// Invisible barrier method
/*
if (ball.center.x - 12 >= Computer.center.x - 33 && ball.center.x +12 <=
Computer.center.x + 33 && ball.center.y - 12 <= Computer.center.y +10 &&
ball.center.y >= Computer.center.y - 10)
{
y = -y;
}
if (ball.center.x + 12 >= Computer.center.x - 33 && ball.center.x + 12 <=
Computer.center.x - 30 && ball.center.y - 12 <= 30)
{
x = -x;
}
if (ball.center.x - 12 <= Computer.center.x + 33 && ball.center.x - 12 >=
Computer.center.x + 30 && ball.center.y - 12 <= 30) {
x = -x;
}
*/
// Hit box Method
if (CGRectIntersectsRect(ball.frame,ComputerBottom.frame))
{
y = -y;
}
if (CGRectIntersectsRect(ball.frame,ComputerLeft.frame))
{
x = -x;
}
if (CGRectIntersectsRect(ball.frame, ComputerRight.frame))
{
x = -x;
}
// Computer Vert Paddle
// Invisible barrier method
/*
if (ball.center.x - 12 <= ComputerVert.center.x + 10 && ball.center.x - 12 >=
ComputerVert.center.x - 10 && ball.center.y - 12 <= ComputerVert.center.y + 33 &&
ball.center.y + 12>= ComputerVert.center.y - 33) {
x = -x;
}
*/
// Hit boxes method
if (CGRectIntersectsRect(ball.frame, ComputerVertBottom.frame))
{
y = -y;
}
if (CGRectIntersectsRect(ball.frame, ComputerVertTop.frame))
{
y = -y;
}
if (CGRectIntersectsRect(ball.frame, ComputerVertRight.frame))
{
x = -x;
}
// Bottom right corner (image)
// Top Side
if (ball.center.x >= 278 && ball.center.x <= 308 && ball.center.y >= 327 &&
ball.center.y <= 335) {
y = -y;
}
// Left Side
if (ball.center.x >= 278 && ball.center.y >= 328 && ball.center.y <= 369) {
x = -x;
}
// Bottom left corner (image)
// Top Side
if (ball.center.x >= 12 && ball.center.x <= 42 && ball.center.y >= 327 &&
ball.center.y <=329) {
y = -y;
}
// Right Side
if (ball.center.x <= 42 && ball.center.y >=328 && ball.center.y <= 358) {
x = -x;
}
// Top right corner (image)
// Bottom Side
if (ball.center.x <= 319 && ball.center.x >= 289 && ball.center.y <= 42 &&
ball.center.y >= 32) {
y = -y;
}
// Left Side
if (ball.center.x >= 278 && ball.center.y >= 11 && ball.center.y <= 41) {
x = -x;
}
// Top Left Corner (Image)
// Bottom Side
if (ball.center.x >= 12 && ball.center.x <= 42 && ball.center.y <= 43 &&
ball.center.y >= 41) {
y = -y;
}
// Right Side
if (ball.center.x <= 42 && ball.center.y <= 41 && ball.center.y >= 11) {
x = -x;
}
}
非常感谢任何帮助!
答案 0 :(得分:0)
如果我正确想象这个,你只想在它击中桨的“前部”时偏转?从概念上讲,我会尝试使用零大小的rect并在其周围添加其他rects,这样你就可以更精确地了解rect的哪个“side”。或者你也可以创建另一个矩形,它是你想要“活动”的桨的部分的“轮廓”。这样的事可能......
CGRect paddleRect = CGRectMake(Computer---.frame.origin.x, Computer---.frame.origin.y, Computer---.frame.size.width, Computer---.frame.size.height / 2);
这会给你一个与原始矩形完全相同的矩形。