Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/95.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios “如何拥有我的性格”;骑乘;还有移动平台?_Ios_Objective C_Sprite Kit - Fatal编程技术网

Ios “如何拥有我的性格”;骑乘;还有移动平台?

Ios “如何拥有我的性格”;骑乘;还有移动平台?,ios,objective-c,sprite-kit,Ios,Objective C,Sprite Kit,我的英雄角色遇到了一个问题,当他降落在一个移动的平台上,而不是跟着它移动时,他实际上是站在同一个X位置上,直到平台移到屏幕外。我找了很多答案,但都没有找到 这是我的英雄角色和移动平台的方法 -(void)HeroAdd { _Hero = [SKSpriteNode spriteNodeWithImageNamed:@"Hero-1"]; _Hero.name = @"Daniel"; _Hero.physicsBody = [SKPhysicsBody body

我的英雄角色遇到了一个问题,当他降落在一个移动的平台上,而不是跟着它移动时,他实际上是站在同一个X位置上,直到平台移到屏幕外。我找了很多答案,但都没有找到

这是我的英雄角色和移动平台的方法

-(void)HeroAdd
{    
    _Hero = [SKSpriteNode spriteNodeWithImageNamed:@"Hero-1"];
    _Hero.name = @"Daniel";
    _Hero.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:_Hero.size];
    _Hero.physicsBody.categoryBitMask = fPlayerCategory;
    _Hero.physicsBody.contactTestBitMask = fPlatformCategory | fEnemyCategory;
    _Hero.physicsBody.usesPreciseCollisionDetection = YES;
    _Hero.physicsBody.affectedByGravity = YES;
    _Hero.physicsBody.dynamic = YES;
    _Hero.physicsBody.friction = .9;
    _Hero.physicsBody.restitution = 0;
    _Hero.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
    _Hero.position = CGPointMake(_Hero.position.x - 252, _Hero.position.y + 50);

    if (self.size.width == 480) {
        _Hero.position = CGPointMake(_Hero.position.x + 44, _Hero.position.y);
    }

    [self addChild:_Hero];
}
我的移动平台代码

-(void)createPlatform {

    SKTexture *objectTexture;

    switch (arc4random_uniform(2)) {
        case (0):
            objectTexture = [SKTexture textureWithImageNamed:@"shortPlatform"];
            break;
        case (1):
            objectTexture = [SKTexture textureWithImageNamed:@"highPlatform"];
        default:
            break;
    }

    SKSpriteNode *variaPlatform = [SKSpriteNode spriteNodeWithTexture:objectTexture];
    variaPlatform.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
    variaPlatform.position = CGPointMake(variaPlatform.position.x + 500, variaPlatform.position.y - 140);
    variaPlatform.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:variaPlatform.size];
    variaPlatform.physicsBody.usesPreciseCollisionDetection = YES;
    variaPlatform.physicsBody.categoryBitMask = fPlatformCategory;
    variaPlatform.physicsBody.contactTestBitMask = fPlatformCategory |fPlayerCategory | fEnemyCategory;
    variaPlatform.physicsBody.dynamic = NO;
    variaPlatform.physicsBody.affectedByGravity = NO;

    SKAction *moveLeft = [SKAction moveTo:CGPointMake(180, variaPlatform.position.y) duration:3];
    SKAction *moveDown = [SKAction moveTo:CGPointMake(180, -700) duration:4];
    SKAction *removeFromParent = [SKAction removeFromParent];

    SKAction *AllThree = [SKAction sequence:@[moveLeft, moveDown, removeFromParent]];

    [self addChild:variaPlatform];

    [variaPlatform runAction:AllThree];

}

任何类型的信息都会得到真正的感谢。

我在游戏中添加传送带时遇到了同样的问题。精灵套件不会拖动对象,无论添加了多少阻力。您当前有两个选项

选项1-在平台的每一端添加一个壁架。这是最容易实现的,但不太优雅,如果玩家降落在壁架上,仍然允许他滑下

选择2-

