2013-09-24 75 views
0

我在這裏的問題是,當我使用CGRectIntersects(矩形,矩形),我使用的球最終在槳內,被永久卡住。這種情況通常發生在電腦撥片上,很少發生在播放器撥片上。CGRectIntersects球碰撞問題(它'吃'球)

所有這些的目的是讓槳在「Y軸」或「X軸」上反轉球的方向,具體取決於它在哪個槳上擊中哪個擊中框。

我會發布所有我嘗試過的修復方法(沒有一個特別好的結果)。 我試圖解決這個問題的第一種方法(未註釋部分)是使用'hit box'。我將三個空的UIImageView放到每個槳上以表示頂部/底部和右/左。 'hit box'實際上就是不同UIImageView上的CGRectIntersects。迄今爲止,這是最有效的。

我也試圖用「無形障礙」來反射球。這些是「//隱形屏障方法」下的註釋部分。這些工作正常,球有時卡住,但我無法正確地擊中槳的側面/角落。

原來是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; 
} 
} 

任何幫助,不勝感激!

回答

1

如果我正確顯示了這一點,那麼只有當它碰到槳的「前部」時纔會偏轉。從概念上講,我會嘗試使用零大小的矩形,並在其周圍添加其他矩形,以便您可以更細緻地瞭解矩形的哪個「邊」。或者您也可以創建另一個矩形,該矩形是您希望「激活」的槳板部分的「輪廓」。這樣的事情也許...

CGRect paddleRect = CGRectMake(Computer---.frame.origin.x, Computer---.frame.origin.y, Computer---.frame.size.width, Computer---.frame.size.height/2); 

那會給你一個矩形,邊界完全是原矩形的一半。