0

ここでの私の問題は、CGRectIntersects (rect,rect) を使用すると、使用しているボールがパドルの内側になり、永遠に動かなくなることです。これは、コンピューターのパドルでよく発生しますが、プレーヤーのパドルではめったに発生しません。

このすべての目的は、パドルがどのヒットボックスに当たるかに応じて、「Y 軸」または「X 軸」でパドルのボールの方向を逆にすることです。

これを修正するために試したすべての方法を投稿します(特に良い結果はありませんでした)。これを修正しようとした最初の方法 (コメントされていない部分) は、「ヒット ボックス」を使用することです。上/下と右/左を表すために、各パドルに 3 つの空の UIImageView を配置しました。「ヒット ボックス」は、実際にはさまざまな UIImageView の CGRectIntersect にすぎません。これが今までで一番効果がありました。

また、ボールを反射するために「見えないバリア」を使用しようとしました。「//インビジブルバリア工法」でコメントアウトした部分です。これらは問題なく機能し、ボールが動かなくなることもありましたが、パドルの側面や角に正しく当てることができませんでした。

元は CGRectIntersects メソッドでした。これはボールを受け取り、それをうまく反射します (高速になるまで) が、パドルの後端にボールが当たった場合にもボールを反射します。これは私がやりたくないことです。

画像が載せられないので、ゲーム画面で説明します。ボールをそらす 4 つのコーナー ブロック (コーナーごとに 1 つ) があります。4 つのパドル、2 つのプレーヤー用パドル、2 つのコンピューター用パドルがあります。コンピューターのパドルは画面の上部と左側を占め、プレーヤーのパドルは画面の下部と右側を占めます。各パドルは、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;
}
}

どんな助けでも大歓迎です!

4

1 に答える 1

0

これを正しく視覚化している場合、パドルの「前面」に当たった場合にのみ偏向したいですか? 概念的には、サイズがゼロの四角形を使用して、その周りに他の四角形を追加して、四角形のどちらの「側」がヒットするかをより細かく指定できるようにします。または、「アクティブ」にしたいパドルのセクションの「アウトライン」である別の四角形を作成することもできます。このようなものかもしれません...

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

これにより、元の四角形のちょうど半分に接する四角形が得られます。

于 2013-09-25T04:42:52.657 に答える