Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为什么赢了';我的操场上没有任何东西出现吗?_Ios_Swift_Swift Playground - Fatal编程技术网

Ios 为什么赢了';我的操场上没有任何东西出现吗?

Ios 为什么赢了';我的操场上没有任何东西出现吗?,ios,swift,swift-playground,Ios,Swift,Swift Playground,我在Swift操场上玩了一个乒乓球游戏,这是我根据在线教程制作的,但我的助理编辑什么都不展示!我的乒乓球游戏呢!?我的代码在图片下方,显示没有显示任何内容 导入SpriteKit 导入PlaygroundSupport //声明一些全局常量 设宽度=800为CGFloat 让高度=1200作为CGFloat 让racketHeight=150作为CGFloat 让ballRadius=20作为CGFloat //可能存在三种类型的碰撞对象 枚举冲突类型:UInt32{ 壳球=1 箱壁=2 箱拍

我在Swift操场上玩了一个乒乓球游戏,这是我根据在线教程制作的,但我的助理编辑什么都不展示!我的乒乓球游戏呢!?我的代码在图片下方,显示没有显示任何内容

导入SpriteKit
导入PlaygroundSupport
//声明一些全局常量
设宽度=800为CGFloat
让高度=1200作为CGFloat
让racketHeight=150作为CGFloat
让ballRadius=20作为CGFloat
//可能存在三种类型的碰撞对象
枚举冲突类型:UInt32{
壳球=1
箱壁=2
箱拍=4
}
//球拍方向
枚举方向:Int{
案例无=0
大小写为1
大小写为2
}
//制作一个精灵场景
类游戏场景:SKScene,SKPhysicContactDelegate{
让球拍速度=500.0
变量方向=方向。无
风险值得分=0
var gameRunning=false
//屏幕元素
var球拍:SKShapeNode?
var ball:SKShapeNode?
设scoreLabel=SKLabelNode()
//在第一次启动期间初始化对象
重写func sceneDidLoad(){
super.sceneDidLoad()
scoreLabel.fontSize=40
scoreLabel.position=CGPoint(x:宽度/2,y:高度-100)
self.addChild(scoreLabel)
createWalls()
createBall(位置:CGPoint(x:width/2,y:height/2))
createRacket()
startNewName()
self.physicsWorld.contactDelegate=self
}
//创建球精灵
func createBall(位置:CGPoint){
设physicsBody=SKPhysicsBody(圆半径:球半径)
ball=SKShapeNode(圆形半径:ballRadius)
physicsBody.categoryBitMask=CollisionTypes.Ball.rawValue
physicsBody.collisionBitMask=CollisionTypes.Wall.rawValue | CollisionTypes.Ball.rawValue | CollisionTypes.Racket.rawValue
physicsBody.affectedByGravity=false
physicsBody.restitution=1
physicsBody.linearDamping=0
physicsBody.velocity=CGVector(dx:-500,dy:500)
球!.physicsBody=physicsBody
球!位置=位置
ball!.fillColor=SKColor.white
}
//创建墙
func createWalls(){
createWall(rect:CGRect(原点:CGPoint(x:0,y:0),大小:CGSize(宽度:半径,高度:高度)))
createWall(rect:CGRect(原点:CGPoint(x:0,y:0),大小:CGSize(宽度:宽度,高度:半径)))
createWall(rect:CGRect(原点:CGPoint(x:0,y:height-ballRadius),大小:CGSize(width:width,height:ballRadius)))
}
func createWall(rect:CGRect){
let node=SKShapeNode(rect:rect)
node.fillColor=SKColor.white
node.physicsBody=getWallPhysicsbody(rect:rect)
self.addChild(节点)
}
//创建物理对象以处理墙碰撞
func getWallPhysicsbody(rect:CGRect)->SKPhysicsBody{
设physicsBody=SKPhysicsBody(矩形:rect.size,中心:CGPoint(x:rect.midX,y:rect.midY))
physicsBody.affectedByGravity=false
physicsBody.isDynamic=false
physicsBody.collisionBitMask=CollisionTypes.Ball.rawValue
physicsBody.categoryBitMask=CollisionTypes.Wall.rawValue
返回物理体
}
//创建球拍精灵
func createRacket(){
球拍=SKShapeNode(rect:CGRect(原点:CGPoint.zero,大小:CGSize(宽度:球半径,高度:球拍高度)))
self.addChild(球拍!)
球拍!.fillColor=SKColor.white
让physicsBody=SKPhysicsBody(矩形:racket!.frame.size,中心:CGPoint(x:racket!.frame.midX,y:racket!.frame.midY))
physicsBody.affectedByGravity=false
physicsBody.isDynamic=false
physicsBody.collisionBitMask=CollisionTypes.Ball.rawValue
physicsBody.categoryBitMask=CollisionTypes.Racket.rawValue
physicsBody.contactTestBitMask=CollisionTypes.Ball.rawValue
球拍!.physicsBody=physicsBody
}
//开始新游戏
func startNewGame(){
分数=0
scoreLabel.text=“0”
球拍!.position=CGPoint(x:width-ballRadius*2,y:height/2)
让StartAbel=SKLabelNode(文本:“游戏结束”)
STARTABEL.position=CGPoint(x:宽度/2,y:高度/2)
Abel.fontSize=160
self.addChild(Abel)
//动画倒计时
让fadeIn=SKAction.fadeIn(持续时间:0.5)
让衰减=SKAction.fadeOut(持续时间:0.5)
abel.text=“3”
startabel.run(SKAction.sequence([fadeIn,fadeOut]),完成:{
abel.text=“2”
startabel.run(SKAction.sequence([fadeIn,fadeOut]),完成:{
tabel.text=“1”
startabel.run(SKAction.sequence([fadeIn,fadeOut]),完成:{
tabel.text=“0”
startabel.run(SKAction.sequence([fadeIn,fadeOut]),完成:{
startAbel.removeFromParent()
self.gameRunning=true
self.ball!.position=CGPoint(x:30,y:height/2)
self.addChild(self.ball!)
})
})
})
})
}
//处理触摸事件以移动球拍
覆盖func TouchesBegind(Touchs:Set,带有事件:UIEvent?){
接触{
让位置=触摸。位置(in:self)
如果位置y>高度/2{
方向=方向。向上
}否则,如果位置y<高度/2{
方向=方向。向下
}
}
}
//停止球拍运动
覆盖函数touchesend(touchs:Set,带有事件:UIEvent?){
方向=方向。无
}
//游戏循环:
var dt=时间间隔(0)
覆盖函数更新(uCurrentTime:TimeInterval){
如果游戏正在运行{
super.update(当前时间)
checkGameOver()
import SpriteKit
import PlaygroundSupport

// Declare some global constants
let width = 800 as CGFloat
let height = 1200 as CGFloat
let racketHeight = 150 as CGFloat
let ballRadius = 20 as CGFloat

// Three types of collision objects possible
enum CollisionTypes: UInt32 {
    case Ball = 1
    case Wall = 2
    case Racket = 4
}

// Racket direction
enum Direction: Int {
    case None = 0
    case Up = 1
    case Down = 2
}

// Make a SpriteKit scene
class gameScene: SKScene, SKPhysicsContactDelegate {
    let racketSpeed = 500.0
    var direction = Direction.None
    var score = 0
    var gameRunning = false

    // Screen elements
    var racket: SKShapeNode?
    var ball: SKShapeNode?
    let scoreLabel = SKLabelNode()

    // Initialize objects during first start
    override func sceneDidLoad() {
        super.sceneDidLoad()
        scoreLabel.fontSize = 40
        scoreLabel.position = CGPoint(x: width/2, y: height - 100)
        self.addChild(scoreLabel)

        createWalls()
        createBall(position: CGPoint(x: width / 2, y: height / 2))
        createRacket()
        startNewGame()
        self.physicsWorld.contactDelegate = self
    }

    // Create the ball sprite
    func createBall(position: CGPoint) {
        let physicsBody = SKPhysicsBody(circleOfRadius: ballRadius)
        ball = SKShapeNode(circleOfRadius: ballRadius)
        physicsBody.categoryBitMask = CollisionTypes.Ball.rawValue
        physicsBody.collisionBitMask = CollisionTypes.Wall.rawValue | CollisionTypes.Ball.rawValue | CollisionTypes.Racket.rawValue
        physicsBody.affectedByGravity = false
        physicsBody.restitution = 1
        physicsBody.linearDamping = 0
        physicsBody.velocity = CGVector(dx: -500, dy: 500)
        ball!.physicsBody = physicsBody
        ball!.position = position
        ball!.fillColor = SKColor.white
    }

    // Create the walls
    func createWalls() {
        createWall(rect: CGRect(origin: CGPoint(x: 0, y: 0), size: CGSize(width: ballRadius, height: height)))
        createWall(rect: CGRect(origin: CGPoint(x: 0, y: 0), size: CGSize(width: width, height: ballRadius)))
        createWall(rect: CGRect(origin: CGPoint(x: 0, y: height - ballRadius), size: CGSize(width: width, height: ballRadius)))
    }

    func createWall(rect: CGRect) {
        let node = SKShapeNode(rect: rect)
        node.fillColor = SKColor.white
        node.physicsBody = getWallPhysicsbody(rect: rect)
        self.addChild(node)
    }

    // Create the physics objetcs to handle wall collisions
    func getWallPhysicsbody(rect: CGRect) -> SKPhysicsBody {
        let physicsBody = SKPhysicsBody(rectangleOf: rect.size, center: CGPoint(x: rect.midX, y: rect.midY))
        physicsBody.affectedByGravity = false
        physicsBody.isDynamic = false
        physicsBody.collisionBitMask = CollisionTypes.Ball.rawValue
        physicsBody.categoryBitMask = CollisionTypes.Wall.rawValue
        return physicsBody
    }

    // Create the racket sprite
    func createRacket() {
        racket =  SKShapeNode(rect: CGRect(origin: CGPoint.zero, size: CGSize(width: ballRadius, height: racketHeight)))
        self.addChild(racket!)
        racket!.fillColor = SKColor.white
        let physicsBody = SKPhysicsBody(rectangleOf: racket!.frame.size, center: CGPoint(x: racket!.frame.midX, y: racket!.frame.midY))
        physicsBody.affectedByGravity = false
        physicsBody.isDynamic = false
        physicsBody.collisionBitMask = CollisionTypes.Ball.rawValue
        physicsBody.categoryBitMask = CollisionTypes.Racket.rawValue
        physicsBody.contactTestBitMask = CollisionTypes.Ball.rawValue
        racket!.physicsBody = physicsBody
    }

    // Start a new game
    func startNewGame() {
        score = 0
        scoreLabel.text = "0"
        racket!.position = CGPoint(x: width - ballRadius * 2, y: height / 2)
        let startLabel = SKLabelNode(text: "Game Over")
        startLabel.position = CGPoint(x: width / 2, y: height / 2)
        startLabel.fontSize = 160
        self.addChild(startLabel)

        // Animated countdown
        let fadeIn = SKAction.fadeIn(withDuration: 0.5)
        let fadeOut = SKAction.fadeOut(withDuration: 0.5)
        startLabel.text = "3"
        startLabel.run(SKAction.sequence([fadeIn, fadeOut]), completion: {
            startLabel.text = "2"
            startLabel.run(SKAction.sequence([fadeIn, fadeOut]), completion: {
                startLabel.text = "1"
                startLabel.run(SKAction.sequence([fadeIn, fadeOut]), completion: {
                    startLabel.text = "0"
                    startLabel.run(SKAction.sequence([fadeIn, fadeOut]), completion: {
                        startLabel.removeFromParent()
                        self.gameRunning = true
                        self.ball!.position = CGPoint(x: 30, y: height / 2)
                        self.addChild(self.ball!)
                    })
                })
            })
        })
    }

    // Handle touch events to move the racket
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        for touch in touches {
            let location = touch.location(in: self)
            if location.y > height / 2 {
                direction = Direction.Up
            } else if location.y < height / 2{
                direction = Direction.Down
            }
        }
    }

    // Stop racket movement
    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        direction = Direction.None
    }

    // Game loop:
    var dt = TimeInterval(0)
    override func update(_ currentTime: TimeInterval) {
        if gameRunning {
            super.update(currentTime)
            checkGameOver()
            if dt > 0 {
                moveRacket(dt: currentTime - dt)
            }
            dt = currentTime
        }
    }

    // Move the racket up or down
    func moveRacket(dt: TimeInterval) {
        if direction == Direction.Up && racket!.position.y < height - racketHeight {
            racket!.position.y = racket!.position.y + CGFloat(racketSpeed * dt)
        } else if direction == Direction.Down && racket!.position.y > 0 {
            racket!.position.y = racket!.position.y - CGFloat(racketSpeed * dt)
        }
    }

    // Check if the ball is still on screen
    // Game Over animation
    func checkGameOver() {
        if ball!.position.x > CGFloat(width) {
            gameRunning = false
            ball!.removeFromParent()
            let gameOverLabel = SKLabelNode(text: "Game Over")
            gameOverLabel.position = CGPoint(x: width / 2, y: height / 2)
            gameOverLabel.fontSize = 80
            self.addChild(gameOverLabel)

            // Game Over animation
            let rotateAction = SKAction.rotate(byAngle: CGFloat(M_PI), duration: 1)
            let fadeInAction = SKAction.fadeIn(withDuration: 2)
            gameOverLabel.run(SKAction.repeat(rotateAction, count: 2))
            gameOverLabel.run(SKAction.scale(to: 0, duration: 2.5), completion: {
                gameOverLabel.removeFromParent()
                self.startNewGame()
            })
        }
    }

    // Detect collisions between ball and racket to increase the score
    func didBegin(_ contact: SKPhysicsContact) {
        if contact.bodyA.categoryBitMask == CollisionTypes.Racket.rawValue || contact.bodyB.categoryBitMask == CollisionTypes.Racket.rawValue {
            score += 1
            scoreLabel.text = String(score)
        }
    }
}

//Initialize the playground and start the scene:
let skView = SKView(frame: CGRect(origin: CGPoint.zero, size: CGSize(width: width, height: height)))
let scene = gameScene(size: skView.frame.size)
skView.presentScene(scene)

PlaygroundPage.current.liveView = skView