Buraya kadaryaptığımızişlemdebob bir park projesioluşturduk。 Şimdiise SpriteKit游乐场 ‘ınıoluşturalımve
导入UIKit
导入SpriteKit
导入PlaygroundSupport
kütüphanelerini突出了ekleyelim。
操场支持SpriteKit sahnemizi操场ekranındagörsellemeyeyarayacak。 Bukütüphane,oyunalanısayfasınındurumunugöstermeyeve Xcode ileetkileşimegeçmenizisağlayanbir nesne。 查看>助理编辑>显示助理编辑 kısmı,ekranımızıncanlıgörüntüsügöstermeyeyardımcıolacak。

Şimdiiseaşağıdakikodları突出ekleyelim。
// 1
//1.1
让sceneView = SKView(frame:CGRect(x:0,y:0,width:480,
高度:320))
//1.2
让场景= SKScene(大小:CGSize(宽度:480,高度:320))
sceneView.showsFPS = true
sceneView.presentScene(场景)
// 2
//2.1
PlaygroundPage.current.needsIndefiniteExecution = true
//2.2
PlaygroundPage.current.liveView = sceneView
1- SKView,雪碧套件,图片由nesnedir制作。 图片olarak SKViewgörüntümüzüoluşturdukve frame boyutunu 480×320yaptık。(1.1)。 桑拉(Sonra), SKScene现场演出。 Sahnemiz 480-xnoktasınave 320-ynoktasınasahip oldu。(1.2)。 SKScene,sahneningörüntülenmeküzerecanlandırdığıveoluşturduğuiçeriğisağlar。 Bir sahneyigörüntülemekiçin,来自SKView nesnesindensunarız。 presentScene ileoluşturduğumuzscene’i,view’desunmasınıistedik。
2- PlaygroundPage ; nesnelerincanlıbirgörünümünüyönetmenizive oyunalanınınyürütülmesinikontrol etmenizisağlar。
(2.1版)İlkve enönemlisi,kodumuzun和üsttenişlenmeyebaşlandığında和alt koddayürütmenindurdurulması。 Fakat .needsIndefiniteExecutiondeğişkeni ,Xcode’a oyun kodunuzu kaynak koddangeçtiğiandayürütmesiniiptal etmemesinisöyler。 Bir oyun prototipinde kodiçindekilerinsürekliolarakçalışmasınıisteriz。 Böylelikleekranımızdakideğişikliklericanlıolarakdevamlışekildegörebiliriz。 Varsayılandeğerifalse’tur。
(2.2)Asistaneditör,canlıgörünümünmevcut durumunu render eder。 Kaydedilengörüntüyügeri sarma,ileri sarma ve kayma yapabilmeniziçinzamaniçindekigörüntüyükaydeder。 Bunu iseanlıkolarakgösterir。
Canlıgörüntüyügörüntülemekiçin.needsIndefiniteExecutionöğesinin 真正的 deererineayarlanmasınıgereklidir。 LiveView无效olmayan birdeğereayarlandığında,sistem .needsIndefiniteExecution或真实olarak ayarlar。
480×320男孩画的艺术作品和艺术作品。

Bor bir park ile oy oynamakeğlencesizdir,öyleyseşimdiiçerisinebirkaçSprite ekleyelim。
Dosyalar linkinden bu projemizdelazımolacakSprite’larıindirelim。
Ve View> Navigators> Show Project Navigator’dan Resourcesaltınaindirdiğimizdosyalarısürükleyelim 。

