gpt4 book ai didi

ios - 如何让我的角色 "ride"与移动平台一起移动?

转载 作者:可可西里 更新时间:2023-11-01 04:38:50 26 4
gpt4 key购买 nike

我的英雄角色遇到了一个问题,当他降落在一个移动的平台上时,他并没有跟着它一起移动,而是站在同一个 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];

}

任何类型的信息都将不胜感激。

最佳答案

我在游戏中添加传送带时遇到了同样的问题。无论增加多少阻力,Sprite Kit 都不会拖动物体。您目前有 2 个选择。

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

enter image description here

选项 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 移动值。

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

* 编辑以提供示例代码 *

这是水平移​​动平台背后的逻辑:

平台如果您有超过 1 个水平移动平台,则需要将它们存储在 GameScene(我的关卡)中的数组中。我已经为他们创建了自己的类(class),但您不必这样做。

您必须设置左右限制(带触点的不可见 SKNode)来为平台设置 BOOL 属性,该属性告诉播放器类以哪种方式插入,因为每个平台的长度可能不同。这就是为什么您需要保留对每个平台的引用(因此是数组)。

玩家当玩家在平台上跳跃时,将 Player 类属性 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
}
}
}

关于ios - 如何让我的角色 "ride"与移动平台一起移动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24995219/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com