我已经开始做一个小的
swift / spritekit项目来教我自己的游戏开发.
它以等距地图开始,我设法绘制.
但是我在地图的不同瓷砖上获得精确的触摸位置时遇到了麻烦.
它有效,但有点不合适,似乎不一致.
它以等距地图开始,我设法绘制.
但是我在地图的不同瓷砖上获得精确的触摸位置时遇到了麻烦.
它有效,但有点不合适,似乎不一致.
这是我的功能:
class PlayScene: SKScene { let map = SKNode() override func didMoveToView(view: SKView) { let origin = view.frame.origin let mapOrigin = CGPointMake(origin.x + self.frame.width / 4,origin.y - self.frame.height / 4) let mapConfig: Int[][] = [[0,1,0],[0,[2,2,2],0]] drawMap(mapConfig,mapOrigin: mapOrigin) }
用:
func drawMap(mapConfig:Int[][],mapOrigin:CGPoint) { let tileHeight:CGFloat = 25.5 let numColumns:Int = 8 let numRows:Int = 8 var position = mapOrigin var column: Int = 0 var row: Int = 0 for column = 0; column < numColumns; column++ { for row = 0; row < numRows; row++ { position.x = mapOrigin.x + CGFloat(column) * tileHeight position.y = mapOrigin.y + CGFloat(row) * tileHeight let isoPosition = twoDToIso(position) placeTile(isoPosition,mapConfig: mapConfig[row][column]) } } self.addChild(map) } func placeTile(position:CGPoint,mapConfig:Int) { switch mapConfig { case 0: let sprite = SKSpriteNode(imageNamed:"grassTile") sprite.position = position sprite.setScale(0.1) sprite.name = "\(position)" self.map.addChild(sprite) case 1: let sprite = SKSpriteNode(imageNamed:"roadTile") sprite.position = position sprite.setScale(0.1) sprite.name = "\(position)" self.map.addChild(sprite) default: let sprite = SKSpriteNode(imageNamed:"roadTileLTR") sprite.position = position sprite.setScale(0.1) sprite.name = "\(position)" self.map.addChild(sprite) } }
然后我想隐藏我触摸的瓷砖(用于测试):
override func touchesBegan(touches: NSSet,withEvent event: UIEvent) { for touch: AnyObject in touches { let locationNode = touch.locationInNode(self) nodeAtPoint(locationNode).hidden = true } }
但它并不总是隐藏正确的瓷砖.
那我该怎么解决呢?我的代码是否根本错误(可能)?或者我需要以某种方式将位置转换为iso坐标?或者玩瓷砖位面罩?
无论如何,谢谢你的帮助!
解决方法
我在等轴测图中遇到了类似的问题.
问题是您单击的节点大于显示的节点(它具有透明部分).有关该问题的更好解释,请参阅my question here.
1.在tile的边缘之后创建一个CGPathRef(tileSize是纹理的大小).此代码适用于常规等距切片,而不是六边形,但想法是相同的.
// ObjC -(CGPathRef)createTextureFrame:(CGSize)tileSize { CGMutablePathRef path = CGPathCreateMutable(); CGPathMoveToPoint(path,NULL,-(self.tileSize.height / 2)); CGPathAddLineToPoint(path,(self.tileSize.width / 2),0); CGPathAddLineToPoint(path,(self.tileSize.height / 2)); CGPathAddLineToPoint(path,-(self.tileSize.width / 2),0); CGPathCloseSubpath(path); return path; } // Swift func createTextureFrame(tileSize:CGSize) -> CGPathRef { CGMutablePathRef path = CGPathCreateMutable() CGPathMoveToPoint(path,nil,-(self.tileSize.height / 2)) CGPathAddLineToPoint(path,0) CGPathAddLineToPoint(path,(self.tileSize.height / 2)) CGPathAddLineToPoint(path,0) CGPathCloseSubpath(path) return path }
2.创建一个函数,检查给定的点是否在CGPathRef(textureFrame)中.
// ObjC -(BOOL)isPointOnNode:(CGPoint)point { return CGPathContainsPoint(textureFrame,point,YES); } // Swift func isPointOnNode(point:CGPoint) -> Bool { return CGPathContainsPoint(textureFrame,YES) }
3.对于每个触摸的节点,检查我们所在的textureFrame.
// ObjC UITouch *touch = [touches anyObject]; NSArray *nodes = [self nodesAtPoint:[touch locationInNode:self]]; for (SKNode *node in nodes) { CGPoint locationInNode = [touch locationInNode:node]; if ([node isPointOnNode:locationInNode]) { node.hidden = YES; } } // Swift var touch = touches.anyObject() as UITouch var nodes = self.nodesAtPoint(touch.locationInNode(self)) for node in nodes as [SKNode] { var locationInNode = touch.locationInNode(node) if node.isPointOnNode() { node.hidden = true } }