我有两个SKNode对象。 碰撞时他们的位置会改变。 我怎样才能防止呢? 同时,我仍然希望能够通过- (void)didBeginContact来联系他们。 我试着把它们的mass属性都设置为0.0f但是没有奏效。
希望有人能帮助。 我一直在这一个拉我的头发! 下面是我的Sprite Kit游戏中的一些控制板代码,它使用applyForce来移动英雄船。 我喜欢控制和运动的感觉,它有一些漂亮的漂移等等。但是我对它产生的animation/运动有不一致的结果。 有时(大约一半的时间)animation是非常顺利,看起来是正确的。 剩下的时间,船只animation以不同的强度结尾。 游戏中的怪兽和皮卡在SKAction各种path上SKAction 。 当英雄船发生问题时,他们的animation不会受到影响,我通常会在debugging中看到它以每秒60.0 fps的速度发生,这使我认为这不是一个帧丢失问题。 我的记忆使用是一致的,我没有看到任何大的峰值。 当这个错误发生的时候,从现场开始总是很明显的(在我开始平稳的运动之后,它就不会发生了 – 让我想起它的初始力量或者多重力量),并且一直持续到我重新开始等级或暂停和不停止游戏,在这一点上,我得到了一个完美的stream畅的animation或毛刺的animation的新行为。 我的绘图和节点都是使用地图集和预加载进行优化的,甚至当我将游戏中的大部分内容都closures(除了船和控制台之外的所有东西),我仍然在船上遇到了这个问题。 我注意到,当我插入Xcode时经常遇到这种情况,通常是在logging时(但不是总是),特别是在运行仪器时。 我的ControlPad用一个委托回到游戏场景 /* Game Scene */ @interface GameScene () <SKPhysicsContactDelegate, ControlPadDelegate> … – (void)createHero { self.heroShip = [Hero createHeroInFrame:self.frame]; [self.gameObject addChild:self.heroShip]; self.heroShip.position = CGPointMake(self.heroShip.size.width, self.frame.size.height / 2); } // Move Hero By X And Y – (void)moveHeroByX:(float)moveByX andY:(float)moveByY { […]
我目前正在做一个有圆柱形物体的游戏,我用下面的方法制作了一个SKPhysicsBody: self.oval.node.physicsBody = SKPhysicsBody(texture: self.oval.node.texture, size: self.oval.node.size) 这种方法在节点周围创build了一个很好的形状,但是重心却是离开的……它在椭圆的顶端平衡。 无论如何要改变这一点,所以它在理论上最重的部分应该平衡? 谢谢!
我正在用SpriteKit创build一个游戏,试图在碰撞时提高分数。 由于某种奇怪的原因,每次得分增加时都是一个随机数,而不是1。 在didBeginContact方法中,我有一个子弹和外星人之间的碰撞。 每次碰撞时,我都希望得分将得分增加1.除了有自己的想法,并且会随机地增加1到6之间的数字。我已经经历了每一行代码并尝试添加进入游戏多次,但它不会增加1,因为我也想。 目前我的代码是这样的。 在我的头文件中,我为分数创build了一个属性: @property (nonatomic) int score; 然后在我的主要游戏场景中,我添加以下内容 -(void)setScore:(int)score { _score = score; _scoreLabel.text = [NSString stringWithFormat:@"%d", score]; } 在我的init方法中,我也将分数设置为从0开始 self.score = 0; 在我的新游戏方法中,我也确保将得分设置回0 self.score = 0; 然后我的碰撞检测看起来像这样。 我用self.score ++增加分数; if (firstBody.categoryBitMask == kAlienCategory && secondBody.categoryBitMask == kBulletCategory) { //Collision Between Bullet & Alien self.score++; if (firstBody.node) { [self alienExplosion:firstBody.node.position]; [firstBody.node removeFromParent]; […]
是否有可能使用applyAngularImpulse而不是指数级地增加车轮的速度? 理想情况下,我想让车轮沿着我的手指,但是设置node.zRotation += atan2f(y2-y1, x2-x1)我的车轮失去控制。 这就是我所定下的,但感觉非常不可思议: – (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [touches anyObject]; SKNode *node = [self nodeAtPoint:location]; CGPoint positionInScene = [touch locationInNode:self]; CGPoint previousPosition = [touch previousLocationInNode:self]; [node.physicsBody applyAngularImpulse:(previousPosition.x – positionInScene.x) * 0.1]; node.physicsBody.angularDamping = 1; } 场景: https : //dl.dropboxusercontent.com/s/gexfburjm1coude/Screen%20Shot%202014-10-21%20at%2010.30.31%20PM.png?dl = 0
有很多情况下,你需要“摇动”一个UIView。 (例如,“将小孩用户的注意力吸引到控件上”,“连接速度慢”,“用户input错误”等)。 使用UIKit Dynamics可以做到这一点吗? 所以你必须.. 采取的观点,说在0,0 添加一个spring的概念 给它一个微调,说到“左” 它应该在spring前后摆动,最终再次回到0,0 这可能吗? 我在苹果演示中找不到例子。 干杯 请注意,正如尼尔斯在下面巧妙地解释的那样,在这些情况下,spring并不一定是你想要的“物理感觉”:在其他情况下,它可能是完美的。 据我所知,iOS自己的应用程序中的所有物理(如消息等)现在使用UIKitdynamic,所以对我来说,值得处理“UIView弹簧弹跳”。 只是要清楚,当然你可以做一些“类似”,只是一个animation。 例… 但是现在,这与iOS的其他部分根本没有相同的“物理感觉”。 -(void)userInputErrorShake { [CATransaction begin]; CAKeyframeAnimation * anim = [CAKeyframeAnimation animationWithKeyPath:@"transform"]; anim.values = @[ [NSValue valueWithCATransform3D: CATransform3DMakeTranslation(-4.0f, 0.0f, 0.0f) ], [NSValue valueWithCATransform3D: CATransform3DMakeTranslation(4.0f, 0.0f, 0.0f) ] ]; anim.autoreverses = YES; anim.repeatCount = 1.0f; anim.duration = 0.1f; [CATransaction setCompletionBlock:^{}]; [self.layer […]
我想创build一个像这个video中显示的绳索。 开发这样的绳索最好的方法是什么? 我已经试着开始了,我认为最好的办法是制作许多小小的“绳索”部分,并用针脚连接起来(这真的是最好的吗?!?)。 但我不知道如何开始。 也许有人可以给我一些示例代码.. THX 🙂
我正在尝试为我的游戏添加水。 除了不同的背景颜色,没有太多的东西。 但是,我希望player-sprite能够浮在顶部(或者半路)。 如果玩家从下面走进水里,我想让他漂浮在上面。 如果他跌倒了,我想让他慢慢改变方向,然后向上浮起来。 当他在水中时,我试图使重力消极,但是这给我一些有害的影响。 例如,当他(玩家)表面时,正常的重力会把他推倒,水会把他推开,等等。 最终,玩家将在水中“跳跃”,从一端推向另一端。 当他表面时,我希望他冷静地留在水面上。 我怎样才能做到这一点? 这是我在update-loop的代码: SKNode *backgroundNodeAtPoint = [_bgLayer nodeAtPoint:_ball.position]; if ([backgroundNodeAtPoint.name isEqualToString:@"WATER"]) { self.physicsWorld.gravity = CGVectorMake(self.physicsWorld.gravity.dx, 2); } else { if (self.physicsWorld.gravity.dy != -4) { self.physicsWorld.gravity = CGVectorMake(self.physicsWorld.gravity.dx, -4); } } 基本上,当玩家在水中时,这会将我的重力改变为2 ,否则将其改变为-4除非它已经是-4 。 谢谢!
您好我正试图解决这个问题与spritekit的物理形状出现颠倒。 [SKPhysicsBody bodyWithTexture:monsterTexture size:monsterTexture.size] 怪物第一次出现时,身体的取向是正确的。 但是第二次和每一次之后,怪物出现了,它的物理体是沿着Y轴倒置的。 看图片在哪里skView.showsPhysics = true; 所以显示物理形状。 事实上,第一次正确的工作使我想,也许一些财产,我不知道正在修改或什么的。 我想把两个物理块放在引导的粗糙形状中,但这并不理想,因为还有一些其他更复杂的形状,我想使用bodyWithTexture就是遇到同样的错误。 我也尝试了bodyWithTexture:monsterTexture ,原来的SKTexture对象,而不是bodyWithTexture:monster.texture ,怪物对象的纹理。 这是我的添加怪物代码。 让我知道你是否需要更多。 – (Monster *)monster:(NSDictionary *)settings { NSDictionary * monsterDefaults = [self monsterDefaults]; NSDictionary * monsterConfig = [self monsterConfig:settings[TYPE]]; SKTexture * monsterTexture = monsterConfig[TEXTURE] ? monsterConfig[TEXTURE] : monsterDefaults[TEXTURE]; Monster * monster = [Monster spriteNodeWithTexture:monsterTexture]; // Animation if (monsterConfig[ANIMATION]) { [monster […]
我想在Y-Axis轴上移动一个SKSpriteNode。 被称为Player的SKSpriteNode没有Velocity 。玩家只能在平台接触的情况下跳转。 每次触摸屏幕,我都想给玩家一个最小的冲动或最大的冲动的冲动 如果短时间点击屏幕,则最小冲动应为例如y = 50 。 如果屏幕保持,那就意味着手指在屏幕上长,最大值应该是例如y = 100 。 但是玩家也应该能够在最小和最大高度之间跳跃,如果对于例如屏幕不长但也没有被短时间按下,玩家应该只能得到y = 70的冲动。 如果屏幕被保持,玩家应该跳到他的最大高度,跌倒,如果它再次与平台接触,它应该跳跃,因为你仍然拿着屏幕。 我已经试过这个在这个线程中的build议的答案: StackOverFlow但是这不会给最小跳转,也没有按下跳转。 为了清楚起见:冲动不应该在水龙头完成后,而应该在水龙头冲击下。 你持有的时间越长,跳跃的时间就越长。 import SpriteKit import GameKit struct Constants { static let minimumJumpForce:CGFloat = 40.0 static let maximumJumpForce:CGFloat = 60.0 static let characterSideSpeed:CGFloat = 18.0 } class GameScene: SKScene, SKPhysicsContactDelegate { var Player: SKSpriteNode! var Platform0: SKSpriteNode! var […]