gpt4 book ai didi

ios - Sprite-kit:运动过程中位移的物理体

转载 作者:行者123 更新时间:2023-11-29 00:29:32 25 4
gpt4 key购买 nike

Sprite 有一个物理 body 。当 Sprite 向任何方向移动时,物理体都会向该方向移动(参见附图)。这不利于接触和碰撞。

物理体仅在运动过程中发生位移。当 Sprite 静止时,物理体不会发生位移。

我的问题:为什么在 sprite kit 中物理体会在移动方向上发生位移?有什么办法可以预防吗?

非常感谢

编辑:

好的..我写了一个小测试来演示这个问题。我只有一个具有不受重力影响的物理体的节点。物理世界也没有引力。通过触摸屏幕,英雄向上移动。如果您请测试代码,请设置 SKView showsPhysics 属性 = YES。通过触摸,观察物理体如何从正确的位置移动。然后它在运动的所有时间都在运动方向上位移。

感谢您的任何建议。

// header file

#import <SpriteKit/SpriteKit.h>

@interface TestScene : SKScene <SKPhysicsContactDelegate>

@end


// implementation file


#import "TestScene.h"

@implementation TestScene
{
SKNode *_world;
SKSpriteNode *_hero;

BOOL _play;
BOOL _touch;
CGFloat _startY;
}

- (instancetype)initWithSize:(CGSize)size
{
if(self = [super initWithSize:size])
{
self.backgroundColor = [SKColor whiteColor];
self.physicsWorld.contactDelegate = self;
// no gravity
//self.physicsWorld.gravity = CGVectorMake(0.0f, -9.8f);

_play = NO;
_touch = NO;
_startY = 50;

[self addWorld];
[self addHero];
}

return self;
}

- (void)addWorld
{
_world = [SKNode node];
_world.position = CGPointMake(0, 0);
[self addChild:_world];
}

- (void)addHero
{
_hero = [SKSpriteNode spriteNodeWithImageNamed:@"hero"];
_hero.size = CGSizeMake(50, 50);
_hero.position = CGPointMake(CGRectGetMidX(self.frame), _startY);
[_world addChild:_hero];

_hero.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:_hero.size.width/2.0f];
_hero.physicsBody.affectedByGravity = NO;
_hero.physicsBody.dynamic = YES;
_hero.physicsBody.allowsRotation = NO;
}

- (void)applyHeroUpwardForce
{
[_hero.physicsBody applyForce:(CGVectorMake(0, 100))];

// limit velocity
CGVector vel = _hero.physicsBody.velocity;
vel.dy = vel.dy > 1000 ? 1000 : vel.dy;
_hero.physicsBody.velocity = vel;

// control the hero movement. it really moves upwards even we don’t see that, since the _world moves downwards
NSLog(@"_hero.position.y: %f", _hero.position.y);
}

- (void)updateWorld
{
_world.position = CGPointMake(_world.position.x, -(_hero.position.y - _startY));
}

- (void)didSimulatePhysics
{
if(!_play)
return;

if(_touch)
{
[self applyHeroUpwardForce];
[self updateWorld];
}

}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
if(!_play)
_play = YES;

_touch = YES;
}

- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
_touch = NO;
}

- (void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
_touch = NO;
}

@end

enter image description here


编辑2:

The same issue in the game 'Pierre Penguin Escapes The Antarctic'

enter image description here

最佳答案

在使用 SpriteKit 时,我已经看到这种情况发生在您要在物理接触处理程序委托(delegate)方法中更新 sprite 的位置时。

切勿在回调委托(delegate)方法中更新底层节点的位置/旋转/缩放。取而代之的是有一种机制来识别和跟踪在物理回调中进行的所需更新,并有一个从场景的更新方法中调用的单独方法,该方法将要对节点进行的更改应用。

关于ios - Sprite-kit:运动过程中位移的物理体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42236145/

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