gpt4 book ai didi

ios - 我正在使用 swift 构建一个船舶游戏。无法检测碰撞

转载 作者:行者123 更新时间:2023-11-28 10:14:17 25 4
gpt4 key购买 nike

我正在使用 swift 构建一个船舶游戏。目标是避开传入的石头并随着等级的增加获得尽可能多的分数。石头从相反的方向撞到船。但是我无法检测到船和石头之间的碰撞,石头穿过船。船可以向左或向右移动。

我使用 rect1.interects(rect2) 作为交集。

谢谢。

这里是 ViewController.swift

import UIKit

class ViewController: UIViewController {


@IBOutlet weak var moveWater: MovingWater!

var boat:UIImageView!
var stone:UIImageView!
var boatLeftRight : UILongPressGestureRecognizer!

var tapTimer:Timer!

var leftM:UInt32 = 55
var rightM:UInt32 = 250

var leftS:UInt32 = 35
var rightS:UInt32 = 220

func startGame() {
boat = UIImageView(image: UIImage(named: "boat"))
boat.frame = CGRect(x: 0, y: 0, width: 60, height: 90)
boat.frame.origin.y = self.view.bounds.height - boat.frame.size.height - 10
boat.center.x = self.view.bounds.midX

self.view.insertSubview(boat, aboveSubview: moveWater)

boatLeftRight = UILongPressGestureRecognizer(target: self, action: #selector(ViewController.leftRight(tap:)))
boatLeftRight.minimumPressDuration = 0.001
moveWater.addGestureRecognizer(boatLeftRight)



}

func leftRight(tap:UILongPressGestureRecognizer) {


if tap.state == UIGestureRecognizerState.ended {
if (tapTimer != nil) {
self.tapTimer.invalidate()
}
} else if tap.state == UIGestureRecognizerState.began {
let touch = tap.location(in: moveWater)
if touch.x > moveWater.frame.midX {
tapTimer = Timer.scheduledTimer(timeInterval: TimeInterval(0.005), target: self, selector: #selector(ViewController.moveBoat(time:)), userInfo: "right", repeats: true)

} else {
tapTimer = Timer.scheduledTimer(timeInterval: TimeInterval(0.005), target: self, selector: #selector(ViewController.moveBoat(time:)), userInfo: "left", repeats: true)
}
}


}

func moveBoat(time:Timer) {

if let d = time.userInfo as? String! {
var bot2 = boat.frame

if d == "right" {
if bot2.origin.x < CGFloat(rightM) {
bot2.origin.x += 2
}



} else {
if bot2.origin.x > CGFloat(leftM) {
bot2.origin.x -= 2

}
}
boat.frame = bot2
}



}

func movingStone() {


stone = UIImageView(image: UIImage(named: "stones.png"))

var stone2 = leftS + arc4random() % rightS


stone.bounds = CGRect(x:10, y:10, width:81.0, height:124.0)
stone.contentMode = .center;
stone.layer.position = CGPoint(x: Int(stone2), y: 10)
stone.transform = CGAffineTransform(rotationAngle: 3.142)


self.view.insertSubview(stone, aboveSubview: moveWater)


UIView.animate(withDuration: 5, delay: 0, options: UIViewAnimationOptions.curveLinear, animations: { () -> Void in
self.stone.frame.origin.y = self.view.bounds.height + self.stone.frame.height + 10
}) { (success:Bool) -> Void in

self.stone.removeFromSuperview()
self.movingStone()

}



}
func update() {
if(boat.bounds.intersects(stone.bounds)) {
boat.image = //set new image
}
}


override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
moveWater.backgroundStart()
startGame()
movingStone()
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}

最佳答案

我看到了你自己的答案。这确实是基本的碰撞检测。您仍然应该看看 SpriteKit。我看到您正在使用定时器,这不是最好的方法,因为从长远来看,定时器会给您带来性能问题。这是开始游戏开发时的常见错误。

也许你认为你可以通过设置一个非常快的定时器来保证帧速率。问题是计时器不一致,而且它们的优先级也很低。这意味着如果后台发生更重要的事情,您的计时器调用将被延迟。如果您的运动基于强制刷新率,它会很快变得不稳定。此外,根据您使用的逻辑,您在计时器中运行的代码可能会变快或变慢。

SpriteKit 为您提供了每帧运行的更新功能,让您了解每一帧的当前系统时间。通过跟踪该值,您可以计算出两帧之间经过了多少时间,然后您可以相应地缩放您的运动以补偿两帧之间的时间差。

除此之外,SpriteKit 还为您提供了一系列用于碰撞检测和移动的选项。它集成了制作精良的物理引擎和碰撞检测系统。它还将对复杂形状进行碰撞检测,对物体施加力等。

我强烈建议您点击上面答案中提供给您的 Ray Wenderlich 网站链接。如果您有预算,您可能还想购买他们关于如何为 Apple 设备制作 2D 游戏的书。我已经从头到尾读完了,我可以说我喜欢它。我现在可以使用 SpriteKit 做我自己的事情,它也是新手快速学习的一个很好的入门。

关于ios - 我正在使用 swift 构建一个船舶游戏。无法检测碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43384468/

25 4 0
文章推荐: swift - 实体名称为零的核心数据实体
文章推荐: css - 为什么 Chrome 浏览器会更改边框大小而不是将其设置为我要求的大小?
文章推荐: css - 即使内容更小,HTML
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com