{"id":891,"date":"2022-12-22T20:12:47","date_gmt":"2022-12-22T20:12:47","guid":{"rendered":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/?post_type=chapter&#038;p=891"},"modified":"2023-02-02T05:29:51","modified_gmt":"2023-02-02T05:29:51","slug":"pygamei-mangutsukkel","status":"publish","type":"chapter","link":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/chapter\/pygamei-mangutsukkel\/","title":{"raw":"PyGame'i m\u00e4nguts\u00fckkel","rendered":"PyGame&#8217;i m\u00e4nguts\u00fckkel"},"content":{"raw":"<h1 id=\"pygame-2-game-loop--page-root\">M\u00e4nguts\u00fckkel<a class=\"headerlink\" title=\"Permalink to this headline\" href=\"#pygame-2-game-loop--page-root\">\uf0c1<\/a><\/h1>\r\nKui m\u00f5tleme m\u00f5ne lihtsama m\u00e4ngu peale, mida saab n\u00e4iteks k\u00e4surealt m\u00e4ngida ning kus m\u00e4ngija saab sisestada k\u00e4ike (korraldusi), peab see m\u00e4ng pidevalt k\u00fcsima kasutajalt uut sisendit. Selleks, et seda saavutada, peab m\u00e4ngu kestel programm pidevalt sisendit k\u00fcsima. Kui sisend on k\u00fcsitud, saab programm vastavalt sisendile teha k\u00e4igu (muuta m\u00e4ngu olekut) ning n\u00e4iteks kuvada m\u00e4ngijale hetkeline m\u00e4ngu seis. Seda protsessi korratakse kuni m\u00e4ngu l\u00f5ppemiseni. Sellist pidevat ts\u00fcklit nimetatakse m\u00e4nguts\u00fckliks (<em>game loop<\/em>).\r\n\r\nM\u00e4nguts\u00fckkel on sisuliselt l\u00f5putu ts\u00fckkel, mis hoiab m\u00e4ngu k\u00e4imas ja mida korratakse, kuni m\u00e4ngust v\u00e4ljutakse (v\u00f5i tekib viga). PyGame'is \u00fches ts\u00fckli sammus tehakse j\u00e4rgmised 4 peamist tegevust:\r\n<ol class=\"arabic simple\">\r\n \t<li>J\u00e4lgitakse erinevaid s\u00fcndmusi ja tegeletakse s\u00fcndmustega (siin n\u00e4iteks protsessitakse kasutaja sisendit)<\/li>\r\n \t<li>Muudetakse m\u00e4ngu olekut (n\u00e4iteks m\u00e4ngija asukoht muutub)<\/li>\r\n \t<li>Joonistatakse m\u00e4ngu olek m\u00e4llu (m\u00e4ngija asukoht muutub)<\/li>\r\n \t<li>Joonistatud seis n\u00e4idatakse kasutajale (m\u00e4ngija n\u00e4eb ekraanil, et tema asukoht on muutunud)<\/li>\r\n<\/ol>\r\n\r\n[embed]https:\/\/www.youtube.com\/embed\/ukRwnfOTiII[\/embed]\r\n\r\n<section id=\"mangutsukli-koodinaide\">\r\n<h2 id=\"mangutsukli-koodinaide\">M\u00e4nguts\u00fckli koodin\u00e4ide<a class=\"headerlink\" title=\"Permalink to this headline\" href=\"#mangutsukli-koodinaide\">\uf0c1<\/a><\/h2>\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">import pygame\r\npygame.init()\r\n# create a window\r\nscreen = pygame.display.set_mode((800, 600))\r\n\r\nrunning = True\r\nwhile running:\r\n    for event in pygame.event.get():\r\n        if event.type == pygame.QUIT:\r\n            # closing window finishes the game loop\r\n            running = False\r\n    # fill screen with white color\r\n    screen.fill((255, 255, 255))\r\n\r\n    # draw a red circle at (100, 100) with radius 50\r\n    pygame.draw.circle(screen, (255, 0, 0), (100, 100), 50)\r\n\r\n    # everything drawn will be visible\r\n    pygame.display.flip()<\/pre>\r\n<div class=\"highlight-python notranslate\">\r\n<div class=\"highlight\">\r\n<pre><\/pre>\r\n<\/div>\r\n<\/div>\r\nSelgitame antud koodi natuke p\u00f5hjalikumalt:\r\n<ul>\r\n \t<li><code class=\"docutils literal notranslate\"><span class=\"pre\">import<\/span> <span class=\"pre\">pygame<\/span><\/code> impordib PyGame paki. Ilma selleta me PyGame komponente kasutada ei saa.<\/li>\r\n \t<li><code class=\"docutils literal notranslate\"><span class=\"pre\">pygame.init()<\/span><\/code> initsialiseerib ja paneb valmis PyGame'i funktsionaalsuse. See on vajalik, et saaksime komponente kasutada.<\/li>\r\n \t<li><code class=\"docutils literal notranslate\"><span class=\"pre\">pygame.display.set_mode((width,<\/span> <span class=\"pre\">height))<\/span><\/code> - loob m\u00e4ngu pinna ehk ekraani (ja vastavalt ka akna), kuhu peale hakkame m\u00e4ngu elemente joonistama. Saame kaasa anda loodava pinna (samuti akna) laiuse ja k\u00f5rguse pikslites.<\/li>\r\n \t<li><code class=\"docutils literal notranslate\"><span class=\"pre\">running<\/span> <span class=\"pre\">=<\/span> <span class=\"pre\">True<\/span><\/code> - loome abimuutuja. Kui selle muutuja v\u00e4\u00e4rtus on <code class=\"docutils literal notranslate\"><span class=\"pre\">True<\/span><\/code>, j\u00e4tkab meie programm (m\u00e4ng) t\u00f6\u00f6tamist.<\/li>\r\n \t<li><code class=\"docutils literal notranslate\"><span class=\"pre\">while<\/span> <span class=\"pre\">running:<\/span><\/code> - m\u00e4nguts\u00fckli algus. M\u00e4nguts\u00fckli kordamine toimub kuni <code class=\"docutils literal notranslate\"><span class=\"pre\">running<\/span><\/code> v\u00e4\u00e4rtus on <code class=\"docutils literal notranslate\"><span class=\"pre\">True<\/span><\/code><\/li>\r\n \t<li>S\u00fcndmuste kontrollimine:\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">for event in pygame.event.get():\r\n    if event.type == pygame.QUIT:\r\n        # closing window finishes the game loop\r\n        running = False<\/pre>\r\n<blockquote>\r\n<div><\/div><\/blockquote>\r\nK\u00e4iakse l\u00e4bi k\u00f5ik s\u00fcndmused. Kui s\u00fcndmuse t\u00fc\u00fcp on m\u00e4ngust v\u00e4ljumine (akna sulgemisel), siis m\u00e4\u00e4ratakse <code class=\"docutils literal notranslate\"><span class=\"pre\">running<\/span><\/code> v\u00e4\u00e4rtuseks <code class=\"docutils literal notranslate\"><span class=\"pre\">False<\/span><\/code>. Sellega l\u00f5ppeb m\u00e4nguts\u00fckkel j\u00e4rgmisel iteratsioonil.\r\n\r\nIlma selle kontrollita j\u00e4\u00e4b programm (m\u00e4nguts\u00fckkel) akna sulgemisel taustale ikka jooksma.<\/li>\r\n \t<li><code class=\"docutils literal notranslate\"><span class=\"pre\">screen.fill((255,<\/span> <span class=\"pre\">255,<\/span> <span class=\"pre\">255))<\/span><\/code> - ekraan t\u00e4idetakse valge v\u00e4rviga. Kolm v\u00e4\u00e4rtust ennikus t\u00e4histavad RGB v\u00e4rve, ehk vastavalt punase, rohelise ja sinise v\u00e4rvi intensiivsust. Iga v\u00e4rvi jaoks saab kasutada skaalat 0 - 255. Kui k\u00f5ikide v\u00e4rvide v\u00e4\u00e4rtused on maksimaalsed, on tulemuseks valge v\u00e4rv.<\/li>\r\n \t<li><code class=\"docutils literal notranslate\"><span class=\"pre\">pygame.draw.circle(screen,<\/span> <span class=\"pre\">(255,<\/span> <span class=\"pre\">0,<\/span> <span class=\"pre\">0),<\/span> <span class=\"pre\">(100,<\/span> <span class=\"pre\">100),<\/span> <span class=\"pre\">50)<\/span><\/code> - ekraanile joonistatakse ring teatud v\u00e4rviga teatud positsioonile teatud raadiusega.<\/li>\r\n \t<li><code class=\"docutils literal notranslate\"><span class=\"pre\">pygame.display.flip()<\/span><\/code> - ekraan tehakse kasutajale n\u00e4htavaks. Seni k\u00f5ik muudatused (tausta v\u00e4rvimine ja ringi joonistamine) toimusid m\u00e4lus ja kasutaja seda kohe ei n\u00e4inud. Selle k\u00e4suga n\u00e4idatakse k\u00f5ik muudatused korraga ekraanil.<\/li>\r\n<\/ul>\r\n<h2>M\u00f5tle ja nuputa!<\/h2>\r\n[h5p id=\"42\"]\r\n\r\n<\/section>","rendered":"<h1 id=\"pygame-2-game-loop--page-root\">M\u00e4nguts\u00fckkel<a class=\"headerlink\" title=\"Permalink to this headline\" href=\"#pygame-2-game-loop--page-root\">\uf0c1<\/a><\/h1>\n<p>Kui m\u00f5tleme m\u00f5ne lihtsama m\u00e4ngu peale, mida saab n\u00e4iteks k\u00e4surealt m\u00e4ngida ning kus m\u00e4ngija saab sisestada k\u00e4ike (korraldusi), peab see m\u00e4ng pidevalt k\u00fcsima kasutajalt uut sisendit. Selleks, et seda saavutada, peab m\u00e4ngu kestel programm pidevalt sisendit k\u00fcsima. Kui sisend on k\u00fcsitud, saab programm vastavalt sisendile teha k\u00e4igu (muuta m\u00e4ngu olekut) ning n\u00e4iteks kuvada m\u00e4ngijale hetkeline m\u00e4ngu seis. Seda protsessi korratakse kuni m\u00e4ngu l\u00f5ppemiseni. Sellist pidevat ts\u00fcklit nimetatakse m\u00e4nguts\u00fckliks (<em>game loop<\/em>).<\/p>\n<p>M\u00e4nguts\u00fckkel on sisuliselt l\u00f5putu ts\u00fckkel, mis hoiab m\u00e4ngu k\u00e4imas ja mida korratakse, kuni m\u00e4ngust v\u00e4ljutakse (v\u00f5i tekib viga). PyGame&#8217;is \u00fches ts\u00fckli sammus tehakse j\u00e4rgmised 4 peamist tegevust:<\/p>\n<ol class=\"arabic simple\">\n<li>J\u00e4lgitakse erinevaid s\u00fcndmusi ja tegeletakse s\u00fcndmustega (siin n\u00e4iteks protsessitakse kasutaja sisendit)<\/li>\n<li>Muudetakse m\u00e4ngu olekut (n\u00e4iteks m\u00e4ngija asukoht muutub)<\/li>\n<li>Joonistatakse m\u00e4ngu olek m\u00e4llu (m\u00e4ngija asukoht muutub)<\/li>\n<li>Joonistatud seis n\u00e4idatakse kasutajale (m\u00e4ngija n\u00e4eb ekraanil, et tema asukoht on muutunud)<\/li>\n<\/ol>\n<p><iframe loading=\"lazy\" id=\"oembed-1\" title=\"PyGame: M\u00e4nguts\u00fckkel\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/ukRwnfOTiII?feature=oembed&#38;rel=0\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n<section id=\"mangutsukli-koodinaide\">\n<h2 id=\"mangutsukli-koodinaide\">M\u00e4nguts\u00fckli koodin\u00e4ide<a class=\"headerlink\" title=\"Permalink to this headline\" href=\"#mangutsukli-koodinaide\">\uf0c1<\/a><\/h2>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">import pygame\r\npygame.init()\r\n# create a window\r\nscreen = pygame.display.set_mode((800, 600))\r\n\r\nrunning = True\r\nwhile running:\r\n    for event in pygame.event.get():\r\n        if event.type == pygame.QUIT:\r\n            # closing window finishes the game loop\r\n            running = False\r\n    # fill screen with white color\r\n    screen.fill((255, 255, 255))\r\n\r\n    # draw a red circle at (100, 100) with radius 50\r\n    pygame.draw.circle(screen, (255, 0, 0), (100, 100), 50)\r\n\r\n    # everything drawn will be visible\r\n    pygame.display.flip()<\/pre>\n<div class=\"highlight-python notranslate\">\n<div class=\"highlight\">\n<pre><\/pre>\n<\/div>\n<\/div>\n<p>Selgitame antud koodi natuke p\u00f5hjalikumalt:<\/p>\n<ul>\n<li><code class=\"docutils literal notranslate\"><span class=\"pre\">import<\/span> <span class=\"pre\">pygame<\/span><\/code> impordib PyGame paki. Ilma selleta me PyGame komponente kasutada ei saa.<\/li>\n<li><code class=\"docutils literal notranslate\"><span class=\"pre\">pygame.init()<\/span><\/code> initsialiseerib ja paneb valmis PyGame&#8217;i funktsionaalsuse. See on vajalik, et saaksime komponente kasutada.<\/li>\n<li><code class=\"docutils literal notranslate\"><span class=\"pre\">pygame.display.set_mode((width,<\/span> <span class=\"pre\">height))<\/span><\/code> &#8211; loob m\u00e4ngu pinna ehk ekraani (ja vastavalt ka akna), kuhu peale hakkame m\u00e4ngu elemente joonistama. Saame kaasa anda loodava pinna (samuti akna) laiuse ja k\u00f5rguse pikslites.<\/li>\n<li><code class=\"docutils literal notranslate\"><span class=\"pre\">running<\/span> <span class=\"pre\">=<\/span> <span class=\"pre\">True<\/span><\/code> &#8211; loome abimuutuja. Kui selle muutuja v\u00e4\u00e4rtus on <code class=\"docutils literal notranslate\"><span class=\"pre\">True<\/span><\/code>, j\u00e4tkab meie programm (m\u00e4ng) t\u00f6\u00f6tamist.<\/li>\n<li><code class=\"docutils literal notranslate\"><span class=\"pre\">while<\/span> <span class=\"pre\">running:<\/span><\/code> &#8211; m\u00e4nguts\u00fckli algus. M\u00e4nguts\u00fckli kordamine toimub kuni <code class=\"docutils literal notranslate\"><span class=\"pre\">running<\/span><\/code> v\u00e4\u00e4rtus on <code class=\"docutils literal notranslate\"><span class=\"pre\">True<\/span><\/code><\/li>\n<li>S\u00fcndmuste kontrollimine:\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">for event in pygame.event.get():\r\n    if event.type == pygame.QUIT:\r\n        # closing window finishes the game loop\r\n        running = False<\/pre>\n<blockquote>\n<div><\/div>\n<\/blockquote>\n<p>K\u00e4iakse l\u00e4bi k\u00f5ik s\u00fcndmused. Kui s\u00fcndmuse t\u00fc\u00fcp on m\u00e4ngust v\u00e4ljumine (akna sulgemisel), siis m\u00e4\u00e4ratakse <code class=\"docutils literal notranslate\"><span class=\"pre\">running<\/span><\/code> v\u00e4\u00e4rtuseks <code class=\"docutils literal notranslate\"><span class=\"pre\">False<\/span><\/code>. Sellega l\u00f5ppeb m\u00e4nguts\u00fckkel j\u00e4rgmisel iteratsioonil.<\/p>\n<p>Ilma selle kontrollita j\u00e4\u00e4b programm (m\u00e4nguts\u00fckkel) akna sulgemisel taustale ikka jooksma.<\/li>\n<li><code class=\"docutils literal notranslate\"><span class=\"pre\">screen.fill((255,<\/span> <span class=\"pre\">255,<\/span> <span class=\"pre\">255))<\/span><\/code> &#8211; ekraan t\u00e4idetakse valge v\u00e4rviga. Kolm v\u00e4\u00e4rtust ennikus t\u00e4histavad RGB v\u00e4rve, ehk vastavalt punase, rohelise ja sinise v\u00e4rvi intensiivsust. Iga v\u00e4rvi jaoks saab kasutada skaalat 0 &#8211; 255. Kui k\u00f5ikide v\u00e4rvide v\u00e4\u00e4rtused on maksimaalsed, on tulemuseks valge v\u00e4rv.<\/li>\n<li><code class=\"docutils literal notranslate\"><span class=\"pre\">pygame.draw.circle(screen,<\/span> <span class=\"pre\">(255,<\/span> <span class=\"pre\">0,<\/span> <span class=\"pre\">0),<\/span> <span class=\"pre\">(100,<\/span> <span class=\"pre\">100),<\/span> <span class=\"pre\">50)<\/span><\/code> &#8211; ekraanile joonistatakse ring teatud v\u00e4rviga teatud positsioonile teatud raadiusega.<\/li>\n<li><code class=\"docutils literal notranslate\"><span class=\"pre\">pygame.display.flip()<\/span><\/code> &#8211; ekraan tehakse kasutajale n\u00e4htavaks. Seni k\u00f5ik muudatused (tausta v\u00e4rvimine ja ringi joonistamine) toimusid m\u00e4lus ja kasutaja seda kohe ei n\u00e4inud. Selle k\u00e4suga n\u00e4idatakse k\u00f5ik muudatused korraga ekraanil.<\/li>\n<\/ul>\n<h2>M\u00f5tle ja nuputa!<\/h2>\n<div id=\"h5p-42\">\n<div class=\"h5p-iframe-wrapper\"><iframe id=\"h5p-iframe-42\" class=\"h5p-iframe\" data-content-id=\"42\" style=\"height:1px\" src=\"about:blank\" frameBorder=\"0\" scrolling=\"no\" title=\"Pygame (\u00fcks ts\u00fckkel)\"><\/iframe><\/div>\n<\/div>\n<\/section>\n","protected":false},"author":36,"menu_order":2,"template":"","meta":{"pb_show_title":"on","pb_short_title":"","pb_subtitle":"","pb_authors":[],"pb_section_license":""},"chapter-type":[],"contributor":[],"license":[],"class_list":["post-891","chapter","type-chapter","status-publish","hentry"],"part":780,"_links":{"self":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-json\/pressbooks\/v2\/chapters\/891","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":4,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-json\/pressbooks\/v2\/chapters\/891\/revisions"}],"predecessor-version":[{"id":1021,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-json\/pressbooks\/v2\/chapters\/891\/revisions\/1021"}],"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\/891\/metadata\/"}],"wp:attachment":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-json\/wp\/v2\/media?parent=891"}],"wp:term":[{"taxonomy":"chapter-type","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-json\/pressbooks\/v2\/chapter-type?post=891"},{"taxonomy":"contributor","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-json\/wp\/v2\/contributor?post=891"},{"taxonomy":"license","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-json\/wp\/v2\/license?post=891"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}