swift - Swift Pong(No SpriteKit):如何计算球的角度来移动球
问题描述
我正在尝试使用 Swift 制作 Pong 游戏,但没有使用SpriteKit
. 到目前为止,我已经能够在视图上成功绘制一个矩形,并且可以在屏幕上拖动它。这是我当前的代码:
import UIKit
class PongView: UIView {
lazy var paddle: CGRect = {
return CGRect(x: 200,
y: 200,
width: self.frame.width / 6,
height: self.frame.height / 60)
}()
var movePaddle = false
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
let gesture = UIPanGestureRecognizer(target: self, action: #selector(dragPaddle(recognizer:)))
addGestureRecognizer(gesture)
}
override func draw(_ rect: CGRect) {
drawPaddle(rect)
}
func drawPaddle(_ rect: CGRect) {
let path = UIBezierPath(rect: paddle)
UIColor.black.set()
path.fill()
}
func paddleInBounds() -> Bool {
//padding vars are calculated in another file
return (paddle.minX >= frame.minX + leftPadding) &&
(paddle.maxX <= frame.maxX - rightPadding) &&
(paddle.minY >= frame.minY + topPadding) &&
(paddle.maxY <= frame.maxY - bottomPadding)
}
func setPaddleInBounds() {
if (paddle.minX < frame.minX + leftPadding) {
paddle.origin.x = frame.minX + leftPadding
}
if (paddle.maxX > frame.maxX - rightPadding) {
paddle.origin.x = frame.maxX - rightPadding - paddle.width
}
if (paddle.minY < frame.minY + topPadding) {
paddle.origin.y = frame.minY + topPadding
}
if (paddle.maxY > frame.maxY - bottomPadding) {
paddle.origin.y = frame.maxY - bottomPadding - paddle.height
}
}
@objc func dragPaddle(recognizer: UIPanGestureRecognizer) {
print(paddle.origin)
print(paddle.minX)
print(paddle.minY)
if paddleInBounds() {
let translation = recognizer.translation(in: self)
paddle.origin = CGPoint(x: paddle.minX + translation.x, y: paddle.minY + translation.y)
recognizer.setTranslation(CGPoint.zero, in: self)
setNeedsDisplay()
} else {
setPaddleInBounds()
}
}
}
现在我想创建球。不过,我不确定如何开始。碰撞应该很容易:
if (ball coordinates are within boundaries) ||
(ball coordinates touch paddle coordinates) {
//collision detected
}
但是没有SpriteKit
,我不确定如何计算球的反弹角度并相应地移动球,这是游戏的主要部分。有什么建议么?
解决方案
简而言之,如果到达 x 边界,则需要反转球速度“x”,如果到达 y 边界,则需要反转“y”。
考虑到没有摩擦或加速度,也没有其他因素影响速度。假设球向右下角移动 60 度并击中右边界。它需要以相同的“y”速度在下方行进,同时以相同的“x”速度向左返回。当它到达底部边界时,它仍然会向左移动,同时以相同的“y”速度返回顶部。
var posX = 0
var posY = 0
var velX = 5
var velY = 8
func moveBall(){
posX += velX
posY += velY
if collideOnXBoundary {
velX = -velX
}
if collideOnYBoundary {
velY = -velY
}
}
您可以使用此速度为球创建一个完整的物理场。改变它的值来加速,在它移动时使用摩擦来减慢它的速度,使用加速度、扭矩等来创建不同的机制。
推荐阅读
- flutter - Flutter AnimatedList - 将 CurvedAnimation 添加到 SlideTransition
- xslt - XSL 两个条件表达式 If Test
- r - 将变量粘贴到 mutate_at 函数中以改变特定列(如果存在)
- django - 如何在 Django 中对 JSON 列表类结构应用查询过滤
- javascript - 每次发送 Ajax 响应时都会更改值
- hibernate - Hibernate CascadeType.Persist 创建一个选择查询
- sql-server - 将 SQL Server onPrem 可用性组同步到 Azure SQL 数据库
- python - 无论不常见的成员如何,如何根据较长的列表对较短的列表进行排序?
- rust - 在过程宏中,如何检查字符串是否是有效的变量名而不是关键字?
- keras - 用于测试分类时,ktrain 包是否将输入嵌入与 bert 嵌入相结合?