2015-10-26 7 views
1

Так что моя проблема касается вращения спрайта. Я хочу, чтобы он выглядел так, как будто он балансирует. Когда вы нажимаете налево - спрайт перемещается влево, когда вы нажимаете вправо - спрайт перемещается вправо. Чтобы получить лучшую идею, положите карандаш на конец и попробуйте сбалансировать его ... Да ... это (но только по оси x).Балансировка спрайта

В настоящее время я вращаю спрайт либо по часовой стрелке, либо против часовой стрелки в зависимости от того, нажимаю ли я левую или правую сторону экрана. Все это делается с помощью SKActions.

Проблема в том, что это приводит к очень «рывкам» и не особенно реалистичному движению.

Я предполагаю, что я хочу использовать физику тело и что-то похожее на скорость, но мои вопросы:

  • использование скорости прав ... не так ли?
  • мне лучше бы справиться с спрайтом по объему (и заставить его учесть его объем и массу) или просто простой спрайт на основе краев?

Заранее благодарен!

- код - Это, как я в настоящее время вращается и движется мой спрайт:

import SpriteKit 
enum rotationDirection{ 
case clockwise 
case counterClockwise 
case none 
} 

    // Creates GameScene and initialises Sprites in Scene // 
    class GameScene: SKScene, SKPhysicsContactDelegate { 

    // Rotation direction variable for ship motion (rotation and movement) // 
var currentRotationDirection = rotationDirection.none 
var xVelocity: CGFloat = 0 

var sprite = SKSpriteNode() 



// Setup Scene here // 
    override func didMoveToView(view: SKView) { 

    // Background colour // 
    self.backgroundColor = SKColor.whiteColor() 

    // sprite Physics + add's sprite // 
    sprite.physicsBody = SKPhysicsBody(rectangleOfSize: ship.size) 
    sprite.physicsBody?.affectedByGravity = true 
    sprite.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame)) 
    self.addSprite() 


    // Initialises sprite node and it's properties // 
func addSprite() { 

    // Sprite dimension properities // 
    sprite.name = "sprite" 
    sprite = SKSpriteNode(imageNamed: "sprite") 
    sprite.setScale(0.5) 
    sprite.position = CGPointMake(frame.midX, 220) 
    sprite.anchorPoint = CGPoint(x: 0.5, y: 0.25) 
    sprite.zPosition = 1; 
    // sprite Physics properties // 
    sprite.physicsBody = SKPhysicsBody(rectangleOfSize: ship.size) 
    sprite.physicsBody?.categoryBitMask = UInt32(shipCategory) 
    sprite.physicsBody?.dynamic = true 
    sprite.physicsBody?.contactTestBitMask = UInt32(obstacleCategory) 
    sprite.physicsBody?.collisionBitMask = 0 
    self.addChild(sprite) 





override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) { 

    // Defines UI Touch // 
    let touch = touches.first as UITouch! 
    let touchPosition = touch.locationInNode(self) 

    // Sets up Inital Rotation Direction // 
    let newRotationDirection : rotationDirection = touchPosition.x < CGRectGetMidX(self.frame) ? .clockwise : .counterClockwise 


    // Left or Right movement based on touch // 
    if touchPosition.x < CGRectGetMidX(self.frame) {xVelocity = -75} 
    else {xVelocity = 75} 


    // Clockwise or anticlockwise rotation based on touch // 
    if currentRotationDirection != newRotationDirection && currentRotationDirection != .none { 
     reverseRotation() 
     currentRotationDirection = newRotationDirection 
    } 
    else if (currentRotationDirection == .none) { 
     setupRotationWith(direction: newRotationDirection) 
     currentRotationDirection = newRotationDirection 
    } 
} 

func reverseRotation() { 
    let oldRotateAction = sprite.actionForKey("rotate") 
    let newRotateAction = SKAction.reversedAction(oldRotateAction!) 
    sprite.runAction(newRotateAction(), withKey: "rotate") 
} 


func stopRotation() { 
    sprite.removeActionForKey("rotate") 
} 

func setupRotationWith(direction direction: rotationDirection){ 
    let angle : CGFloat = (direction == .clockwise) ? CGFloat(M_PI) : -CGFloat(M_PI) 
    let rotate = SKAction.rotateByAngle(angle, duration: 2) 
    let repeatAction = SKAction.repeatActionForever(rotate) 
    sprite.runAction(repeatAction, withKey: "rotate") 
} 

override func update(currentTime: CFTimeInterval) { 
    let rate: CGFloat = 0.3; //Controls rate of motion. 1.0 instantaneous, 0.0 none. 
    let relativeVelocity: CGVector = CGVector(dx:xVelocity-sprite.physicsBody!.velocity.dx, dy:0); 
     sprite.physicsBody!.velocity=CGVector(dx:sprite.physicsBody!.velocity.dx+relativeVelocity.dx*rate, dy:0); 
    } 
+0

Пожалуйста, поделитесь некоторым кодом, чтобы мы могли видеть, что вы пробовали. –

+0

Введите код, указанный на рисунке выше. –

+0

... Кто-нибудь ....? :( –

ответ

0

Я думаю, что ваш собираетесь хотеть смотреть на это ускорение. Прямо сейчас вы регулируете verlocityX со статическим количеством использования:

if touchPosition.x < CGRectGetMidX(self.frame) { 
    xVelocity = -75 
} 
else { 
    xVelocity = 75 
} 

Делая это приведет к вашему движению рывков. Это на самом деле просто линейно. Используя ускорение, вы можете избежать этого.

Для этого вам понадобятся еще две переменные для maxVelocity и acceleration. Вы хотите, чтобы maxVelocity, вероятно, ограничивала скорость. Для каждого кадра вам необходимо увеличить velocity с суммой ускорения.

Я предлагаю вам попробовать что-то вроде этого:

velocity  = 0 // No movement 
acceleration = 2 // Increase velocity with 2 each frame 
maxVelocity = 75 // The maximum velocity 

if touchPosition.x < CGRectGetMidX(self.frame) { 
    xVelocity += acceleration 
    if xVelocity <= -maxVelocity { 
     xVelocity = -maxVelocity 
    } 
} 
else { 
    xVelocity -= acceleration 
    if xVelocity >= maxSpeed { 
     xVelocity = maxSpeed 
    } 
} 

Увеличение вашей скорости, как это приведет со скоростью вращения 2 в первом кадре, чем 4, во втором и 6 в третей и т.д. Таким образом, это будет иметь возрастающий эффект. В то же время, когда вы пытаетесь изменить его, у вас тоже не будет отрывистого эффекта. Скажите, что скорость равна 50, вы сначала уменьшаете ее до 48, 46, 44 и т. Д. Только до 0 очков вы фактически начнете вращаться в другую сторону.

+0

xVelocity относится к боковому движению спрайта. Я хочу использовать аналогичную реализацию, которая перемещает спрайт сбоку к угловому вращению спрайтов. Возможно ли это? –

Смежные вопросы