ios - CGRectIntersects ball collision issue (it 'eats' the ball) -


my issue here when use cgrectintersects (rect,rect) ball i'm using ends inside of paddle, being eternally stuck. happens computer paddles, , player paddles.

the objective of have paddle reverse ball direction on "y-axis" or "x-axis" depending on hit box hits on paddle.

i post methods have tried fixing (none had particularly result). first method tried fix (uncommented parts) using 'hit boxes'. put 3 empty uiimageviews onto each paddle represent top/bottom, , right/left. 'hit boxes' cgrectintersects on different uiimageviews. has been effective far.

i have tried use "invisible barriers" reflect ball. these commented out parts under "// invisible barrier method". these worked okay, ball got stuck sometimes, couldn't hit sides / corner of paddle correctly.

the original cgrectintersects method. take ball , reflect fine (until @ high-speeds) reflect ball if hit ends of paddle. don't want do.

since can't post images, i'll describe game view. have 4 corner blocks deflect ball (one per corner). there 4 paddles, 2 player paddles , 2 computer paddles. computer paddles take top , left sides of screen, while player paddles take bottom , right of screen. each paddle rectangle 66x20 (horizontal paddles) , 20x66 (vertical paddles). ball 24x24 , corners each 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; } } 

any appreciated!

if i'm visualizing correctly want deflect if hits "front" of paddle? conceptually try using 0 size rect , add other rects around can more granular "side" of rect hit. or create rect "outline" of section of paddle want "active". maybe...

cgrect paddlerect = cgrectmake(computer---.frame.origin.x, computer---.frame.origin.y, computer---.frame.size.width, computer---.frame.size.height / 2); 

that give rect borders half of original rect.


Comments

Popular posts from this blog

c# - How Configure Devart dotConnect for SQLite Code First? -

java - Copying object fields -

c++ - Clear the memory after returning a vector in a function -