Ios 为什么赢了';我的操场上没有任何东西出现吗?
我在Swift操场上玩了一个乒乓球游戏,这是我根据在线教程制作的,但我的助理编辑什么都不展示!我的乒乓球游戏呢!?我的代码在图片下方,显示没有显示任何内容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 箱拍
导入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