步骤1:添加代码,使玩家与水平移动平台同步移动。您可以使用类似于self.physicsBody.velocity=CGVectorMake(-50,self.physicsBody.velocity.dy)的东西或使用
self.position=CGPointMake(self.position.x+10,self.position.y)。您将不得不使用x值来将其与平台的速度同步

第2步:当玩家与平台接触时激活上述代码,当失去联系时停用

步骤3:如果平台切换方向,设置左右限位,当平台切换方向时,通过触点通知您。根据平台的方向,您可以将+x或-x移动值应用于播放器

我知道这个选项听起来很复杂,但事实并非如此。你只需要一步一步地走

*编辑以提供示例代码*

这就是我在水平移动平台背后的逻辑:

平台 如果您有多个水平移动平台,则需要将它们存储在游戏场景(我的关卡)中的阵列中。我已经为他们创建了自己的类,但您不必这样做

您必须设置左右限制(带有联系人的不可见SKNodes)才能为平台设置BOOL属性,该属性告诉玩家类推送的方式,因为每个平台的长度可能不同。这就是为什么需要保留对每个平台(因此是阵列)的引用

玩家 当玩家在平台上跳跃时,将玩家类属性BOOL设置为TRUE,根据平台当前移动的方式激活持续的左推或右推。另一方面,失去接触会取消推送

// This code in my "Levels class" which is the default GameScene class.
- (void)didBeginContact:(SKPhysicsContact *)contact
{
    uint32_t collision = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask);

    if (collision == (CategoryPlatformHorizontal | CategoryPlayer))
    {
        [_player setPlatformHorizontalContact:true];

        for(Platform *platformObject in platformArray)
        {
            if(([platformObject.name isEqualToString:contact.bodyB.node.name]) || ([platformObject.name isEqualToString:contact.bodyA.node.name]))
            {
                _player.currentPlatform = platformObject;
            }
        }
    }
}

- (void)didEndContact:(SKPhysicsContact *)contact
{
    uint32_t collision = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask);

    if (collision == (CategoryPlatformHorizontal | CategoryPlayer))
    {
        [_player setPlatformHorizontalContact:false];
    }
}

// This code is in Player.h
@property (strong) Platform *currentPlatform;
@property BOOL platformHorizontalContact;

// This code is in Player.m
- (void)update:(NSTimeInterval)currentTime
{
    if(self.platformHorizontalContact == true)
    {
        if(self.currentPlatform.movingLeft == true)
        {
            self.physicsBody.velocity = CGVectorMake(-75, self.physicsBody.velocity.dy); // set your own value depending on your platform speed
        } else {
            self.physicsBody.velocity = CGVectorMake(75, self.physicsBody.velocity.dy); // set your own value depending on your platform speed
        }
    }
}

HeroAdd
方法中,什么是
self
?(例如,哪个类实现了该方法?)给平台增加摩擦。据我所见,你的英雄被分配了高摩擦。@PhillipMills我在SKScene的界面部分的大多数精灵工具包项目的常规布局上实现了一个属性。@meisenman很遗憾,这不起作用。谢谢你,这个问题非常令人恼火。@sagony我可以问一下你使用了哪种选项吗?因为当我尝试在我的英雄角色上使用CGPointMake选项时,什么都没有发生,我在我的skphysiccontact上键入了代码,并且我知道由于NSLog,它工作正常。你能给我看一些你用在传送带上的示例代码吗?它将证明对我有用。谢谢。@Blank-我使用了选项2,因为我最终也使用了水平移动平台。我不能发布所有与此相关的代码,因为它太多了,但是如果你告诉我你需要帮助的具体部分,我可以发布一些示例代码。@sagony谢谢你,所以在我的'didBeginContact'方法中,我创建了一个'if'语句,如果我的playerCategory和platformCategory都联系过,它将移动我的英雄角色的位置,并显示一条NSLog消息确认它,如“\u Hero.position=CGPointMake(\u Hero.position.x-20,\u Hero.position.y);”然而,无论英雄何时接触,都看不到任何动作。我做错什么了吗?如果我真的理解这个概念,我会试试velocity。@sagony非常感谢!正是我需要的