Как получить точное положение касания SKShapeNode?

Если фигура прямоугольная, положение касания точно правильное. но если фигура содержит прозрачную область (например, треугольник ниже), когда пользователь нажимает на прозрачную область (это пустое место на экране), прикосновение также допустимо.

введите здесь описание изображения

Когда на экране много фигур, пользователь может нажать на правильную позицию, но получить неправильную форму. Например, если пользователь хочет выбрать зеленый треугольник и коснуться красной точки, но выбранная фигура будет розовым треугольником, потому что zPosition розового треугольника выше зеленого треугольника, а позиция касания находится внутри прозрачной области розового треугольника.

введите здесь описание изображения

Вот коды для создания формы в начале:

var touchShapeName:String!
var currShape: SKShapeNode!
var shapeArr = [SKShapeNode]()

создание фигур:

    for i in 1...count {
    let shape = SKShapeNode()
    shape.path = petalPath
    shape.strokeColor = UIColor(red: 0.9, green: 0.7, blue: 0.1, alpha: 1.0)
    shape.lineWidth = 0.1
    shape.glowWidth = 0.1
    shape.fillColor = UIColor(red: getRandomColor(245, 255), green: getRandomColor(190, 210), blue: getRandomColor(10, 15), alpha: 0.98)
    shape.name = "\(i)"
    shape.position = CGPoint(x: frame.midX + CGFloat( 30 * i ), y:frame.midY + 60)
    addChild(shape)
shapArr.append(shape)
}

Я использую следующие коды, чтобы получить форму:

   override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        let touch = touches.first
        let location = touch?.location(in: self)
        touchShapeName = self.atPoint(location!).name
        if currShape == nil{
            for s in shapeArr{
                if s.name == touchShapeName{
                    currShape = s
                }
            }
        }
    }

Теперь фигуры можно создавать и перемещать, нажимая на цветную область. Проблема в том, что нажатие на фигуру с верхней прозрачной областью может привести к неправильной форме, как я объяснял выше.

Пишу ли я правильные коды? Есть ли другое решение, чтобы получить точную позицию?

Спасибо.


person jdleung    schedule 17.03.2017    source источник
comment
Да, это правильный код для получения точного местоположения. Хотя вы можете не щелкнуть фактическое изображение, я имею в виду зеленое изображение, но, согласно экрану, щелкнутая часть дает вам точную точку.   -  person Poles    schedule 17.03.2017
comment
Согласен с @poles. Кроме того, если вам нужны координаты касания относительно зеленой формы, см. метод convert(_:​to:​) в SKNode.   -  person Ali Beadle    schedule 18.03.2017
comment
@AliBeadle может сказать, как получить его с помощью метода convert(_:to:)? Я попробовал currShape = SKShapeNode() convert(location!, to: currShape) print(currShape.name), но напечатал ноль.   -  person jdleung    schedule 19.03.2017
comment
@jdleung Вы вызываете convert экземпляр SKNode, в котором в данный момент находится точка (в вашем случае это будет сцена, которая является SKNode), и передаете ему экземпляр, в котором вы хотите, чтобы координата была. Результатом является другая координата. Итак: пусть newPoint = convert(location!, to: currShape) print(newPoint) (но мне действительно не нравится такое принудительное развертывание местоположения - поищите более безопасные дополнительные методы развертывания).   -  person Ali Beadle    schedule 19.03.2017
comment
@AliBadle извините, я все еще не могу получить форму с более низким zPosition. ;-(   -  person jdleung    schedule 20.03.2017
comment
Вам нужно опубликовать новый вопрос с вашим кодом и результатами, а также конкретный вопрос.   -  person Ali Beadle    schedule 21.03.2017
comment
@AliBeadle Я отредактировал вопрос и опубликовал свои пробные коды. Кстати, мне нужно получить зеленый треугольник (отмеченный именем), нажав на красную точку. Спасибо.   -  person jdleung    schedule 22.03.2017
comment
let shape = SKShapeNode() всегда будет возвращать нулевое имя и позицию, как же иначе? Вы не дали этой новой форме имя или положение (или, если уж на то пошло, форму). Что вы ожидаете, что он будет содержать? Я думаю, что вы упускаете некоторые фундаментальные детали того, как работают SpriteKit и Swift, и вам нужно вернуться к более простым примерам.   -  person Ali Beadle    schedule 22.03.2017
comment
@AliBeadle формы были созданы с именем, мне нужно получить форму и ее имя при нажатии. кажется, ваш метод возвращает только CGRect. коды только пробные. Я опубликую больше кодов позже. Спасибо.   -  person jdleung    schedule 23.03.2017


Ответы (1)


Я считаю, что вы неправильно используете узел формы здесь: вы пытаетесь оперировать треугольником, выбирая для него прямоугольную форму. Если вы хотите иметь треугольную форму, вам нужно будет использовать соответствующий путь, а не общий прямоугольник. Как только вы представляете треугольник треугольной формой, определение местоположения касания должно быть автоматически зафиксировано.

person SimpleBeat    schedule 22.03.2017
comment
Форма треугольника является примером для объяснения проблемы, на самом деле формы бывают разных видов. Я нарисовал фигуры, и я столкнулся с тем, как выбрать фигуру под прозрачной областью верхней формы. - person jdleung; 22.03.2017