【问题标题】:Is there a way to detect if a UIView is touching another UIView? Swift 4有没有办法检测一个 UIView 是否正在触摸另一个 UIView?斯威夫特 4
【发布时间】:2018-03-08 09:27:08
【问题描述】:

我一直在开发一个滚动的无尽奔跑游戏(在 Swift 4 中),我想检测玩家是否正在触摸块/瓷砖。目前,我正在使用此代码:

let centerX = Float(UIScreen.main.bounds.size.width) / 2
for i2 in 0...tiles.count-1 {
    if scrollX + centerX > Float(tilePosition[i2][0] - 60) {
        if scrollX + centerX < Float(tilePosition[i2][0] + 60) {
            if Int(player.center.y) > tilePosition[i2][1] - blockFloatings[playerFrame] {
                if Int(player.center.y) < tilePosition[i2][1] + blockFloatings[playerFrame] {
                    while Int(player.center.y) > tilePosition[i2][1] - blockFloatings[playerFrame] {
                        playerGravity = 0
                        player.center.y = player.center.y - CGFloat(1)
                    }
                }
            }
        }
    }
}

代码有效,但不够准确。我有圆形瓷砖,如this,还有波浪形顶部的瓷砖,如this

现在,我的代码假定图块是正方形,但有时不是。如果图块不是正方形,就像水一样,我想要它,这样当你向右或向左移动时,玩家就会上下移动。

如果您要回答这个问题,以下是您可能需要了解的有关我当前代码的一些事项:

centerX - 屏幕中间

tiles - 块/图块的UIImageView()

scrollX - X 中的卷轴

tilePosition - 包含块/图块位置的数组

blockFloatings - 玩家UIImageView() 将改变图像,每张图像的高度不同。该数组包含玩家不应该从地面跌落的数字(减去 y 位置)

playerFrame - 播放器的图片ID

player - 代表玩家的UIImageView()

playerGravity - 表示玩家每帧应该以多快的速度摔倒的变量

编辑:你也可以回答不可能。

【问题讨论】:

  • 你不会用 UIKit 获得更好的碰撞检测,至少不容易。如果您想检测与自定义形状的碰撞,您应该查看SpriteKit 和/或其他游戏和物理引擎。

标签: ios swift


【解决方案1】:

您可以尝试使用:

bool CGRectIntersectsRect(CGRect rect1, CGRect rect2);

通过将玩家的框架和瓷砖的框架作为参数传递。

文档链接:

https://developer.apple.com/documentation/coregraphics/1454747-cgrectintersectsrect

【讨论】:

  • 我认为 OP 在他的问题中表示他想要更准确的简单框架交叉点。您使用CGRectIntersectsRect 的建议看起来确实是一种改进,但似乎并没有回答问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-19
  • 1970-01-01
  • 1970-01-01
  • 2015-01-02
  • 2011-02-17
  • 2016-04-24
相关资源
最近更新 更多