SpriteKitPhysicsTest’e geridönelimveaşağıdakikodlarıyazalım:
let square = SKSpriteNode(imageNamed:“ square”)
square.name =“形状”
square.position = CGPoint(x:scene.size.width * 0.25,
y:scene.size.height * 0.50)
let circle = SKSpriteNode(imageNamed:“ circle”)
circle.name =“形状”
circle.position = CGPoint(x:scene.size.width * 0.50,
y:scene.size.height * 0.50)
让三角形= SKSpriteNode(imageNamed:“ triangle”)
triangle.name =“形状”
三角形位置= CGPoint(x:scene.size.width * 0.75,
y:scene.size.height * 0.50)
Sprite’lar,sahnedeki,çoğunu,oluşturmak,kullanılan,temel,yapı,taşlarıdır。 Kare,daire veüçgenadında3 adet SKSpriteNodeoluşturdukveeşleşengörüntülerionlaraatadık。 SKSpriteNode(imageNamed :),birgörüntüdosyasıkullanarak精灵节点oluşturmakiçinkullanılır。
.name ile onlara belirleyici birer isim verdik。
.position ileSprite’larımızınekranda neredeolacaklarınıbelirledik。 Kareyi x:120,y:160noktasına,daireyi x:240,y:160noktasınaveüçgenix:360,y:120noktasınakoyduk,ancak yine deonlarıekrandagörebilmemiziçinsahnemy eklemeniz gerekiy,
scene.addChild(正方形)
scene.addChild(circle)
scene.addChild(triangle)
.addChild(SKNode), sahnedekiçocukdüğümlerilistesinin sonuna birdüğümdaha ekler。 Sprite’larımızıekranımızdagörmekistiyorsak,düğümeklemeişleminiyapmalıyız。

菲兹克·贝登莱里
Fizik bedenlerini,görüntülerimizikaplayan birsınırolarakdüşünebilirsiniz。
circle.physicsBody = SKPhysicsBody(circleOfRadius:
circle.size.width / 2)
Kodunu en alta ekleyelim。
Sprite’lara fizikgövdesini.physicsBody ile ekleriz。 FiziksimülasyonueklemekiçinSKNode nesnesinin物理身体身体身体 SKPhysics身体nesnesiatarız。
SKPhysicsBody(circleOfRadius:) ,dairesel birgövdeoluşturur。 Eğeryarıçapı,dairegenişliğininyarısıolarak verirsek,oluşturduğumuzgövdetam olarakgörüntümüzileeşleşir。
Oyunalanıkodunuzu yenidençalıştırdıktan声乐,您的çekimiile dairedüşüşünügörürsünüz,çokhızlışekildeekrandan kaybolur。

Bir node’a fizikgövdesieklersek,重力(yerçekimi)默认为olarakekranımızaeklenir。 Dairemizin sahnedenkaybolmasınıistemiyorsak,重力’ideğiştirmeliyiz。
scene.physicsWorld.gravity = CGVector(dx:0,dy:0)
kodunu,presentScene(_ :)’den sonrayazalım。 Sahnenin,oyununuzun temel fizik kurulumunu temsil eden .physicsWorldadlıbirözelliğivardır。 Fizikdünyanızınyerçekimivektörünüdeğiştirdiğinizde,她的女同志bedenine uygulanan sabit ivmeyi她的同志。
Yerçekiminisıfırvektörünesıfırlamakiçinkoduyazdığımızda,şimdidaireninaşağıdüşmedenbaşlangıçkonumundakaldığınıgöreceksiniz。
Edge(基纳尔)GövdesiOluşturmak
Objelerimizin ekrandançıkmasınıçoğuzaman istemeyiz。 Buyüzdensahne frame’imize fizikgövdesieklemeliyiz。 .presentScene :()’denöncealttaki kodu ekleyelim。
scene.physicsBody = SKPhysicsBody(edgeLoopFrom:scene.frame)
伊拉克·拉拉克(Ilk olarak),萨嫩宁·肯迪斯(Sahnenin kendisi)伊辛·菲齐克·贝登尼尼(belenini belirleyelim)。 Hatırlayalım,Herhangi bir SpriteKit商店,Ber sahne de birdüğümdür商店。 Buyüzdensahnenin fizik bedenini belirlerkenfarklıbirgövdetürüyarattık; 贝尔·达里·埃里恩·埃恩·基纳尔·登格苏。 圆环ile边缘环arasındaönemlibir farkvardır:
- Dairegövdesi(圆环),dinamik bir fizikgövdesidir,yani hareket eder。 Katıdır,kütlesivardırvebaşkaherhangi bir fizik bedeniyleçarpışabilir。 Fiziksimülasyonu,hacim temelliorganları,hareket ettirmekiçinçeşitligüçleruygulayabilir。
- Kenardöngügövdesi(边缘循环) , statik hacimsiz bir fizikgövdesidir,yani hareket etmemektedir。 Adındandaanlaşılacağıgibi,比尔·基纳尔·德恩格·萨迪斯·比尔·塞克林·基纳尔·拉尔尼 Birkütleyesahipdeğildir,其他人kenardöngübedenleriyleçarpışamaz。 Dines nesnelerkenarlarınıniçindeveyadışındaolabilir。
Bir kenardöngügövdesiiçinenyaygınkullanım ,çarpışmaalanlarınıtanımlamaktır。

