私はSwiftでDoodle Jumpクローンゲームを作成していますが、プレイヤーがジャンプすると、プラットフォームの底に頭が当たって通過しないという問題があります。どのようにすれば、プレイヤーはプラットフォームを通過してジャンプすることができますか?私はここに私のコードを持っています。これを行うにはSpriteキットの片方向プラットフォームの衝突
import SpriteKit
class GameScene: SKScene, SKPhysicsContactDelegate {
var hero = SKSpriteNode(imageNamed: "hero");
var stepSizeTest = SKSpriteNode(imageNamed: "step");
var start = false;
var jumpSpeed = CGFloat(0);
var gravity = CGFloat(0);
var stepPositionDivision:CGFloat = 0 //allows the step to spawn on specific places on y axes
var setpPositionHeightIncrease:CGFloat = 0;
var positionX:CGFloat = 0;
var timeInterval:NSTimeInterval = 0;
var CurTime:NSTimeInterval = 0;
var TimeWhenThePreviousStepSpawned:NSTimeInterval = 0;
var standart:Bool = false;
var move:Bool = false;
var oneJumpOnly:Bool = false;
var cracked:Bool = false;
var jumped:Bool = false;
struct PhysicsCategory{
static var None: UInt32 = 0;
static var step: UInt32 = 0b1;
static var hero: UInt32 = 0b10;
static var All: UInt32 = UInt32.max;
}
func didBeginContact(contact: SKPhysicsContact) {
var contactBody1: SKPhysicsBody;
var contactBody2: SKPhysicsBody;
if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask){
contactBody1 = contact.bodyA;
contactBody2 = contact.bodyB;
}
else{
contactBody1 = contact.bodyB;
contactBody2 = contact.bodyA;
}
if (contactBody1.categoryBitMask == PhysicsCategory.step && contactBody2.categoryBitMask == PhysicsCategory.hero){
jumpSpeed = CGFloat(self.frame.size.height*0.01320422535);
}
// if (contactBody1.categoryBitMask == PhysicsCategory.ground && contactBody2.categoryBitMask == PhysicsCategory.hero){
//
// }
}
override func didMoveToView(view: SKView) {
/* Setup your scene here */
stepPositionDivision = self.frame.size.height/23;
jumpSpeed = CGFloat(self.frame.size.height*0.01320422535);
gravity = CGFloat(self.frame.size.height*(-0.0003521126761));
self.physicsWorld.contactDelegate = self;
self.physicsWorld.gravity = CGVectorMake(0,0);
let sceneBody = SKPhysicsBody(edgeLoopFromRect: self.frame);
sceneBody.friction = 0;
self.physicsBody = sceneBody;
self.hero.anchorPoint = CGPoint(x: 0.5, y: 0.5);
self.hero.position = CGPoint(x:self.frame.size.width/2, y:self.hero.size.height/2);
self.hero.physicsBody = SKPhysicsBody(rectangleOfSize: self.hero.size)
self.hero.physicsBody?.restitution = 1;
self.hero.physicsBody?.affectedByGravity = false;
self.hero.physicsBody?.friction = 0;
self.hero.physicsBody?.categoryBitMask = PhysicsCategory.hero;
self.hero.physicsBody?.collisionBitMask = PhysicsCategory.step;
self.hero.physicsBody?.contactTestBitMask = PhysicsCategory.step;
self.addChild(self.hero);
}
func ranPositionX() -> CGFloat{
let stepSise = UInt32(self.stepSizeTest.size.width)
let posX = arc4random_uniform(UInt32(self.frame.size.width) - stepSise) + stepSise
return CGFloat(posX)
}
func stepSpawn(){
if (setpPositionHeightIncrease < self.frame.size.height){
let step = SKSpriteNode(imageNamed: "step");
let posX = ranPositionX()
step.anchorPoint = CGPoint(x: 0.5, y: 0.5);
step.position = CGPoint(x:posX, y:setpPositionHeightIncrease);
step.physicsBody = SKPhysicsBody(rectangleOfSize: step.size);
step.physicsBody?.affectedByGravity = false;
step.physicsBody?.dynamic = true;
step.physicsBody?.friction = 0;
step.physicsBody?.categoryBitMask = PhysicsCategory.step;
step.physicsBody?.collisionBitMask = PhysicsCategory.None;
step.physicsBody?.contactTestBitMask = PhysicsCategory.hero;
self.addChild(step);
setpPositionHeightIncrease += stepPositionDivision
}
}
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
/* Called when a touch begins */
for touch in touches {
}
}
override func update(currentTime: CFTimeInterval) {
/* Called before each frame is rendered */
self.hero.position.y += jumpSpeed
jumpSpeed += gravity
if (start == false){
//self.hero.physicsBody?.applyImpulse(CGVector(dx: 0, dy: 40))
start = true;
}
stepSpawn()
}
}
ため
categoryBitMask
の特定のビットを予約し、あればある彼らプレーヤの上にある場合は、collisionBitMaskを切り替えて衝突しないようにし、プレーヤの下にある場合は切り替えてください。 –