gpt4 book ai didi

swift - Sprite Kit 中的单向平台碰撞

转载 作者:搜寻专家 更新时间:2023-10-31 08:22:32 24 4
gpt4 key购买 nike

我正在用 Swift 制作一个 Doodle Jump 克隆游戏,问题是当玩家跳跃时,它的头撞到了平台底部并且没有通过。我怎样才能让玩家越过平台并跳过它们?我的代码在这里:

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()
}
}

最佳答案

实现此目的的一种方法是在英雄坠落或跳跃时打开/关闭适当的碰撞位。如果速度的 dy 属性小于零,则英雄正在下落;如果 dy 大于零,则英雄会跳跃(或弹起)。以下是如何执行此操作的示例:

// Add this to the update method
if let body = hero.physicsBody {
let dy = body.velocity.dy
if dy > 0 {
// Prevent collisions if the hero is jumping
body.collisionBitMask &= ~PhysicsCategory.step
}
else {
// Allow collisions if the hero is falling
body.collisionBitMask |= PhysicsCategory.step
}
}

关于swift - Sprite Kit 中的单向平台碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39428866/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com