「敵」をすべての境界から逸らすようにしようとしています。例えば、敵が画面の左、右、上、下に衝突すると、方向が変わるはずです。どのようにしてオブジェクトを素早くエッジから跳ね返させるのですか
これは私の現在のコードです:
import SpriteKit
import GameplayKit
struct Physics {
static let Enemy: UInt32 = 0x1 << 1
let BorderCategory : UInt32 = 0x1 << 2
let BottomCategory : UInt32 = 0x1 << 3
let BallCategory : UInt32 = 0x1 << 4
}
class GameScene: SKScene {
var Enemy = SKSpriteNode()
var gameStarted = Bool()
var gameState = "running"
var destX : CGFloat = 0.0
var destY : CGFloat = 0.0
var score = 0
override func didMove(to view: SKView) {
let borderBody = SKPhysicsBody(edgeLoopFrom: self.frame)
borderBody.friction = 0
self.physicsBody = borderBody
let screenSize: CGRect = UIScreen.main().bounds // get the screen size
let screenWidth = screenSize.width //get the width
let screenHeight = screenSize.height //get the height
Enemy = SKSpriteNode(imageNamed: "red2")
Enemy.size = CGSize(width: 60, height: 70)
Enemy.position = (CGPoint(x: self.frame.width/6 - Enemy.frame.width, y: self.frame.height/10))
Enemy.physicsBody = SKPhysicsBody(circleOfRadius: Enemy.frame.height/2)
Enemy.physicsBody?.categoryBitMask = Physics.Enemy
//Enemy.physicsBody?.categoryBitMask = Physics.Ground | Physics.wall
//Enemy.physicsBody?.contactTestBitMask = Physics.Ground | Physics.wall
Enemy.physicsBody?.affectedByGravity = false
Enemy.physicsBody?.isDynamic = true
self.addChild(Enemy)
Enemy.physicsBody?.velocity = CGVector(dx: 50, dy: 50)
if (Enemy.position.x == screenWidth) {
Enemy.physicsBody?.velocity = CGVector(dx: -50, dy: 0) // change direction at edge DOESN'T WORK
}
if(Enemy.position.y == screenHeight){
Enemy.physicsBody?.velocity = CGVector(dx: 0, dy: -50) //change direction at edge DOESN'T WORK
}
}
私は非常にプログラマブルなので、どんなばかばかしい文についても私を許しています。これは敵が一度両脇から跳ね返るだけです。私は敵が画面の周りを跳ね続けることを望んでいた。これを行う方法はありますか?また、敵の位置をフレーム幅/ 2、フレームの高さ/ 2に設定しても、敵を画面の中央に配置することはありません。なぜこのようなことが起こったのか考えていますか? – Tom
上記のいずれかを変更していない限り、このコードは敵を「時の終わり」までバウンスさせます。 (私はこれを自分で確認するために構築しました)。おそらく、私の返事の最後にある_my_質問への答えは、途中であなたを導く可能性があります。どのようにシーンを作成し、そのサイズは(画面に比べて)何ですか? –