От новичка до гуру: Курсы программирования на CyberDuff

Метод быстрого прыжка Столкновение объекта с землей

Я работаю над игрой для iPhone. В основном, если герой сталкивается с препятствием, он сдается. Теперь я хочу добавить моему герою возможность прыгать. Но когда я использую «physicsBody = SKPhysicsBody (rectangleOfSize: size)» для земли, как только игра начинается и герой появляется на земле, «func didBeginContact (contact: SKPhysicsContact) {gameOver () }» завершает игру. Вот мои реализации героя, земли и игровой сцены. Ребята, помогите, пожалуйста, заставить героя прыгать и приземляться на землю. Заранее спасибо.

//  AKHero.swift
//  Run Hero

  import Foundation
  import SpriteKit
  class AKHero: SKSpriteNode{

var body:SKSpriteNode!
var arm: SKSpriteNode!
var leftFoot: SKSpriteNode!
var rightFoot: SKSpriteNode!
var leftpupil: SKSpriteNode!
var rightpupil: SKSpriteNode!

var isUpsideDown = false

init(){
    let size = CGSizeMake(35, 45)
    super.init(texture: nil, color: UIColor.clearColor(), size: size)

    loadAppearance()
    loadPhysicsBoadyWithsize(size)

}

   func loadPhysicsBoadyWithsize(size: CGSize){

    physicsBody = SKPhysicsBody(rectangleOfSize: size)

    physicsBody?.categoryBitMask = heroCategory
    physicsBody?.contactTestBitMask = obstacleCategory
    physicsBody?.usesPreciseCollisionDetection = true
    physicsBody?.affectedByGravity = false
}


   func jump(){

    self.physicsBody?.applyImpulse(CGVectorMake(0, 15))
    physicsBody?.affectedByGravity = true


}
//  GameScene.swift
//  Run Hero

import SpriteKit

class GameScene: SKScene, SKPhysicsContactDelegate {

var movingGround: AKMovingGround!
var hero: AKHero!
var cloudGenerator: AKCloudGenerator!
var obstacleGenerator: AKObstacleGenerator!
var coinGenerator: AKCoinGenerator!
var isStarted = false
var isGameOver = false

override func didMoveToView(view: SKView) {
    backgroundColor = UIColor(red: 159.0/255.0, green: 201.0/255.0 ,       blue: 244.0/255.0 , alpha: 1.0)

 func addMovingGround(){
     movingGround = AKMovingGround(size: CGSizeMake(view!.frame.width, kAKGroundHeight))
    movingGround.position = CGPointMake(0, view!.frame.size.height/2)
    addChild(movingGround)

}

//add hero
func addHero(){
    hero = AKHero()
    hero.position = CGPointMake(70, movingGround.position.y + movingGround.frame.size.height/2 + hero.frame.size.height/2)
    addChild(hero)
    hero.breathe()
}
func addPhysicsWorld() {
    physicsWorld.contactDelegate = self

}
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {

    if isGameOver {

        restart()
    }

    else if !isStarted {

        start()

    }
    else{
       hero.flipHero()
      //hero.jump()

    }
}


// MARK: - SKPhysicsContactDelegate
func didBeginContact(contact: SKPhysicsContact) {

    if !isGameOver{
    println("didBeginContact")
    gameOver()
    }
}
//
//  AKMovingGround.swift
//  Run Hero
//
//  Created by Alican Karamil on 24/08/15.
//  Copyright (c) 2015 Alican Karamil. All rights reserved.
//

import Foundation
import SpriteKit
class AKMovingGround: SKSpriteNode{

    let NUMBER_OF_SEGMENTS = 20
    let COLOR_ONE = UIColor(red: 88.0/255.0, green: 148.0/255, blue: 87.0/255.0, alpha: 1.0)
    let COLOR_TWO = UIColor(red: 120.0/255.0, green:195.0/255.0, blue: 118.0/255.0, alpha: 1.0)

    init (size: CGSize){
        super.init(texture: nil, color: UIColor.brownColor(), size: CGSizeMake(size.width*2, size.height))
        anchorPoint = CGPointMake(0, 1.5)
        //anchorPoint = CGPointMake(0, 0.5)

        for var i = 0; i < NUMBER_OF_SEGMENTS; i++ {
            var segmentColor: UIColor!
            if i % 2 == 0{
            segmentColor=COLOR_ONE
            }else{
            segmentColor=COLOR_TWO
            }
            let segment = SKSpriteNode(color: segmentColor, size: CGSizeMake(self.size.width/CGFloat(NUMBER_OF_SEGMENTS), self.size.height))
            segment.anchorPoint = CGPointMake(0.0, 0.5)
            segment.position = CGPointMake(CGFloat(i)*segment.size.width, 0)
            addChild(segment)
        }

    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }


    func start(){
        let moveleft = SKAction.moveByX(-frame.size.width/2, y: 0, duration: 1.0)
        let resetPosition = SKAction.moveToX(0, duration: 0.0)
        let moveSequence = SKAction.sequence([moveleft, resetPosition])
        //runAction(moveSequence, completion: nil)
        runAction(SKAction.repeatActionForever(moveSequence))

    }

    func stop(){

    removeAllActions()
   }


 }

  • Вы должны поместить некоторую условную логику в didBeginContact. Прямо сейчас, если игра начинается, ваш герой касается границы сцены и вызывается didBeginContact, что приводит к завершению игры. В didBeginContact вы должны определить касание того, что завершает игру, а что нет. 02.09.2015

Ответы:


1

Ваша проблема в том, что didBeginContact() не был назначен конкретный контакт, поэтому любой контакт вообще обрабатывается этой функцией, в том числе между игроком и землей.

Чтобы это исправить, вам нужно будет создать определенные битовые маски категорий. Для получения дополнительной информации ознакомьтесь с Документы Apple. Когда вы это сделаете, вам нужно будет указать, битовые маски категории, с которыми вы хотите обнаруживать коллизии, на проигрывателе. Таким образом, если он упадет на землю, ничего не произойдет, но если он наткнется на препятствие, игра окончена. Для этого вам нужно указать physicsBody?.categoryBitMask игрока, затем установить его physicsBody?.contactTestBitMask и physicsBody?.collisionBitMask.

В didBeginContact() укажите, какой контакт искать с помощью операторов if. Попробуйте и посмотрите, поможет ли вам это видео на YouTube. Или, может быть, вот этот.

04.09.2015
Новые материалы

Основы Spring: Bean-компоненты, контейнер и внедрение зависимостей
Как лего может помочь нашему пониманию Когда мы начинаем использовать Spring, нам бросают много терминов, и может быть трудно понять, что они все означают. Итак, мы разберем основы и будем..

Отслеживание состояния с течением времени с дифференцированием снимков
Время от времени что-то происходит и революционизирует часть моего рабочего процесса разработки. Что-то более забавное вместо типичного утомительного и утомительного процесса разработки. В..

Я предполагаю, что вы имеете в виду методы обработки категориальных данных.
Я предполагаю, что вы имеете в виду методы обработки категориальных данных. Пожалуйста, проверьте мой пост Инструментарий специалиста по данным для кодирования категориальных переменных в..

Игра в прятки с данными
Игра в прятки с данными Я хотел бы, чтобы вы сделали мне одолжение и ответили на следующие вопросы. Гуглить можно в любое время, здесь никто не забивается. Сколько регионов в Гане? А как..

«Раскрытие математических рассуждений с помощью Microsoft MathPrompter и моделей больших языков»
TL;DR: MathPrompter от Microsoft показывает, как использовать математические рассуждения с большими языковыми моделями; 4-этапный процесс для улучшения доверия и рассуждений в математических..

Раскройте свой потенциал в области разработки мобильных приложений: Абсолютная бесплатная серия
Глава 6: Работа в сети и выборка данных Глава 1: Введение в React Native Глава 2: Основы React Native Глава 3: Создание пользовательского интерфейса с помощью React Native Глава 4:..

Все о кейсах: Camel, Snake, Kebab & Pascal
В программировании вы сталкивались с ними при именовании переменной, класса или функции. Поддержание согласованности типов и стилей случаев делает ваш код более читабельным и облегчает совместную..