Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/108.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios CGRects相交球碰撞问题(它吃球)_Ios_Objective C - Fatal编程技术网

Ios CGRects相交球碰撞问题(它吃球)

Ios CGRects相交球碰撞问题(它吃球),ios,objective-c,Ios,Objective C,我这里的问题是,当我使用CGRectIntersects(rect,rect)时,我正在使用的球结束于桨内,永远被卡住。这种情况经常发生在电脑拨片上,很少发生在播放器拨片上 所有这一切的目的是让球拍在“Y轴”或“X轴”上反转球的方向,这取决于它击中哪个球拍的击球框 我将发布我尝试过的所有修复方法(没有一种效果特别好)。 我试图解决这个问题的第一个方法(未注释的部分)是使用“点击框”。我在每个桨上放了三个空的UIImageView来代表顶部/底部和右侧/左侧。“点击框”实际上只是不同UIImage

我这里的问题是,当我使用CGRectIntersects(rect,rect)时,我正在使用的球结束于桨内,永远被卡住。这种情况经常发生在电脑拨片上,很少发生在播放器拨片上

所有这一切的目的是让球拍在“Y轴”或“X轴”上反转球的方向,这取决于它击中哪个球拍的击球框

我将发布我尝试过的所有修复方法(没有一种效果特别好)。 我试图解决这个问题的第一个方法(未注释的部分)是使用“点击框”。我在每个桨上放了三个空的UIImageView来代表顶部/底部和右侧/左侧。“点击框”实际上只是不同UIImageView上的CGRectIntersects。这是迄今为止最有效的一次

我也试着用“看不见的障碍物”来反射球。这些是“//不可见屏障法”下注释掉的部分。这些都很好,球有时会卡住,但我无法让它正确地击中球拍的边/角

最初的方法是CGRectIntersects方法。这将使球反射良好(直到高速),但如果球撞到了桨的后端,它也会反射球。这是我不想让它做的事

由于我不能发布图片,我将描述游戏视图。你有四个角球挡块可以使球偏转(每个角球一个)。有四个桨,两个球员桨和两个电脑桨。电脑拨片占据屏幕的顶部和左侧,而播放器拨片占据屏幕的底部和右侧。每个桨叶是一个矩形,分别为66x20(水平桨叶)和20x66(垂直桨叶)。球为24x24,角为30x30

游戏

-(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;
}
}
-(无效)冲突{
/*如果(ball.center.x-12>=Player.center.x-35&&ball.center.x+12=Player.center.y-10&&ball.center.y+12
=playervt.center.x-10&&

ball.center.x+12=Computer.center.x-33&&ball.center.x+12=Computer.center.x-33&&ball.center.x+12如果我正确地将其可视化,你只想在它撞到桨的“前部”时偏转?概念上,我会尝试使用一个零尺寸的矩形,并在其周围添加其他矩形,这样你就可以更精确地判断哪一侧或者你也可以创建另一个矩形,它是你想要“激活”的桨叶部分的“轮廓”。类似这样的东西可能

CGRect paddleRect = CGRectMake(Computer---.frame.origin.x, Computer---.frame.origin.y, Computer---.frame.size.width, Computer---.frame.size.height / 2);
这将为您提供一个矩形,其边界正好是原始矩形的一半