2013-11-27 1 views
0

Я практикую с комплектом спрайтов в iOS 7.Как я могу прекратить ходить по человеку, если есть стена в комплекте Sprite?

Теперь у меня проблема, когда человек идет от одной точки к другой точке с помощью SKAction moveTo.
Если на экране есть какая-либо стена, я хочу прекратить ходить перед стеной.

Я использовал код в skscen.h файл, как показано ниже:

typedef NS_ENUM(uint32_t, CollisionType) 
{ 
    CollisionTypePlayer  = 0x1 << 0, 
    CollisionTypeWall  = 0x1 << 1, 
    CollisionTypeRiver  = 0x1 << 3, 
    CollisionTypeBush  = 0x1 << 4 
}; 

#import <SpriteKit/SpriteKit.h> 

@interface THMyScene : SKScene <SKPhysicsContactDelegate> 

@property (nonatomic) SKSpriteNode *manContainer; 

//Wall sprite 
@property (nonatomic) SKSpriteNode *wallNode1; 

@end 

и в файле scene.m приведены ниже:

#import "THMyScene.h" 

@interface THMyScene() 

@property (nonatomic) SKTextureAtlas *manAtlas; 
@property (nonatomic) NSMutableArray *manImagesArray; 

@end 

@implementation THMyScene 

-(id)initWithSize:(CGSize)size { 
    if (self = [super initWithSize:size]) { 
     /* Setup your scene here */ 

     // Configure physics for the world. 
     self.physicsWorld.gravity = CGVectorMake(0.0f, 0.0f); // no gravity 
     self.physicsWorld.contactDelegate = self; 

     [self createWall]; 
     [self createMan]; 
    } 
    return self; 
} 

-(void) createMan 
{ 
    _manAtlas = [SKTextureAtlas atlasNamed:@"secondLevelMan"]; 
    _manImagesArray = [[NSMutableArray alloc]init]; 
    for(int i = 1; i <= _manAtlas.textureNames.count ; i++) 
    { 
     NSString *imageName = [NSString stringWithFormat:@"man%d.png",i]; 
     SKTexture *tmpTexture = [SKTexture textureWithImageNamed:imageName]; 
     [_manImagesArray addObject:tmpTexture]; 
    } 
    _manContainer = [SKSpriteNode spriteNodeWithTexture:[_manImagesArray objectAtIndex:0]]; 
    _manContainer.position = CGPointMake(50, 250); 
    [self addChild:_manContainer]; 

    _manContainer.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:_manContainer.size]; 
    _manContainer.physicsBody.allowsRotation = YES; 
    _manContainer.physicsBody.dynamic = YES; 
    _manContainer.physicsBody.usesPreciseCollisionDetection = YES; 
    _manContainer.physicsBody.categoryBitMask = CollisionTypePlayer; 
    _manContainer.physicsBody.contactTestBitMask = CollisionTypeWall; 
    _manContainer.physicsBody.collisionBitMask = CollisionTypeRiver; 
} 

-(void) createWall 
{ 
    //Create wall 1 
    _wallNode1 = [SKSpriteNode spriteNodeWithImageNamed:@"rock-1"]; 
    _wallNode1.name = @"stonewall"; 
    _wallNode1.position = CGPointMake(400 , 700); 
    [self addChild:_wallNode1]; 

    _wallNode1.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:_wallNode1.size]; 
    _wallNode1.physicsBody.dynamic = NO; 
    _wallNode1.physicsBody.categoryBitMask = CollisionTypeWall; 
    _wallNode1.physicsBody.contactTestBitMask = 0; 
    _wallNode1.physicsBody.collisionBitMask = CollisionTypePlayer; 
} 

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [touches anyObject]; 
    CGPoint locationTouch = [touch locationInNode:self]; 
    CGPoint manLocation = _manContainer.position; 
    CGFloat rotatingAngle = [self pointPairToBearingDegrees:manLocation secondPoint:locationTouch]; 
    CGFloat distance = [self distanceBetweenTwoPoints:manLocation andSecondpoint:locationTouch]; 
    SKAction *animationAction = [SKAction repeatActionForever:[SKAction animateWithTextures:_manImagesArray timePerFrame: 0.0833]]; 
    float duration = distance/300; 
    SKAction *movePoint = [SKAction moveTo:locationTouch duration:duration]; 
    SKAction *rotate = [SKAction rotateToAngle:rotatingAngle duration:0.0f]; 
    SKAction *sequenceAction = [SKAction sequence:@[rotate, movePoint]]; 
    [_manContainer runAction:[SKAction group:@[sequenceAction, animationAction]] withKey:@"runAnimation"]; 
} 

- (CGFloat) pointPairToBearingDegrees:(CGPoint)startingPoint secondPoint:(CGPoint) endingPoint 
{ 
    CGPoint originPoint = CGPointMake(endingPoint.x - startingPoint.x, endingPoint.y - startingPoint.y); // get origin point to origin by subtracting end from start 
    float bearingRadians = atan2f(originPoint.y, originPoint.x); // get bearing in radians 
    return bearingRadians; 
} 

-(CGFloat)distanceBetweenTwoPoints:(CGPoint)firstPoint andSecondpoint:(CGPoint)secondPoint 
{ 
    CGFloat dx = secondPoint.x - firstPoint.x; 
    CGFloat dy = secondPoint.y - firstPoint.y; 
    return sqrt(dx*dx + dy*dy); 
} 

- (void) didBeginContact:(SKPhysicsContact *)contact 
{ 
    SKPhysicsBody *firstBody, *secondBody; 

    if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask) 
    { 
     firstBody = contact.bodyA; 
     secondBody = contact.bodyB; 
    } 
    else 
    { 
     firstBody = contact.bodyB; 
     secondBody = contact.bodyA; 
    } 
} 

@end 
+1

при использовании физики не используют двигаться действиями, вместо того, чтобы изменить скорость тела или применить силы – LearnCocos2D

+0

так, где я могу изменить мой кода в приведенном выше примере? –

ответ

0

попробовать что-то вроде этого:

-(void)update:(CFTimeInterval)currentTime { 

int distance = 10; // distance to wall when to stop 

if ((man.position.x > wall.position.x + wall.size.width/2 + distance) && 
    (man.position.x < wall.position.x - wall.size.width/2 - distance) 

if ((man.position.y > wall.position.y + wall.size.height/2 + distance) && 
    (man.position.y < wall.position.y - wall.size.height/2 - distance) 

//do what you want like remove some or all actions of man 


} } 
0

// изменить ваш код это будет работать

- (void) didBeginContact:(SKPhysicsContact *)contact 
{ 
     SKPhysicsBody *firstBody, *secondBody; 

    if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask) 
     { 
      firstBody = contact.bodyA; 
      secondBody = contact.bodyB; 

      [firstBody.node removeAllActions]; 
     firstBody.node.speed=0; 

    } 
else 
{ 
    firstBody = contact.bodyB; 
    secondBody = contact.bodyA; 
    [secondBody.node removeAllActions]; 
    secondBody.node.speed=0; 
} 

} // помнить каждый узел в spritekit имеет скорость свойства, контролировать скорость анимации спрайтов

 Смежные вопросы

  • Нет связанных вопросов^_^