Animation 如何使两个动画图像视图发生碰撞?

Animation 如何使两个动画图像视图发生碰撞?,animation,collision-detection,Animation,Collision Detection,我有一种方法,可以分配一个子弹,并在每次按下空格键时将其从宇宙飞船的前部移动到屏幕的顶部 同时,我在NSImageViews中有小行星,它们使用NSTimer on repeat从屏幕顶部到屏幕底部进行动画制作。 在另一个计时器重复访问的碰撞检测方法中,我将两个图像视图放置到边界圆中,并使用圆相交方法检查碰撞。 问题是子弹/小行星通常不会相交。只有当我的宇宙飞船与屏幕上出现的小行星对齐时,它才起作用。我不能只是控制火势,到处喷射子弹来摧毁小行星,即使它们明显相交 有人能解决这个问题吗 我的导弹-

我有一种方法,可以分配一个子弹,并在每次按下空格键时将其从宇宙飞船的前部移动到屏幕的顶部 同时,我在NSImageViews中有小行星,它们使用NSTimer on repeat从屏幕顶部到屏幕底部进行动画制作。
在另一个计时器重复访问的碰撞检测方法中,我将两个图像视图放置到边界圆中,并使用圆相交方法检查碰撞。
问题是子弹/小行星通常不会相交。只有当我的宇宙飞船与屏幕上出现的小行星对齐时,它才起作用。我不能只是控制火势,到处喷射子弹来摧毁小行星,即使它们明显相交

有人能解决这个问题吗

我的导弹-小行星碰撞检测方法经常被NSTimer访问:

   // Missile - White Asteroid collision.
  if (CGRectIntersectsRect(_missile.frame, _asteroid.frame)) {

   // set bounding bullet circle.
    _missileCircle.centerX = _missile.frame.origin.x + _missile.frame.size.width / 2;
    _missileCircle.centerY = _missile.frame.origin.y + _missile.frame.size.height / 2;
    _missileCircle.radius = _missile.frame.size.height / 2;

   // Set bounding asteroid circle
     _astCircle.centerX = _asteroid.frame.origin.x +_asteroid.frame.size.width / 2;
     _astCircle.centerY = _asteroid.frame.origin.y +_asteroid.frame.size.height / 2;
    _astCircle.radius = _asteroid.frame.size.height / 2 - 10;


    if ([self Circle: _astCircle intersectsCircle: _missileCircle]) {
        NSLog(@"Missile intersection");
        [_missile removeFromSuperview];
        [_asteroid removeFromSuperview];

    }
}
这是我用空格键激活的导弹动画方法:

-(void) animateMissile
{

_missile = [[NSImageView alloc]init];
[_missile setImage:[NSImage imageNamed:@"Brown-Bullet"]];
[_missile setFrame: CGRectMake(_spaceship.frame.origin.x + 21, _spaceship.frame.origin.y + 40, 10, 15)];

[self addSubview:_missile];

[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
    context.duration = 1.5;

    [context setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]];
    _missile.animator.frame = CGRectOffset(_missile.frame, 0, self.bounds.size.height+12);
} completionHandler:nil];

}
使用NSTimer激活的小行星动画方法:

-(void) animateDarkAst:(NSTimer *) timer

{
int randX = arc4random_uniform(self.bounds.size.width);

int randSize = 40 + arc4random() % (120-40+1);

double speed = [self randomDoubleBetween:1.0 and: 2.0];

CGPoint start = CGPointMake(randX, self.bounds.size.height);


[_asteroidDark setFrame:CGRectMake(start.x, start.y, randSize, randSize)];

[self addSubview:_asteroidDark];

[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
    context.duration = speed;

    [context setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]];
    _asteroidDark.animator.frame = CGRectOffset(_asteroidDark.frame, 0, -self.bounds.size.height * 2);
} completionHandler:nil];
}
使用!这正是它设计的目的,并且具有支持的接口和语义。你可以用它来写你的整个游戏。它将具有您所需的响应能力和严密性和完整性,您几乎不可能希望在应用程序中实现,或者只能通过如此多的努力、大量的代码和对轮子的重新改造来实现

试试看。你会喜欢的!我敢打赌,您可以将代码缩减到其大小和复杂性的一小部分,并且可以轻松地完成更多的工作

您可以将图像加载到SKSpriteNode中,然后将其四处移动,检测碰撞等各种情况