Desidero spostare un SKSpriteNode su Y-Axis
. Il SKSpriteNode chiamato Player non ha Velocity
. Il giocatore può saltare solo se una piattaforma è in contatto.Kit sprite impostato min. e Max. per Jump
Ogni volta lo schermo viene toccato, voglio dare al giocatore un impulso con un impulso minimo o un massimo impulso
se lo schermo è sfruttato poco, l'impulso minima dovrebbe essere per esempio y = 50
. Se lo schermo è premuto, significa che il dito è sullo schermo lungo, il massimo dovrebbe essere ad es. y = 100
.
Ma il lettore dovrebbe anche essere in grado di saltare tra l'altezza minima e massima, se per es. lo schermo non è lungo ma anche non premuto brevemente, il lettore dovrebbe ricevere solo un impulso di y = 70
.
Se lo schermo è premuto, il lettore dovrebbe saltare alla sua massima altezza, cadere e, se è di nuovo in contatto con la piattaforma, dovrebbe saltare, perché si tiene ancora lo schermo.
Ho già provato questo con la risposta suggerita in questa discussione: StackOverFlow Ma questo non dà il salto minimo, anche no Premere salto.
Per chiarezza: L'impulso non deve essere dopo che il rubinetto è finito, ma mentre è toccato. Più a lungo si tiene, più lungo è il salto.
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 World: SKNode!
var Camera: SKNode!
var force: CGFloat = 40.0
var pressed = false
var isCharacterOnGround = false
.....
func SpawnPlatforms() {
Platform0 = SKSpriteNode (color: SKColor.greenColor(), size: CGSize(width: self.frame.size.width , height: 25))
Platform0.position = CGPoint(x: self.frame.size.width/2, y: -36)
Platform0.zPosition = 1
Platform0.physicsBody = SKPhysicsBody(rectangleOfSize:Platform0.size)
Platform0.physicsBody?.dynamic = false
Platform0.physicsBody?.allowsRotation = false
Platform0.physicsBody?.restitution = 0
Platform0.physicsBody?.usesPreciseCollisionDetection = true
Platform0.physicsBody?.categoryBitMask = Platform0Category
Platform0.physicsBody?.collisionBitMask = PlayerCategory
Platform0.physicsBody?.contactTestBitMask = PlayerCategory
World.addChild(Platform0)
}
func SpawnPlayer(){
Player = SKSpriteNode (imageNamed: "Image.png")
Player.size = CGSize(width: 64, height: 64)
Player.position = CGPoint(x: self.frame.size.width/2, y: 0)
Player.zPosition = 2
Player.physicsBody = SKPhysicsBody(rectangleOfSize:CGSize(width: 35, height: 50))
Player.physicsBody?.dynamic = true
Player.physicsBody?.allowsRotation = false
Player.physicsBody?.restitution = 0.1
Player.physicsBody?.usesPreciseCollisionDetection = true
Player.physicsBody?.categoryBitMask = PlayerCategory
Player.physicsBody?.collisionBitMask = Platform0Category
Player.physicsBody?.contactTestBitMask = Platform0Category | Platform1Category | Platform2Category | Platform3Category | Platform4Category | Platform5Category
World.addChild(Player)
}
func jump(force : CGFloat){
if(self.isCharacterOnGround){
self.Player.physicsBody?.applyImpulse(CGVectorMake(0, force))
self.isCharacterOnGround = false
}
}
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
/* Called when a touch begins */
for touch in (touches as! Set<UITouch>) {
let location = touch.locationInNode(self)
self.pressed = true
let timerAction = SKAction.waitForDuration(0.0)
let update = SKAction.runBlock({
if(self.force < Constants.maximumJumpForce){
self.force += 2.0
}else{
self.jump(Constants.maximumJumpForce)
self.force = Constants.maximumJumpForce
}
})
let sequence = SKAction.sequence([timerAction, update])
let repeat = SKAction.repeatActionForever(sequence)
self.runAction(repeat, withKey:"repeatAction")
}
}
override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) {
for touch in (touches as! Set<UITouch>) {
let location = touch.locationInNode(self)
self.removeActionForKey("repeatAction")
self.jump(self.force)
self.force = Constants.minimumJumpForce
self.pressed = false
}
}
func didBeginContact(contact: SKPhysicsContact) {
//this gets called automatically when two objects begin contact with each other
let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask
switch(contactMask) {
case PlayerCategory | Platform0Category:
//either the contactMask was the bro type or the ground type
println("Contact Made0")
Green = true
self.isCharacterOnGround = true
default:
return
}
}
Mi piace la seconda risposta (con SKAction) dal link che hai postato. Hai provato quello? A proposito di saltare continuamente tenendo un dito ... Suppongo che dovresti aggiungere una variabile che indica che l'utente tiene ancora un dito sullo schermo, e se questo è un caso, quando viene rilevato il contatto tra piattaforma e giocatore, applicheresti l'impulso per il prossimo salto ... – Whirlwind
Ho provato anche il secondo, non è ancora quello che intendevo. Sì, dovrei applicare un impulso per il salto successivo dopo aver effettuato un contatto, ma devo comunque impostare il minimo e il massimo. – Albert
Controlla la mia risposta. Basta copiare e incollare il codice per vedere come funziona ... – Whirlwind