/ / Pripojte Physicsbodies na TileMap v SpriteKit - rýchly, sprite-kit, skphysicsbody, sktilemapnode

Pripojte Physicsbodies na TileMap v SpriteKit - swift, sprite-kit, skphysicsbody, sktilemapnode

Nasledujúcu funkciu používam na pridanie fyzických telies na dlaždice zo súboru SKTileMapNode:

 static func addPhysicsBody(to tileMap: SKTileMapNode, and tileInfo: String){

let tileSize = tileMap.tileSize
let halfWidth = CGFloat(tileMap.numberOfColumns) / 2 * tileSize.width
let halfHeight = CGFloat(tileMap.numberOfRows) / 2 * tileSize.height

for row in 0..<tileMap.numberOfColumns{
for column in 0..<tileMap.numberOfRows{
let tileDefinition = tileMap.tileDefinition(atColumn: column, row: row)
let isCorrectTile = tileDefinition?.userData?[tileInfo] as? Bool
if isCorrectTile ?? false && tileInfo == "wall"{

let x = CGFloat(column) * tileSize.width - halfWidth
let y = CGFloat(row) * tileSize.height - halfHeight

let tileNode = SKNode()
tileNode.position = CGPoint(x: x, y: y)
tileNode.physicsBody = SKPhysicsBody.init(rectangleOf: tileSize, center: CGPoint(x: tileSize.width / 2, y: tileSize.height / 2))
tileNode.physicsBody!.isDynamic = false
tileNode.physicsBody!.restitution = 0.0
tileNode.physicsBody!.categoryBitMask = Constants.PhysicsCategories.wall
tileNode.physicsBody!.collisionBitMask = Constants.PhysicsCategories.player | Constants.PhysicsCategories.npc | Constants.PhysicsCategories.enemy
nodesForGraph.append(tileNode)
tileMap.addChild(tileNode)
}
}
}
}

Ak to však použijem, na každú dlaždicu mám fyzického tela. Chcem prepojiť fyzické telesá s väčšími, aby som dosiahol lepší výkon. Viem, že to môže byť s init(bodies: [SKPhysicsBody]). Ale ako to môžem urobiť?
Ako zistím, ktorý orgán je vedľa iného orgánu a zoskupím ich?
Fyzikálne telá v dlaždici mapy nie sú všetky ďalšiemedzi sebou. Niektoré sú veľké bloky fyzikálnych telies, iné sú jednotlivé fyzické telieska a vedľa nich nie sú žiadne telá. Takže nemôžem „dať každého fyzika do poľa a zoskupiť ho.
Tu je obrázok, ktorý ukazuje, ako to momentálne vyzerá.

Fyzika TileMap

Dúfam, že vysvetlenie je dostatočne jasné. Ak nie, pokúsim sa to lepšie vysvetliť.

Urobil to už niekto predtým a môže ma nasmerovať správnym smerom? Ocenil by som každú pomoc.

ÚPRAVA: Predtým, ako som to skúsil:

static var bodies = [SKPhysicsBody]()
static func addPhysicsBody(to tileMap: SKTileMapNode, and tileInfo: String){

let tileSize = tileMap.tileSize
let halfWidth = CGFloat(tileMap.numberOfColumns) / 2 * tileSize.width
let halfHeight = CGFloat(tileMap.numberOfRows) / 2 * tileSize.height

for column in 0..<tileMap.numberOfColumns{
for row in 0..<tileMap.numberOfRows{
let tileDefinition = tileMap.tileDefinition(atColumn: column, row: row)
let isCorrectTile = tileDefinition?.userData?[tileInfo] as? Bool
if isCorrectTile ?? false && tileInfo == "wall"{

let x = CGFloat(column) * tileSize.width - halfWidth
let y = CGFloat(row) * tileSize.height - halfHeight

let tileNode = SKNode()
tileNode.position = CGPoint(x: x, y: y)
tileNode.physicsBody = SKPhysicsBody.init(rectangleOf: tileSize, center: CGPoint(x: tileSize.width / 2, y: tileSize.height / 2))
tileNode.physicsBody!.isDynamic = false
tileNode.physicsBody!.restitution = 0.0
tileNode.physicsBody!.categoryBitMask = Constants.PhysicsCategories.wall
tileNode.physicsBody!.collisionBitMask = Constants.PhysicsCategories.player | Constants.PhysicsCategories.npc | Constants.PhysicsCategories.enemy
//nodesForGraph.append(tileNode)
bodies.append(tileNode.physicsBody!)
tileMap.addChild(tileNode)
}
}
}
tileMap.physicsBody = SKPhysicsBody(bodies: bodies)
}

Ale keď to urobím, fyzikálne telá sú úplne pokazené ..

odpovede:

0 pre odpoveď č. 1

Ako zdôraznil Knight0fDragon, neexistuje spôsob, akourobte presne to, čo ste sa pýtali. Dlaždicové mapy v aplikácii SpriteKit bohužiaľ zostávajú veľmi požadované. Môžete však vyskúšať túto techniku ​​na zníženie počtu telies fyziky.

Nápad č. 1 - Ručne nakreslite svoje fyzikálne telá

Vytvorte si svoju mapu dlaždíc v editore. Stačí namaľovať textúry dlaždíc na mapu; nepriraďujte k nim žiadne telesá fyziky. Potom pokračujte v práci v editore a presúvajte Color Sprites (SKSpriteNodes) na častiach vašej mapy, ktoré potrebujú telo fyziky.Tvarujte uzly tak, aby bol čo najväčší obdĺžnik pre oblasti, ktoré potrebujú telesá fyziky. Toto funguje najlepšie pre veľké a rovné povrchy, ako sú steny, podlahy, stropy, plošiny, debny atď. Je to namáhavé, ale v simulácii budete mať oveľa menej fyzických telies, ako keby ste automaticky priradili telá všetkým dlaždiciam, ako ste vy robí.

Nápad č. 2 - Nepoužívajte žiadne fyzikálne telá

Táto myšlienka by si pravdepodobne vyžiadala ešte viac práce,ale mohli by ste sa vyhnúť úplnému použitiu fyzikálnych telies. Najskôr si v editore vytvorte mapu svojich dlaždíc. Analyzujte svoju mapu a zistite, ktoré dlaždice označujú prekážku, za ktorú by hráč nemal prekročiť. Priraďte identifikátor údajov používateľa k tomuto typu dlaždice. Potrebovali by ste rôzne kategórie identifikátorov pre rôzne typy prekážok a možno budete musieť navrhnúť svoje umelecké dielo tak, aby vyhovovalo tomuto prístupu.

Akonáhle sú vaše bariérové ​​dlaždice dostatočneidentifikovaný, napíšte kód, ktorý skontroluje hodnotu používateľských údajov dlaždice, ktorá je momentálne obsadená hráčskym skřítkom, a podľa toho obmedzí pohyb skřítka. Napríklad, ak hráč zadá titul, ktorý označuje hornú hranicu, váš pohybový kód by neumožnil rovnako ako ak hráč vstúpi do dlaždice, ktorá označuje hranicu úplne vľavo, váš pohybový kód nenechá hráča cestovať doľava.

Môžete sa pozrieť tento súvisiaci príspevok kde v podstate navrhujem rovnaké nápady. Dlaždicové mapy SpriteKit bohužiaľ nemajú pre tento problém ideálne riešenie.