首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有子物理主体(节点“范围”值)的SKPhysicsBody节点性能

具有子物理主体(节点“范围”值)的SKPhysicsBody节点性能
EN

Stack Overflow用户
提问于 2014-08-03 05:08:29
回答 1查看 368关注 0票数 1

我有一个自上而下的策略游戏。问题是,我正在尝试找到一种解决方案,使我的联系人可以比碰撞更远(更大的圆圈)。原因很合理,我想知道什么时候一个节点在另一个节点的“范围”内。

例如,假设一个精灵的“范围”圆圈距离实际精灵20个像素。

我试着让精灵上的物理体比精灵的框架大,但碰撞是基于“距离圆”而不是精灵。

我还试着给精灵添加了一个SKShapeNode圆,并用它添加了一个物理体。问题是,当我这样做时,子节点仍然与另一个子节点范围圆的物理体发生冲突。

更不用说我只有20个节点(以及它们自己的物理体、range节点和它们的物理体)的性能很快就会下降。

我更喜欢在物理模拟中保持联系,而不是临时解决方案。

有什么想法/建议吗?

代码语言:javascript
运行
复制
  // Mover physics
self.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:(self.frame.size.width/2)];
self.physicsBody.collisionBitMask = self.player == kPlayer_Human ? CATEGORY_HUMAN_MOVER : CATEGORY_AI_MOVER;
self.physicsBody.categoryBitMask = self.player == kPlayer_Human ? CATEGORY_HUMAN_MOVER : CATEGORY_AI_MOVER;
self.physicsBody.contactTestBitMask = 0;

_rangeNode = [SKShapeNode node];
_rangeNode.name = @"rangeNode";
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddArc(path, NULL, 0,0, _range, 0, M_PI*2, YES);
_rangeNode.path = path;
_rangeNode.lineWidth = 1.0;
_rangeNode.fillColor = [SKColor clearColor];
_rangeNode.strokeColor = [SKColor whiteColor];
_rangeNode.hidden = YES;

[self addChild:_rangeNode];

_rangeNode.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:_range];
_rangeNode.physicsBody.dynamic = NO;
_rangeNode.physicsBody.categoryBitMask = self.player == kPlayer_Human ? CATEGORY_HUMAN_MOVER_RANGE : CATEGORY_AI_MOVER_RANGE;
_rangeNode.physicsBody.contactTestBitMask = self.player == kPlayer_Human ? CATEGORY_AI_MOVER | CATEGORY_AI_HERO | CATEGORY_AI_TOWER : CATEGORY_HUMAN_MOVER | CATEGORY_HUMAN_HERO | CATEGORY_HUMAN_TOWER;
_rangeNode.physicsBody.collisionBitMask = 0;

类别定义,全局设置:

代码语言:javascript
运行
复制
static const uint32_t CATEGORY_HUMAN_MOVER = 0x1 << 0;
static const uint32_t CATEGORY_AI_MOVER = 0x1 << 1;
static const uint32_t CATEGORY_HUMAN_HERO = 0x1 << 2;
static const uint32_t CATEGORY_AI_HERO = 0x1 << 3;
static const uint32_t CATEGORY_HUMAN_TOWER = 0x1 << 4;
static const uint32_t CATEGORY_AI_TOWER = 0x1 << 5;
static const uint32_t CATEGORY_WALLS = 0x1 << 6;
static const uint32_t CATEGORY_HUMAN_MOVER_RANGE = 0x1 << 7;
static const uint32_t CATEGORY_AI_MOVER_RANGE = 0x1 << 8;

谢谢,E

EN

回答 1

Stack Overflow用户

发布于 2014-08-04 03:52:47

我不确定您的问题实际上是什么,但请注意,您的"mover“节点的SKPhysicsBody设置为节点本身大小的两倍。这可能就是为什么你们的节点会奇怪地互相“推”在一起。

其他注意事项/问题:

为隐藏节点设置笔触和填充颜色有什么特殊的原因吗?

为什么要为range物理主体创建任意大小的父节点?如果您有一个具有相同范围圆物理体的“空”节点,性能可能会提高吗?

如果在敌人与多个节点接触/碰撞时性能受到影响,请仔细注意您的联系处理例程(didBeginContactdidEndContact)。是否有可能对性能产生负面影响的地方?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25099426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档