scene.physicsWorld.gravity = CGVector(dx:0,dy:-9.8)
Gravity’i tekrardan -9.8değerinivererek kodumuzuçalıştıralım。

Boyutumuzunsınırlarında静态bier fizikgövdesioluşturmuşolduk,böylelikledairemiziekranımızdançıkamadı。
DikdörtgenselGövdeler
满意的价格和价格:
square.physicsBody = SKPhysicsBody(rectangleOf:
square.frame.size)

Dikdörtgenbir fizikgövdesioluşturmanın,dairesel bir bedenoluşturmayaçokbenzediğinigörebilirsiniz。 Tek放屁; daireninyarıçapındangeçmekyerine,dikdörtgeningenişliğiniveyüksekliğinitemsil eden bir CGSize vermenizdir。
ÖzelŞekilliGövdeler
andu anda ekranda fizikgövdesinesahip iki basitşeklimizvar —比尔·达莱·维·比尔·卡雷。 Dahakarmaşıkbirşekleihtiyamızvarsa…Örneğin,yerleşikbirüçgenşekliSpriteKit’te yok。
SpriteKit’e,gövdeninsınırlarınıtanımlayanbirÇekirdekGrafik yolu vererek,rasgeleşekilliyapılaroluşturabilirsiniz。 Bununnasılçalıştığınıanlamanınen kolay yolu birörneğebakmaktır; buyüzdenüçgenşekliyledevam edelim。
让三角形路径= CGMutablePath()
trianglePath.move(to:CGPoint(x:-triangle.size.width / 2,
y:-triangle.size.height / 2))
// Sanal Kalemimizinnoktası= 3.nokta⏏️
trianglePath.addLine(to:CGPoint(x:triangle.size.width / 2,
y:-triangle.size.height / 2))
//1.Nokta⏏️
trianglePath.addLine(至:CGPoint(x:0,y:triangle.size.height / 2))
//2.Nokta⏏️
trianglePath.addLine(to:CGPoint(x:-triangle.size.width / 2,
y:-triangle.size.height / 2))
//3.Nokta⏏️
triangle.physicsBody = SKPhysicsBody(polygonFrom:trianglePath)

