user1213042
user1213042

Reputation:

For loop variable always evaluating to true

Annoying newbie problem here. This variable isPlayerTouchingAnotherPlayer is being set to true as soon as I touch the piece. I'm almost positive I know why but I can't find a way to display this in log to confirm. I could probably do it by setting different flag numbers for each of the objects but I was hoping there is another way.

The problem is that piece is an object that is also located in p1Array so as soon as I touch it it hits itself and isPlayerTouchingAnotherPlayer is evaluated to true.

Is there a way I could print out the view or image name of the objects touching somehow to confirm this? And furthermore, is there a way to somehow avoid this annoying conflict.

for (int i = 0; i <[p1Array count]; i++) {
    UIImageView *tempP1;
    tempP1 =[p1Array objectAtIndex:i];

    if (CGRectIntersectsRect(piece.frame, tempP1.frame)) {
        NSLog(@"selected piece: %@, touched piece: %@ ", piece, tempP1);
        isPlayerTouchingAnotherPlayer = TRUE;
    }
}

Upvotes: 1

Views: 92

Answers (4)

SteAp
SteAp

Reputation: 11999

Furthermore, you would like to write this:

for ( int i = 0; 
     (  ( i < [p1Array count] ) 
     && ( ! isPlayerTouchingAnotherPlayer )
     ); 
     i++
    ) {
 ...
}

Upvotes: 0

Johnmph
Johnmph

Reputation: 3391

Simply

NSLog(@"%@ %@", piece, tempP1);

or

NSLog(@"%ld %ld", (NSInteger) piece, (NSInteger) tempP1);

The first will show you the description of the object, the second the address in memory, if it's same address, it's the same object.

You can simply check if it's the same object (pointer) with a simple equal check to exclude the same object :

if (piece != tempP1) {
   if (CGRectIntersectsRect(piece.frame, tempP1.frame)) {
    ...
}

Upvotes: 0

Tark
Tark

Reputation: 5173

why not use fast enumeration and skip the image view you are not interested in checking.

for (UIImageView *imageView in p1Array) {
    if (imageView == piece)
        continue;

    if (CGRectIntersectsRect(imageView.frame, piece.frame)) {
       // do whatever
    }
}

it seems like you are already printing out the names of the objects touching in the code sample you have provided. if you want to print out specific properties of the objects you can do that to.

Upvotes: 1

Caleb
Caleb

Reputation: 124997

as soon as i touch it it hits itself and isPlayerTouchingAnotherPlayer is evaluated to true.

Then you should get a log message that shows the same object for the selected piece and the touched piece. If that's what's happening, then just add a condition to your if to prevent it:

if (piece != tempP1 && CGRectIntersectsRect(piece.frame, tempP1.frame)) {

Upvotes: 0

Related Questions