Разработка игр для iPhone, обнаружение столкновений, создающее эффект стены

Хорошо, я пробовал это в прошлый раз, и это было слишком расплывчато, поэтому я попробую еще раз. Я делаю игру для iPhone с видом сверху вниз, есть mainSprite (UIImageView), который будет сталкиваться с другим UIImageView. Когда это произойдет, я хочу, чтобы mainSprite перестал двигаться. В основном создание стены. Имеет ли это смысл? Я не использую никаких фреймворков, таких как cocos2d. Я знаю метод CGRectIntersectWithRect, мой вопрос в том, что мне нужно добавить в этот метод. У меня нет никаких других переменных, таких как скорость или скорость, только кнопки, которые будут перемещать спрайт по экрану. Вот мой код.

Это код .m, используемый для перемещения спрайта по экрану.

-(void)goDown{
mainSprite.center = CGPointMake(mainSprite.center.x, mainSprite.center.y+5);
}

-(IBAction)down{
    [self downAnimation];
    goDown = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(goDown) userInfo:nil repeats:YES];
    if (goDown == nil) {
        goUp = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(goDown) userInfo:nil repeats:YES];

    }
}

Вот метод, который я установил для столкновения:

-(void)collision {
    if (CGRectIntersectsRect(mainSprite.frame, collisionImage.frame)) {

    }
}

Помощь будет принята с благодарностью.


person Will Youmans    schedule 05.11.2011    source источник


Ответы (1)


Что вы могли бы сделать, так это добавить логическое значение, если объект столкнулся или нет (я бы предложил в качестве переменной экземпляра)

При этом вы можете установить его в YES, когда прямоугольники пересеклись

в вашем методе goDown вы должны проверить логическое значение, если логическое значение равно YES, то не меняйте центр, иначе продолжайте его изменять

Каждый раз, когда вызывается -goDown, добавьте проверку на столкновение

Таким образом, если он столкнулся, вы можете фактически деактивировать этот таймер, чтобы он больше не срабатывал, или вы можете сделать это логическим способом, который я упоминал выше.

Я предлагаю создать метод, который проверяет наличие столкновения с одним аргументом текущего центра, чтобы вы могли проверить, приведет ли добавление 5 к y центра к его столкновению, чтобы вы могли деактивировать таймер/остановить добавление 5 сразу, как он сталкивается а не сразу после

- (void)goDown {
   float delta = [self checkCollision];
   mainSprite.center = CGPointMake(mainSprite.center.x, mainSprite.center.y + delta);
}

- (float)checkCollision {
   CGRect testFrame = CGRectMake(mainSprite.frame.origin.x, mainSprite.frame.origin.y + 5.0f, mainSprite.frame.size.width, mainSprite.frame.size.height);
   if (CGRectIntersectsRect(testFrame, collisionImage.frame)) {
       return 0.0f;
       // stop the sprite from moving anymore so it doesn't actually intersect, just stops "on top"
    }
    return 5.0f;
    // if they have not collided then just continue on your way

пример кода на самом деле не показывает ни один из моих методов выше

что я здесь делаю, так это проверяю столкновение, и если будет столкновение, то прекращаю добавлять что-либо к центру, иначе он продолжит добавлять к центральной координате

person DanZimm    schedule 05.11.2011
comment
Это имеет смысл, но не могли бы вы сказать мне, как сбросить положение mainSprite вне другого UIImageView? - person Will Youmans; 05.11.2011
comment
что вы подразумеваете под другим? - person DanZimm; 05.11.2011
comment
Например, когда mainSprite сталкивается с UIImageView, какой код мне нужно написать, чтобы mainSprite не попадал в UIImageView, создавая эффект стены? - person Will Youmans; 05.11.2011
comment
О, я понимаю! Проверьте основной пост! - person DanZimm; 05.11.2011
comment
Хорошо, это получило эффект невозможности спуститься. Но теперь спрайт не может никуда спуститься на экране. Как я могу сделать так, чтобы это происходило только тогда, когда оно попадает в столкновениеImage? - person Will Youmans; 05.11.2011
comment
Выключайте кадры каждого из объектов каждый раз, когда вызывается goDown. Я не уверен, почему все вместе перестанет двигаться вниз, если они не пересекаются.... - person DanZimm; 05.11.2011
comment
Это дает мне ошибку Инициализация 'float' с выражением несовместимого типа 'void', а значение Void не игнорируется, как должно быть - person Will Youmans; 05.11.2011
comment
float delta = [self checkCollision]; - person Will Youmans; 05.11.2011
comment
Возможно, я что-то не так делаю, потому что в основном я просто добавил код, который вы там написали. Есть ли что-то еще, что мне нужно добавить? - person Will Youmans; 05.11.2011
comment
Хорошо, измените класс void ret, чтобы он плавал при checkCollision, это было плохо, извините - person DanZimm; 05.11.2011
comment
не имеет значения, предполагается, что он вернет void, а не float, просто скопируйте код в :D - person DanZimm; 05.11.2011
comment
О, больше не пойму. Как вы думаете, вы могли бы дать мне свой адрес электронной почты, и я мог бы отправить вам проект Xcode, чтобы вы могли увидеть проблемы для себя? - person Will Youmans; 05.11.2011