您的广告:
1.伊拉克·拉拉克(Ilk olarak),《 古兰经》中的 CGMutablePatholuşturduk。
2.Ardından,圣人“ kalemimizi”üçgeninilknoktasınataşıyoruz。 Koordinatların,varsayılanolarak merkezin锚点’inegöreolduğunuunutmayın。 锚点(0.5,0.5), yapar(0,0)。 (0,0)默克济迪尔。
3.达哈·索纳(Daha sonra),她在她的书中添加行(到ççağıraraküççizgiçiziyoruz。SıraylaSanal Kalem – 1.nokta,1.nokta – 2.nokta ve 2.nokta – 3.noktaarasıçizgilerid。
4.孙奥拉拉克(Ulgengen yolunu), SKPhysicsBody’ye(多边形来自🙂geçirerekgövdeyiyaratırsınız。

Özelşekillifizikgövdelerioluşturmakdiğerlerinegöredaha zorgözükebilir,fakat buişlemiçinçokkolay bir yolumuz var。 Birazdan o yoluöğreneceğiz。
Böylelikle的艺术作品。 Şimdiekranımıza“沙”ekleyeceğiz。 Ekranımızdarastgele xnoktasındaçıkmasınıistediğimiziçinrastgelesayıüretmemizlazım。 Bununiçinalttaki fonksiyonukullanacağız。
func random(最小值:CGFloat,最大值:CGFloat)-> CGFloat {
返回CGFloat(Float(arc4random())/ Float(0xFFFFFFFF))*(max-min)+ min
}
Bu kod klasik随机说:“如何快速生成随机数”şeklindearatarak bulabilirsiniz。
Şimdiise sand fonksiyonunuyazalım;
func spawnSand(){
let sand = SKSpriteNode(imageNamed:“ sand”)
sand.position = CGPoint(
x:随机(最小值:0.0,最大值:scene.size.width),
y:scene.size.height-sand.size.height)
sand.physicsBody = SKPhysicsBody(circleOfRadius:
sand.size.width / 2)
sand.name =“沙”
scene.addChild(沙)
}
Bu fonksiyonda,dahaönceyaptığınızgibi,sand.png olarakadlandırılandokudanküçükbir dairesel fizikgövdesiyaptıkve sand.position’un xkısmına0ilesärtızıkıkıkıkıkıkıkıkıkıkıkıkıkıkıkıkıkıkıkıkıkäkıla Ayrıca,hareketligrafiğinadınıdaha sonra kolaycaerişebilmekiçin.name ile“ sand” verdik。
Neolduğunugörmekiçinbu kumparçacıklarından100 tane eklemezamanı。
scene.run(SKAction.repeat(
SKAction.sequence([[SKAction.run(spawnSand),
SKAction.wait(forDuration:0.1)]),计数:100)
)
Kod bir dizi eylemi 100 kez tekrar eder。 Tekrarlanan dizi,spawnSand’ıçağırırve sonra 0.1 saniye bekler。
萨恩·阿斯蒂斯坦(Sahne Asistan)编辑,100公斤

报业者Oekilleri Olan Fizik Bedenleri
Oluşturulacakkarmaşıkbir fizikgövdeekek sahipseniz ve kodtarafındanyolunuoluşturacaksanızbuişuzun ve hantal birhâlalabilir。
Öllyollardannasılbedenoluşturulacağınıbilmekyararlıolsa da,karmaşıkşekillerielealmanınçokdaha kolay bir yoluvardır。
Başlamadanönce,sahneye eklemeniz gereken birşekildaha var ve birazdöndürülmüşbüyükbir“ L” gibigörünüyor:

Üçgenbir yoltanımlamakiçinyazdığınızkodugözönündebulundurarak,muhtemelenyukarıdakişeklinkodla bir araya getirilmesininacıvericiolacağınıfarketmişsinizdir。
Çokdaha kolay bir yolumuzunolduğununipucunuyukarıdaverdim。 Buyüzdenkaygılanmanızagerek yok。 😁
令l = SKSpriteNode(imageNamed:“ L”)
l.name =“形状”
l.position = CGPoint(x:scene.size.width * 0.5,
y:scene.size.height * 0.75)
l.physicsBody = SKPhysicsBody(纹理:l.text !!,大小:l.size)
scene.addChild(l)
SKPhysicsBodybaşlatıcısı(纹理:尺寸🙂 ,雪碧otomatik olarakalgılayan模型目录。SKTexture和CGSize parametrelerinialır。
Yukarıdakiörnekte,bu hareketligrafiğinfizikgövdesinioluşturmakiçinhareketligrafiğintexture’ınıkullanırsınız。
SKPhysicsBody(纹理:尺寸🙂ut ut ut ut ut den den。。。。。。
ŞimdiLşeklininotomatik olaraktaslağınıizleyen bir fizik贝登宁sahipolduğunugöreceksiniz。

SpriteKit的动态目录:Fiziklerin的详细信息,请参见API。 Nesnelerinizin anahatlarını,aralarındakieklemleri,oluşturduğunuzfizikkısıtlarınıve dahafazlasınıgörebilirsiniz。 Kodunuzdaki“ fps”gösteriminisağlayansceneView.showsFPS =真实的deererini bulun ve busatırıaltınaekleyin
sceneView.showsPhysics = true

Sahne yenidenoluşturmayabaşlarbaşlamaz,tümbedenlerinşekillerinigörüyoruz。 Buözelliksayesinde,fizik kurulumunuzunbazıciddi hataayıklamalarınıyapabilirsiniz。
FizikGövdelerininÖzellikleri
Çarpışmatespitindebirçokfiziközelliğivardır。 Birgövdeninözelliklerininoyunfiziğininasıletkilediğinigörmekiçinkumunözelliklerinidüzenleyelim。 andu安达,库姆·库克·阿克尔,库克·格拉努尔·比尔·卡亚亚·本齐约尔。 Parçalaryumuşak,elastikkauçuktanyapılmışsane olur?
spawnSand():’ıniçindesona ekleyelim。
sand.physicsBody!.restitution = 1.0
归还(gerisıçramaveya iade),恢复原状,恢复原状,恢复原状。zaman ne kadar enerjikaybettiğinibelirlemekiçinkullanılır。
Değerler,gövdeninhiçsıçramadığı0.0’dan,gövdeninçarpışmayabaşladığıenerjiylesıçradığı1.0’a kadardeğişebilir。 Varsayılandeğeri0,2’dir。

SpriteKit,fizelkselözelliklerin,tömözelliklerini,varsayılanolarak makuldeğerlereayarlar。 Bir nesnenininvarsayılanağırlığı,ekranda ne kadarbüyükgöründüğünedayalıdır; Restitüsyonvesürtünme“ slipiness”varsayılanolarak,çoğugündeliknesnelerin malzemelerine uyandeğerleregöreayarlanmıştır。
出生日期:0岁1岁,成人,成人,成人,儿童,儿童,儿童,儿童,儿童,儿童,儿童,婴儿,儿童
Ancak bugerçekçibirdavranışdeğildirvedeğerlerkartopu etkisiylebüyüyeceğindenfiziksimülasyonunuzuçabucakbozacaktır。 Bu,gerçekbir uygulamadaönerdiğimbirşeydeğildirancak birazeğlenmekistiyorsanızbunu da denemenizi tavsiye ederim。 😁
Şimdiparçacıklarıdahayoğunhale getirelim,böylecediğerşekillerdendahaağırolacaklar。
spawnSand():’ıniçindesona ekleyelim。
sand.physicsBody!.density = 20.0
Yoğunluk,birim hacimbaşınakütleolaraktanımlanır —başkabirdeyişle,bir nesnenininyoğunluğune kadaryüksekolursa,boyutu o kadarağırolacaktır。 Yoğunlukvarsayılanolarak1,0’dır,buyüzdenbu kod ile kumun 20x kadaryoğunolmasınısağlarsınız。

Kırmızıparçacıklaryoğunluğuarttığındaağırlıklarıartar ve dahabüyük,ancak dahaaçıkmavişekilleribir kenara itebilir。 Fiziğikontrolettiğinizde,博伊特·穆特拉卡·奥内姆利·迪尔迪尔!
Fizikgövdesindekidiğerözelliklerinkısabir turu:
• 摩擦 :Bu bir nesnenin“kaymasını”亚拉尔。 Değerler,gövdeninbir buzküpügibiyüzeylerboyuncadüzgünbirşekildekaydığı0.0’a kadardeğişebilir,buradayüzeylerboyunca kayarkenvücuthızlayavaşlarve durur。 Varsayılandeğer0,2’dir。
• isDynamic :Bazen,çarpışmatespitiiçinfizikgövdelerinikullanmak istersiniz。 虚假的olarakayarlarsanızfizik motoru,fizikgövdesindekitümkuvvetleri vedürtüleriyok sayar ve node’u kendinizin hareket ettirmenize izin verir。
• usingPreciseCollisionDetection :Varsayılanolarak,SpriteKit hassasçarpışmaalgılamasıgerçekleştirmez。 Bunun bir yan etkisivardır:Bir nesneçokhızlıhareket ederse,bir mermi gibi和başkabir nesnedengeçebilir。 Çarpışmatespitinisağlamakiçinbuözelliğiaçmayıdeneyin。
- allowRotation :机动车辆isediğinizhareketli birtexture’ınsimüleedilmesini ama asladönmemesiniisteyebilirsiniz。 Bu durumda,buözelliği错误olarakayarlamanızyeterlidir。
• linearDamping ve angularDamping: Budeğerler,doğrusalhızınveyaaçısalhızın(rotasyon)zamanla ne kadarazaldığınıetkiler。 0,0从0到0,0。 Varsayılandeğer0.1’dir。
• 受影响的人 :Tümnesnelervarsayılanolarakyerçekimindenetkilenir,ancak bir nesneye buözelliğifalse olarak ayarlayarak yerçekimietkisini kapatabilirsiniz。
• 休息 :Fizik motoru,birsürehareket etmeyen nesnelerin“ dinlenme” olarakişaretlendiğibir optimizasyona sahiptir,böylecefizik motoruartüküzerindehesaplama yapmak zorunda kalmaz。 Bir dinlenme nesnesini elle“uyandırmak” gerekiyorsa,buözelliğifalse olarakayarlamanızyeterlidir。
• 质量ve区域 :防撞,防撞,防撞和防弹。 安卡克(yakbilirsiniz),库尔蒂·曼努埃尔·奥拉拉克·格莱西斯(kılmanızgerekiyorsa)。
冲动的埃克尔梅克
Şimdisahnemizdeki nesneleri biraz titretelim。
func shake(){
scene.enumerateChildNodes(withName:“ sand”){节点,_ in
node.physicsBody!.applyImpulse(CGVector(dx:0,dy:random(min:20,max:40))
)
}
}
Buenşlev,sahnedekitümdüğümlerdeenumerateChildNodes(withName:“ sand”)sand ismini arar vebulduğuand a birinedürtüuygular。 Sadeceyukarıyönlübirdürtüeklemekistediğimizdendolayı,xbileşeninisıfıraeşitve ybileşeniniise 20 ile 40arasındarastgele bir pozitif ybileşeninesahip olaruyukarı。
Şimdiise fonkisyonumuzuçalıştırmakiçinbubloğukullanalım。
DispatchQueue.main.asyncAfter(最后期限:.now()+ 5){
scene.run(SKAction.repeat(SKAction.sequence([SKAction.run(shake),SKAction.wait(forDuration:2)]),count:100)))
}
İlkolarak DispatchQueue.main.asyncAfter(截止日期:.now()+ 5){} ile sahnemizyürütüldükten5 saniye sonra altkodlarıçalıştırderiz。
Alt kodlarda ise sahnemize震动fonksiyonunu 2 saniyearalıklarile 100 defa run etmesigerektiğinisöyledik。

她的ki saniyede bir shake fonksiyonu sayesindeyukarı20–40arasıbirdeğerile etkilenirler。
Kumparçacıklarımızgüzelgörünüyorfakat kare,üçgen,12月ve serbestşekilligövdemizinhareketi yok。 Şimdishape’lerüzerindedeaynıişlemiyapalım;
摇动()的照片。
scene.enumerateChildNodes(withName:“ shape”){节点,_ in
node.physicsBody!.applyImpulse(CGVector(dx:random(min:20,max:60),dy:random(min:20,max:60)))}
Buenşlev,sahnedekitümdüğümlerdeenumerateChildNodes(withName:“ shape”)shape is mini arar vebulduğuand a birinedürtüuygular。 x胆碱和胆碱20 ile 60arasındarastgele birsayıverir ve impulse buyönedoğruuygulanır。

Buyazımızda,oyunlardakullanılanfiziközelliklerindenbazılarınıinceledik。 Gelecekyazılardagörüşmeküzere👋。
* Buyazıda“ Ray Wenderlich,2D苹果游戏教程:iOS,MacOS,WatchOS”kitabındanyararlanılmıştır。