{"id":1031,"date":"2023-02-02T09:39:13","date_gmt":"2023-02-02T09:39:13","guid":{"rendered":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/?post_type=chapter&#038;p=1031"},"modified":"2023-02-02T09:39:13","modified_gmt":"2023-02-02T09:39:13","slug":"spraidid","status":"publish","type":"chapter","link":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/chapter\/spraidid\/","title":{"raw":"Spraidid","rendered":"Spraidid"},"content":{"raw":"Sprait (<em>sprite<\/em>) on visuaalne objekt, mis liigub m\u00e4ngus. N\u00e4iteks m\u00e4ngija tegelaskuju on sprait, vastaseid on spraidid, kui m\u00e4ngus on vaja korjata aardeid, siis need on spraidid jne.\r\n\r\nPyGame'is on sprait visuaalne element, mis joonistatakse ekraanile ning mida saab liigutada. Spraidi loomiseks tuleb luua klass, mis laiendab <code class=\"docutils literal notranslate\"><span class=\"pre\">pygame.sprite.Sprite<\/span><\/code> klassi. Spraidiga defineeritakse \u00e4ra <em>rect<\/em> objekt (ristk\u00fclik, mis n\u00e4itab spraidi asukohta ja suurust ekraanil) ja pilt (v\u00f5i kujutis, n\u00e4iteks v\u00f5ib see olla v\u00e4rvitud ristk\u00fclik). Spraidi asukohta saab muuta programmis. N\u00e4iteks kui m\u00e4ngija nooltega tegelaskuju liigutab, siis spraidi positsioon v\u00f5ib muutuda. V\u00f5i n\u00e4iteks juhitakse spraidi liikumist programmi poolt - kuulid lendavad ettem\u00e4\u00e4ratud suunas.\r\n\r\nPyGame'is kasutatakse spraitide gruppe, et koondada spraidid n\u00e4iteks v\u00e4ljajoonistamiseks \u00fchte kogumisse. Grupp on <code class=\"docutils literal notranslate\"><span class=\"pre\">pygame.sprite.Group<\/span><\/code> objekt, kuhu sisse saab spraite lisada ja neid sealt kustutada. Grupp on see, mille saab joonistada ekraanile. Grupi ekraanile joonistamise puhul joonistatakse k\u00f5ik selle grupi spraidid ekraanile. \u00dcks sprait v\u00f5ib olla ka mitmes grupis.\r\n\r\nN\u00e4iteks v\u00e4ljajoonistamiseks on mugav, kui k\u00f5ik spraidid on \u00fches grupis (n\u00e4iteks <code class=\"docutils literal notranslate\"><span class=\"pre\">all_sprites<\/span><\/code>). Samas oleks hea hoida pahad tegelased eraldi grupis ja n\u00e4iteks korjatavad objektid eraldi. Sedasi saab \u00fche grupi seest elemente l\u00e4bi k\u00e4ia ja nendega midagi teha (n\u00e4iteks nende positsiooni muuta).\r\n\r\n<section id=\"koodinaide\">\r\n<h2 id=\"koodinaide\">Koodin\u00e4ide<a class=\"headerlink\" title=\"Permalink to this heading\" href=\"https:\/\/pydoc.pages.taltech.ee\/pygame\/5_sprite.html#koodinaide\">\uf0c1<\/a><\/h2>\r\nTeeme koodin\u00e4ite, kus meil on m\u00e4ngija <code class=\"docutils literal notranslate\"><span class=\"pre\">Player<\/span><\/code> ja paar raketti <code class=\"docutils literal notranslate\"><span class=\"pre\">Rocket<\/span><\/code>. M\u00e4ngija ise liigub pidevalt vasakult paremale. Kui satub raketi peale, \"korjatakse\" rakett \u00fcles (rakett kaob ekraanilt).\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">import pygame\r\npygame.init()\r\n\r\n\r\nclass Rocket(pygame.sprite.Sprite):\r\n    def __init__(self, pos):\r\n        super().__init__()\r\n\r\n        self.image = pygame.image.load(\"rocket_small.png\")\r\n        self.rect = self.image.get_rect()\r\n        self.rect.x = pos[0]\r\n        self.rect.y = pos[1]\r\n\r\n\r\nclass Player(pygame.sprite.Sprite):\r\n    def __init__(self, pos):\r\n        super().__init__()\r\n\r\n        self.image = pygame.Surface((30, 30))\r\n        self.image.fill((0, 0, 255))\r\n        self.rect = self.image.get_rect()\r\n\r\n\r\nrocket_list = pygame.sprite.Group()\r\nall_sprites_list = pygame.sprite.Group()\r\n\r\nscreen = pygame.display.set_mode((600, 800))\r\n\r\nclock = pygame.time.Clock()\r\nrunning = True\r\n\r\n# create rockets\r\nrocket1 = Rocket((50, 1))\r\nrocket2 = Rocket((100, 3))\r\n\r\n# add rockets to rockets list\r\nrocket_list.add(rocket1)\r\nrocket_list.add(rocket2)\r\n# add rockets to all sprites list\r\nall_sprites_list.add(rocket1)\r\nall_sprites_list.add(rocket2)\r\n\r\n# create player and add to all sprites list\r\nplayer = Player((0, 0))\r\nall_sprites_list.add(player)\r\n\r\nwhile running:\r\n    for event in pygame.event.get():\r\n        if event.type == pygame.QUIT:\r\n            running = False\r\n\r\n    screen.fill((255, 255, 255))\r\n\r\n    # whether player collides with one of the rockets\r\n    collide_index = player.rect.collidelist(rocket_list.sprites())\r\n    if collide_index != -1:\r\n        print(\"Found a rocket!\")\r\n        rocket = rocket_list.sprites()[collide_index]\r\n        # remove rocket from all the groups\r\n        rocket_list.remove(rocket)\r\n        all_sprites_list.remove(rocket)\r\n\r\n    all_sprites_list.draw(screen)\r\n\r\n    player.rect.x += 10\r\n\r\n    pygame.display.flip()\r\n    clock.tick(1)<\/pre>\r\n<\/section>Alguses loome kaks eraldi klassi - \u00fcks raketi jaoks ja teine m\u00e4ngija jaoks. Raketi jaoks kasutame pilti, m\u00e4ngija on lihtsalt sinine ristk\u00fclik. Spraidi puhul peame \u00e4ra defineerima kaks v\u00e4\u00e4rtust: <code class=\"docutils literal notranslate\"><span class=\"pre\">image<\/span><\/code> ja <code class=\"docutils literal notranslate\"><span class=\"pre\">rect<\/span><\/code>. Seda teemegi m\u00f5lema klassi puhul konstruktoris. M\u00f5lemad spraidid oleme nii loonud, et objekti loomisel saab m\u00e4\u00e4rata, mis positsioonile see ekraanil pannakse (<code class=\"docutils literal notranslate\"><span class=\"pre\">pos<\/span><\/code> parameeter).\r\n\r\nEdasi loome kaks spraitide gruppi: <code class=\"docutils literal notranslate\"><span class=\"pre\">rocket_list<\/span><\/code> ja <code class=\"docutils literal notranslate\"><span class=\"pre\">all_sprites_list<\/span><\/code>. Loome kaks raketi objekti ja lisame need m\u00f5lemasse gruppi. Loome \u00fche m\u00e4ngija objekti ja lisame selle vaid <code class=\"docutils literal notranslate\"><span class=\"pre\">all_sprites_list<\/span><\/code> gruppi. Rakette on mugav eraldi grupis hoida, kuna siis saame hiljem kontrollida m\u00e4ngija kokkupuutumist nendega.\r\n\r\nM\u00e4nguts\u00fcklis toimub m\u00e4ngija asukoha muutumine (<code class=\"docutils literal notranslate\"><span class=\"pre\">player.rect.x<\/span> <span class=\"pre\">+=<\/span> <span class=\"pre\">10<\/span><\/code>). Ehk siis iga ts\u00fckliga liigub m\u00e4ngija positsioon 10 piksli v\u00f5rra paremale. \u00dchtlasi kontrollitakse igas ts\u00fcklis, kas m\u00e4ngija puutub kokku m\u00f5ne raketiga. Selleks kasutame <code class=\"docutils literal notranslate\"><span class=\"pre\">Rect<\/span><\/code> objekti meetodit <code class=\"docutils literal notranslate\"><span class=\"pre\">collidelist<\/span><\/code>. Sinna anname kaasa raketi spraitide listi, mille saame eelnevalt loodud grupi k\u00e4est. See meetod tagastab indeksi, millise elemendiga kokkupuude toimub. Kui tagastatakse -1, siis kokkupuudet ei toimu. Kui tulemus ei ole -1, siis j\u00e4relikult toimus kokkupuude. Kasutame saadud indeksit, et leida see objekt \u00fcles (<code class=\"docutils literal notranslate\"><span class=\"pre\">rocket<\/span> <span class=\"pre\">=<\/span> <span class=\"pre\">rocket_list.sprites()[collide_index]<\/span><\/code>)`. Ja n\u00fc\u00fcd eemaldame selle spraidi nii rakettide kui ka k\u00f5ikide spraitide grupist. See on vajalik selleks, et edaspidi seda enam ekraanile ei kuvata.\r\n\r\nSiin kuvat\u00f5mmis koodist, kui \u00fcks rakett on \u00e4ra \"korjatud\":\r\n\r\n[caption id=\"attachment_1032\" align=\"alignnone\" width=\"595\"]<img class=\"size-full wp-image-1032\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-content\/uploads\/sites\/18\/2023\/02\/sprite_collide_example.png\" alt=\"M\u00e4ngu n\u00e4ide\" width=\"595\" height=\"218\" \/> Kuvat\u00f5mmis m\u00e4ngust[\/caption]\r\n\r\nProovi koodi t\u00e4iendada:\r\n<ol class=\"arabic simple\">\r\n \t<li>Lisa m\u00e4ngijale pilt<\/li>\r\n \t<li>Lisa v\u00f5imalus m\u00e4ngijat juhtida<\/li>\r\n \t<li>Lisa rohkem rakette<\/li>\r\n \t<li>Lisa kood, et raketid ilmuvad suvalistele positsioonidele<\/li>\r\n \t<li>Lisa kood, et kui \u00fcks rakett on v\u00f5etud, ilmub uus (suvalisele kohale)<\/li>\r\n \t<li>Lisa kood, et rakett on ekraanil vaid teatud aja (n\u00e4iteks peale teatud ts\u00fcklite arvu kaob \u00e4ra)<\/li>\r\n \t<li>Lisa kood, et m\u00e4ngija saab rakettide korjamise eest punkte<\/li>\r\n<\/ol>","rendered":"<p>Sprait (<em>sprite<\/em>) on visuaalne objekt, mis liigub m\u00e4ngus. N\u00e4iteks m\u00e4ngija tegelaskuju on sprait, vastaseid on spraidid, kui m\u00e4ngus on vaja korjata aardeid, siis need on spraidid jne.<\/p>\n<p>PyGame&#8217;is on sprait visuaalne element, mis joonistatakse ekraanile ning mida saab liigutada. Spraidi loomiseks tuleb luua klass, mis laiendab <code class=\"docutils literal notranslate\"><span class=\"pre\">pygame.sprite.Sprite<\/span><\/code> klassi. Spraidiga defineeritakse \u00e4ra <em>rect<\/em> objekt (ristk\u00fclik, mis n\u00e4itab spraidi asukohta ja suurust ekraanil) ja pilt (v\u00f5i kujutis, n\u00e4iteks v\u00f5ib see olla v\u00e4rvitud ristk\u00fclik). Spraidi asukohta saab muuta programmis. N\u00e4iteks kui m\u00e4ngija nooltega tegelaskuju liigutab, siis spraidi positsioon v\u00f5ib muutuda. V\u00f5i n\u00e4iteks juhitakse spraidi liikumist programmi poolt &#8211; kuulid lendavad ettem\u00e4\u00e4ratud suunas.<\/p>\n<p>PyGame&#8217;is kasutatakse spraitide gruppe, et koondada spraidid n\u00e4iteks v\u00e4ljajoonistamiseks \u00fchte kogumisse. Grupp on <code class=\"docutils literal notranslate\"><span class=\"pre\">pygame.sprite.Group<\/span><\/code> objekt, kuhu sisse saab spraite lisada ja neid sealt kustutada. Grupp on see, mille saab joonistada ekraanile. Grupi ekraanile joonistamise puhul joonistatakse k\u00f5ik selle grupi spraidid ekraanile. \u00dcks sprait v\u00f5ib olla ka mitmes grupis.<\/p>\n<p>N\u00e4iteks v\u00e4ljajoonistamiseks on mugav, kui k\u00f5ik spraidid on \u00fches grupis (n\u00e4iteks <code class=\"docutils literal notranslate\"><span class=\"pre\">all_sprites<\/span><\/code>). Samas oleks hea hoida pahad tegelased eraldi grupis ja n\u00e4iteks korjatavad objektid eraldi. Sedasi saab \u00fche grupi seest elemente l\u00e4bi k\u00e4ia ja nendega midagi teha (n\u00e4iteks nende positsiooni muuta).<\/p>\n<section id=\"koodinaide\">\n<h2 id=\"koodinaide\">Koodin\u00e4ide<a class=\"headerlink\" title=\"Permalink to this heading\" href=\"https:\/\/pydoc.pages.taltech.ee\/pygame\/5_sprite.html#koodinaide\">\uf0c1<\/a><\/h2>\n<p>Teeme koodin\u00e4ite, kus meil on m\u00e4ngija <code class=\"docutils literal notranslate\"><span class=\"pre\">Player<\/span><\/code> ja paar raketti <code class=\"docutils literal notranslate\"><span class=\"pre\">Rocket<\/span><\/code>. M\u00e4ngija ise liigub pidevalt vasakult paremale. Kui satub raketi peale, &#8220;korjatakse&#8221; rakett \u00fcles (rakett kaob ekraanilt).<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">import pygame\r\npygame.init()\r\n\r\n\r\nclass Rocket(pygame.sprite.Sprite):\r\n    def __init__(self, pos):\r\n        super().__init__()\r\n\r\n        self.image = pygame.image.load(\"rocket_small.png\")\r\n        self.rect = self.image.get_rect()\r\n        self.rect.x = pos[0]\r\n        self.rect.y = pos[1]\r\n\r\n\r\nclass Player(pygame.sprite.Sprite):\r\n    def __init__(self, pos):\r\n        super().__init__()\r\n\r\n        self.image = pygame.Surface((30, 30))\r\n        self.image.fill((0, 0, 255))\r\n        self.rect = self.image.get_rect()\r\n\r\n\r\nrocket_list = pygame.sprite.Group()\r\nall_sprites_list = pygame.sprite.Group()\r\n\r\nscreen = pygame.display.set_mode((600, 800))\r\n\r\nclock = pygame.time.Clock()\r\nrunning = True\r\n\r\n# create rockets\r\nrocket1 = Rocket((50, 1))\r\nrocket2 = Rocket((100, 3))\r\n\r\n# add rockets to rockets list\r\nrocket_list.add(rocket1)\r\nrocket_list.add(rocket2)\r\n# add rockets to all sprites list\r\nall_sprites_list.add(rocket1)\r\nall_sprites_list.add(rocket2)\r\n\r\n# create player and add to all sprites list\r\nplayer = Player((0, 0))\r\nall_sprites_list.add(player)\r\n\r\nwhile running:\r\n    for event in pygame.event.get():\r\n        if event.type == pygame.QUIT:\r\n            running = False\r\n\r\n    screen.fill((255, 255, 255))\r\n\r\n    # whether player collides with one of the rockets\r\n    collide_index = player.rect.collidelist(rocket_list.sprites())\r\n    if collide_index != -1:\r\n        print(\"Found a rocket!\")\r\n        rocket = rocket_list.sprites()[collide_index]\r\n        # remove rocket from all the groups\r\n        rocket_list.remove(rocket)\r\n        all_sprites_list.remove(rocket)\r\n\r\n    all_sprites_list.draw(screen)\r\n\r\n    player.rect.x += 10\r\n\r\n    pygame.display.flip()\r\n    clock.tick(1)<\/pre>\n<\/section>\n<p>Alguses loome kaks eraldi klassi &#8211; \u00fcks raketi jaoks ja teine m\u00e4ngija jaoks. Raketi jaoks kasutame pilti, m\u00e4ngija on lihtsalt sinine ristk\u00fclik. Spraidi puhul peame \u00e4ra defineerima kaks v\u00e4\u00e4rtust: <code class=\"docutils literal notranslate\"><span class=\"pre\">image<\/span><\/code> ja <code class=\"docutils literal notranslate\"><span class=\"pre\">rect<\/span><\/code>. Seda teemegi m\u00f5lema klassi puhul konstruktoris. M\u00f5lemad spraidid oleme nii loonud, et objekti loomisel saab m\u00e4\u00e4rata, mis positsioonile see ekraanil pannakse (<code class=\"docutils literal notranslate\"><span class=\"pre\">pos<\/span><\/code> parameeter).<\/p>\n<p>Edasi loome kaks spraitide gruppi: <code class=\"docutils literal notranslate\"><span class=\"pre\">rocket_list<\/span><\/code> ja <code class=\"docutils literal notranslate\"><span class=\"pre\">all_sprites_list<\/span><\/code>. Loome kaks raketi objekti ja lisame need m\u00f5lemasse gruppi. Loome \u00fche m\u00e4ngija objekti ja lisame selle vaid <code class=\"docutils literal notranslate\"><span class=\"pre\">all_sprites_list<\/span><\/code> gruppi. Rakette on mugav eraldi grupis hoida, kuna siis saame hiljem kontrollida m\u00e4ngija kokkupuutumist nendega.<\/p>\n<p>M\u00e4nguts\u00fcklis toimub m\u00e4ngija asukoha muutumine (<code class=\"docutils literal notranslate\"><span class=\"pre\">player.rect.x<\/span> <span class=\"pre\">+=<\/span> <span class=\"pre\">10<\/span><\/code>). Ehk siis iga ts\u00fckliga liigub m\u00e4ngija positsioon 10 piksli v\u00f5rra paremale. \u00dchtlasi kontrollitakse igas ts\u00fcklis, kas m\u00e4ngija puutub kokku m\u00f5ne raketiga. Selleks kasutame <code class=\"docutils literal notranslate\"><span class=\"pre\">Rect<\/span><\/code> objekti meetodit <code class=\"docutils literal notranslate\"><span class=\"pre\">collidelist<\/span><\/code>. Sinna anname kaasa raketi spraitide listi, mille saame eelnevalt loodud grupi k\u00e4est. See meetod tagastab indeksi, millise elemendiga kokkupuude toimub. Kui tagastatakse -1, siis kokkupuudet ei toimu. Kui tulemus ei ole -1, siis j\u00e4relikult toimus kokkupuude. Kasutame saadud indeksit, et leida see objekt \u00fcles (<code class=\"docutils literal notranslate\"><span class=\"pre\">rocket<\/span> <span class=\"pre\">=<\/span> <span class=\"pre\">rocket_list.sprites()[collide_index]<\/span><\/code>)`. Ja n\u00fc\u00fcd eemaldame selle spraidi nii rakettide kui ka k\u00f5ikide spraitide grupist. See on vajalik selleks, et edaspidi seda enam ekraanile ei kuvata.<\/p>\n<p>Siin kuvat\u00f5mmis koodist, kui \u00fcks rakett on \u00e4ra &#8220;korjatud&#8221;:<\/p>\n<figure id=\"attachment_1032\" aria-describedby=\"caption-attachment-1032\" style=\"width: 595px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-1032\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-content\/uploads\/sites\/18\/2023\/02\/sprite_collide_example.png\" alt=\"M\u00e4ngu n\u00e4ide\" width=\"595\" height=\"218\" srcset=\"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-content\/uploads\/sites\/18\/2023\/02\/sprite_collide_example.png 595w, https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-content\/uploads\/sites\/18\/2023\/02\/sprite_collide_example-300x110.png 300w, https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-content\/uploads\/sites\/18\/2023\/02\/sprite_collide_example-65x24.png 65w, https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-content\/uploads\/sites\/18\/2023\/02\/sprite_collide_example-225x82.png 225w, https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-content\/uploads\/sites\/18\/2023\/02\/sprite_collide_example-350x128.png 350w\" sizes=\"auto, (max-width: 595px) 100vw, 595px\" \/><figcaption id=\"caption-attachment-1032\" class=\"wp-caption-text\">Kuvat\u00f5mmis m\u00e4ngust<\/figcaption><\/figure>\n<p>Proovi koodi t\u00e4iendada:<\/p>\n<ol class=\"arabic simple\">\n<li>Lisa m\u00e4ngijale pilt<\/li>\n<li>Lisa v\u00f5imalus m\u00e4ngijat juhtida<\/li>\n<li>Lisa rohkem rakette<\/li>\n<li>Lisa kood, et raketid ilmuvad suvalistele positsioonidele<\/li>\n<li>Lisa kood, et kui \u00fcks rakett on v\u00f5etud, ilmub uus (suvalisele kohale)<\/li>\n<li>Lisa kood, et rakett on ekraanil vaid teatud aja (n\u00e4iteks peale teatud ts\u00fcklite arvu kaob \u00e4ra)<\/li>\n<li>Lisa kood, et m\u00e4ngija saab rakettide korjamise eest punkte<\/li>\n<\/ol>\n","protected":false},"author":36,"menu_order":5,"template":"","meta":{"pb_show_title":"on","pb_short_title":"","pb_subtitle":"","pb_authors":[],"pb_section_license":""},"chapter-type":[],"contributor":[],"license":[],"class_list":["post-1031","chapter","type-chapter","status-publish","hentry"],"part":780,"_links":{"self":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-json\/pressbooks\/v2\/chapters\/1031","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-json\/pressbooks\/v2\/chapters"}],"about":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-json\/wp\/v2\/types\/chapter"}],"author":[{"embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-json\/wp\/v2\/users\/36"}],"version-history":[{"count":1,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-json\/pressbooks\/v2\/chapters\/1031\/revisions"}],"predecessor-version":[{"id":1033,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-json\/pressbooks\/v2\/chapters\/1031\/revisions\/1033"}],"part":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-json\/pressbooks\/v2\/parts\/780"}],"metadata":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-json\/pressbooks\/v2\/chapters\/1031\/metadata\/"}],"wp:attachment":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-json\/wp\/v2\/media?parent=1031"}],"wp:term":[{"taxonomy":"chapter-type","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-json\/pressbooks\/v2\/chapter-type?post=1031"},{"taxonomy":"contributor","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-json\/wp\/v2\/contributor?post=1031"},{"taxonomy":"license","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-json\/wp\/v2\/license?post=1031"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}