Chcę przenieść SKSpriteNode na Y-Axis
. SKSpriteNode o nazwie Player nie ma Velocity
. Gracz może skakać tylko wtedy, gdy platforma jest w kontakcie.Zestaw Sprite Kit min. i maks. dla Jump
każdym dotknięciu ekranu, chcę dać gracz impuls z minimalną lub maksymalną impuls impuls
jeśli ekran jest na podsłuchu krótko, a minimalny impuls powinien być na przykład y = 50
. Jeśli ekran jest zatrzymany, oznacza to, że palec znajduje się na ekranie, wartość maksymalna powinna wynosić np. y = 100
.
Ale odtwarzacz powinien również mieć możliwość przeskakiwania między minimalną i maksymalną wysokością, jeśli np. Ekran nie jest długi, ale też nie jest krótko wciśnięty, odtwarzacz powinien otrzymać impuls tylko o wartości y = 70
.
Jeśli ekran jest zatrzymany, gracz powinien przeskoczyć na swoją maksymalną wysokość, opaść, a jeśli znowu będzie miał kontakt z platformą, powinien przeskoczyć, ponieważ nadal trzyma ekran.
Próbowałem już tego z sugerowaną odpowiedzią w tym wątku: StackOverFlow Ale to nie daje skoku minimalnego, także nie skoku prasy.
Dla przejrzystości: Impuls nie powinien być po zakończeniu kranu, ale gdy jest dotknięty. Im dłużej trzymasz, tym dłuższy jest skok.
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
}
}
Podoba mi się druga odpowiedź (z SKAction) z linku, który napisałeś. Czy próbowałeś tego? O ciągłym skakaniu, trzymając palec ... Chyba powinieneś dodać zmienną, która wskazuje, że użytkownik wciąż trzyma palec na ekranie, a jeśli to jest przypadek, gdy zostanie wykryty kontakt między platformą a graczem, zastosujesz impuls do następnego skoku ... – Whirlwind
Próbowałem także drugiego, wciąż nie tego miałem na myśli. Tak, powinienem zastosować impuls do następnego skoku po nawiązaniu kontaktu, ale nadal muszę ustawić minimum i maksimum. – Albert
Sprawdź moją odpowiedź. Po prostu skopiuj i wklej kod, aby zobaczyć, jak działa ... – Whirlwind