swift – 获取特定区域中的节点列表?

我在一个侧面游戏中工作,我需要知道一个区域中的节点是否能够实现“视线”之类的东西.现在我正在尝试使用enumerateBodyiesInRect()但是它正在检测来自评估的rect的20px或更多的物体,我无法弄清楚为什么它如此不精确.

这就是我现在正在尝试的事情:

import SpriteKit
import CoreMotion

class GameScene: SKScene,SKPhysicsContactDelegate
{
var player = SKShapeNode()
var world = SKShapeNode()
var rShape = SKShapeNode()

override func didMovetoView(view: SKView) {
    self.physicsWorld.contactDelegate = self
    self.scaleMode = SKScenescaleMode.AspectFit
    self.size = view.bounds.size

    // Add world
    world = SKShapeNode(rectOfSize: view.bounds.size)
    world.physicsBody = SKPhysicsBody(edgeLoopFromPath: world.path)
    world.position = CGPointMake(self.frame.size.width/2,self.frame.size.height/2) // Move camera
    self.addChild(world)

    // Add player
    player = SKShapeNode(rectOfSize: CGSize(width: 25,height: 25))
    player.physicsBody = SKPhysicsBody(rectangleOfSize: player.frame.size)
    player.physicsBody.dynamic = false
    player.strokeColor = SKColor.blueColor()
    player.fillColor = SKColor.blueColor()
    player.position = CGPointMake(90,-50)
    world.addChild(player)
    }


override func update(currentTime: CFTimeInterval) {
    // Define rect position and size (area that will be evaluated for bodies)
    var r : CGRect = CGRect(x: 200,y: 200,width: 25,height: 25)

    // Show rect for debug
    rShape.removeFromParent()
    rShape = SKShapeNode(rect: r)
    rShape.strokeColor = SKColor.redColor()
    self.addChild(rShape)

    // Evaluate rect
    rShape.fillColor = SKColor.clearColor()
    self.physicsWorld.enumerateBodiesInRect(r) {
        (body: SKPhysicsBody!,stop: UnsafePointer<ObjCBool>) in
         self.rShape.fillColor = SKColor.redColor() // Paint the area blue if it detects a node
         }
    }
}

代码应在屏幕上显示已评估的rect和ray(用于调试目的),如果它们与播放器节点联系,则将其绘制为红色.但是你可以在屏幕截图中看到当玩家离它25px或更远时它变成红色,就像绘图有点偏离,或者小于被评估的实际区域.您可以将其粘贴到项目中以复制问题.

这可能是因为这只是测试版,还是我做错了什么?

解决方法

您正在创建一个物理世界,其中存在具有“特殊属性”的特定矩形 – 这是您在enumerateBodiesInRect()中使用的矩形.为什么不创建一个具有所需矩形尺寸的隐形惰性物理体,然后使用SKPhysicsBody检查碰撞和/或接触?然后,您可以使用allContactedBodies()或一些委托回调来了解特殊矩形内的其他实体.

可以把它想象成“拖拉机梁”或“经线矩形”.

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...