스프라이트에는 물리학자가 있습니다. 스프라이트가 어떤 방향으로 움직이면 물리 몸체는 그 방향으로 옮겨집니다 (첨부 된 이미지 참조). 이것은 접촉과 충돌에 좋지 않습니다.스프라이트 키트 : 이동 중에 물리학 자 본체가 이동 됨
물리 구조체는 이동 중에 만 이동합니다. 스프라이트가 멈 추면 물리학자가 옮겨지지 않습니다.
내 질문 : 물리 단위가 스프라이트 키트에서 이동 방향으로 어긋나는 이유는 무엇입니까? 그것을 막을 수있는 방법이 있습니까?
덕분에 많은
는 편집 :
OK .. 나는이 문제를 설명하기 작은 테스트를 썼다. 중력에 영향을받지 않는 물리 구조를 가진 노드가 하나뿐입니다. 물리학 세계에는 중력도 없습니다. 화면을 터치하여 영웅이 위쪽으로 이동합니다. 코드를 테스트하려면 SKView showsPhysics
property = 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
편집 2 :
The same issue in the game 'Pierre Penguin Escapes The Antarctic'
나는 그것이 당신이 무엇을 요구하고 있는지 정말로 이해하지 못한다. 물론 물리학 몸체가 스프라이트와 함께 움직입니다. 왜 그렇게 원하지 않습니까? – Pierce
관련 코드를 업로드해야합니다 ... – Whirlwind
예, 물리 본문이 스프라이트와 함께 이동합니다. 그러나 물리학자가 옮겨진다. 첨부 된 이미지를 참조하십시오. 미사일이 뒤쪽에있는 우주선과 충돌하면 우주선의 물리 구조가 첨부 된 이미지와 같이 전면으로 이동하기 때문에 접촉/충돌이 발생하지 않습니다. – suyama