

{"id":138,"date":"2021-06-29T22:35:45","date_gmt":"2021-06-29T14:35:45","guid":{"rendered":"https:\/\/www.52dixiaowo.com\/python\/?p=138"},"modified":"2021-06-29T22:35:45","modified_gmt":"2021-06-29T14:35:45","slug":"pygame-%e9%a3%9e%e6%9c%ba%e5%a4%a7%e6%88%98-%e6%95%8c%e6%9c%ba%e5%87%ba%e5%9c%ba","status":"publish","type":"post","link":"https:\/\/www.52dixiaowo.com\/python\/post-138.html","title":{"rendered":"pygame \u98de\u673a\u5927\u6218 \u654c\u673a\u51fa\u573a"},"content":{"rendered":"\n<p>\u5728\u98de\u673a\u5927\u6218\u5c0f\u6e38\u620f\u4e2d, \u9700\u8981\u6bcf\u96941\u79d2\u51fa\u73b0\u4e00\u67b6\u654c\u673a, \u6b64\u5916\u8fd8\u6709\u4ee5\u4e0b\u7279\u70b9<\/p>\n\n\n\n<ul><li>\u654c\u673a\u5411\u5c4f\u5e55\u4e0b\u65b9\u98de\u884c, \u98de\u884c\u901f\u5ea6\u5404\u4e0d\u76f8\u540c<\/li><li>\u6bcf\u67b6\u654c\u673a\u7684\u6c34\u5e73\u4f4d\u7f6e\u4e5f\u4e0d\u76f8\u540c<\/li><li>\u98de\u51fa\u5c4f\u5e55\u540e, \u654c\u673a\u6d88\u5931\u4e0d\u89c1<\/li><\/ul>\n\n\n\n<h2>\u5b9a\u65f6\u5668<\/h2>\n\n\n\n<p>\u5728 pygame \u4e2d\u53ef\u4ee5\u4f7f\u7528 pygame.time.set_timer() \u6765\u6dfb\u52a0\u5b9a\u65f6\u5668, \u80fd\u6bcf\u9694\u4e00\u6bb5\u65f6\u95f4\u81ea\u52a8\u6267\u884c\u4e00\u4e9b\u4ee3\u7801<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>set_timer(eventid, milliseconds) -> None<\/code><\/pre>\n\n\n\n<p>\u6b64\u51fd\u6570, \u4f1a\u521b\u5efa\u4e00\u4e2a\u4e8b\u4ef6, \u53ef\u4ee5\u88ab\u76d1\u542c, <\/p>\n\n\n\n<p>\u53c2\u6570:<\/p>\n\n\n\n<ul><li>eventid\u7531\u5e38\u91cf pygame.USEREVENT \u6307\u5b9a, \u662f\u4e00\u4e2a\u6574\u6570, \u589e\u52a0\u53ef\u4ee5\u4f7f\u7528 USEREVENT+n\u6307\u5b9a( userevent\u662fpg\u5185\u7f6e\u5e38\u91cf )<\/li><li>\u7b2c\u4e8c\u4e2a\u53c2\u6570\u662f\u6beb\u79d2\u503c, \u6307\u5b9a\u89e6\u53d1\u95f4\u9694<\/li><\/ul>\n\n\n\n<p>\u76d1\u542c: \u57fa\u672c\u76d1\u542c\u4ee3\u7801, event.type == eventid, \u8868\u793a\u5b9a\u65f6\u5668\u4e8b\u4ef6\u89e6\u53d1<\/p>\n\n\n\n<p>\u5728plane_sprites\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u5e38\u91cf<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE_ENEMY_EVENT = pg.USEREVENT<\/code><\/pre>\n\n\n\n<p>\u5728main.py\u4e2d\u7684\u521d\u59cb\u5316\u4e2d, \u6dfb\u52a0\u5b9a\u65f6\u5668<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>        pg.time.set_timer(CREATE_ENEMY_EVENT, 1000)<\/code><\/pre>\n\n\n\n<p>\u6dfb\u52a0\u4e8b\u4ef6\u76d1\u542c, \u5f53\u5b9a\u65f6\u5668\u89e6\u53d1\u65f6, \u6267\u884c\u4ee3\u7801<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>            elif event.type == CREATE_ENEMY_EVENT:\n                print(\"\u654c\u673a\u51fa\u573a...\")<\/code><\/pre>\n\n\n\n<h2>\u8bbe\u8ba1\u654c\u673a\u7c7b<\/h2>\n\n\n\n<p>\u5728plane_sprites\u6a21\u5757\u4e2d, \u6dfb\u52a0\u4e00\u4e2aEnemy\u7c7b<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class Enemy(GameSprite):\n    \"\"\"\u654c\u673a\u7cbe\u7075\"\"\"\n\n    def __init__(self):\n        # 1. \u8c03\u7528\u7236\u7c7b\u65b9\u6cd5, \u521b\u5efa\u654c\u673a\u7cbe\u7075, \u540c\u65f6\u6307\u5b9a\u654c\u673a\u56fe\u7247\n        super().__init__(\".\/images\/enemy1.png\")\n        \n        # 2. \u6307\u5b9a\u654c\u673a\u7684\u521d\u59cb\u968f\u673a\u901f\u5ea6\n        self.speed = random.randint(1, 3)\n        # 3. \u6307\u5b9a\u654c\u673a\u7684\u521d\u59cb\u968f\u673a\u4f4d\u7f6e(x\u968f\u673a)\n        self.rect.bottom = 0  # \u6307\u5b9ay\n\n        max_x = SCREEN_RECT.width - self.rect.width\n        self.rect.x = random.randint(0, max_x)\n\n    def update(self):\n        # 1. \u8c03\u7528\u7236\u7c7b\u65b9\u6cd5, \u4fdd\u6301\u5782\u76f4\u65b9\u5411\u98de\u884c\n        super().update()\n        # 2. \u5224\u65ad\u662f\u5426\u98de\u51fa\u5c4f\u5e55, \u98de\u51fa\u5219\u5220\u9664\n        if self.rect.y >= SCREEN_RECT.height:\n            print(\"\u98de\u51fa\u5c4f\u5e55, \u9700\u8981\u4ece\u7cbe\u7075\u7ec4\u4e2d\u5220\u9664\")\n            self.kill()         # \u4f7f\u7528kill\u4ece\u7cbe\u7075\u7ec4\u4e2d\u5220\u9664\n\n    def __del__(self):\n        print(\"\u654c\u673a\u9500\u6bc1\"+str(self.rect))<\/code><\/pre>\n\n\n\n<p>\u5728\u521d\u59cb\u5316\u7cbe\u7075\u7ec4\u4e2d, \u6dfb\u52a0\u654c\u673a\u7cbe\u7075\u7ec4( \u4e0d\u521b\u5efa\u654c\u673a\u7cbe\u7075, \u800c\u662f\u5728\u4e8b\u4ef6\u89e6\u53d1\u65f6\u521b\u5efa)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>self.enemy_group = pg.sprite.Group()<\/code><\/pre>\n\n\n\n<p>\u5728\u5b9a\u65f6\u5668\u89e6\u53d1\u65f6, \u521b\u5efa\u654c\u673a\u7cbe\u7075, \u5e76\u6dfb\u52a0\u5230\u654c\u673a\u7cbe\u7075\u7ec4<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>                enemy = Enemy()\n                self.enemy_group.add(enemy)<\/code><\/pre>\n\n\n\n<p>\u5728\u91cd\u7ed8\u7cbe\u7075\u7ec4\u4e2d, \u66f4\u65b0\u654c\u673a\u7cbe\u7075\u7ec4<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>        # \u66f4\u65b0\u654c\u673a\u7cbe\u7075\n        self.enemy_group.update()\n        self.enemy_group.draw(self.screen)<\/code><\/pre>\n\n\n\n<h2>\u4ee3\u7801\u5c0f\u7ed3<\/h2>\n\n\n\n<p>\u672c\u5c0f\u8282\u65b0\u589e\u4e86Enemy\u7c7b, \u5e76\u589e\u52a0\u4e86\u4e00\u4e2a\u5e38\u91cf,  \u53c2\u8003\u4e0a\u9762\u4ee3\u7801<\/p>\n\n\n\n<p>main.py\u66f4\u65b0\u540e\u5982\u4e0b:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import pygame as pg  # \u5bfc\u5165pygame\u6a21\u5757\nfrom plane_sprites import *\n\n\nclass PlaneGame(object):\n    \"\"\"\u98de\u673a\u5927\u6218\u4e3b\u7a0b\u5e8f\"\"\"\n\n    def __init__(self):\n        print(\"\u6e38\u620f\u521d\u59cb\u5316\")\n        pg.init()\n        # 1. \u521b\u5efa\u6e38\u620f\u7684\u7a97\u53e3\n        self.screen = pg.display.set_mode(SCREEN_RECT.size)\n        # 2. \u521b\u5efa\u6e38\u620f\u7684\u65f6\u949f\n        self.clock = pg.time.Clock()\n        # 3. \u8c03\u7528\u79c1\u6709\u65b9\u6cd5\uff0c\u7cbe\u7075\u548c\u7cbe\u7075\u7ec4\u7684\u521b\u5efa\n        self.__create_sprites()\n        # 4. \u6dfb\u52a0\u654c\u673a\n        pg.time.set_timer(CREATE_ENEMY_EVENT, 1000)\n\n    def __create_sprites(self):  # \u521b\u5efa\u7cbe\u7075\u7ec4\n        # \u521b\u5efa\u80cc\u666f\u7cbe\u7075\u548c\u7cbe\u7075\u7ec4\n        bg1 = Background()\n        bg2 = Background(True)\n\n        self.back_group = pg.sprite.Group(bg1, bg2)\n\n        self.enemy_group = pg.sprite.Group()\n\n    def start_game(self):\n        print(\"\u6e38\u620f\u5f00\u59cb...\")\n\n        while True:\n            # 1. \u8bbe\u7f6e\u5237\u65b0\u5e27\u7387\n            self.clock.tick(FRAME_PER_SEC)\n            # 2. \u4e8b\u4ef6\u76d1\u542c\n            self.__event_handler()\n            # 3. \u78b0\u649e\u68c0\u6d4b\n            self.__check_collide()\n            # 4. \u66f4\u65b0\/\u7ed8\u5236\u7cbe\u7075\u7ec4\n            self.__update_sprites()\n            # 5. \u66f4\u65b0\u663e\u793a\n            pg.display.update()\n\n    def __event_handler(self):\n\n        for event in pg.event.get():\n\n            # \u5224\u65ad\u662f\u5426\u9000\u51fa\u6e38\u620f\n            if event.type == pg.QUIT:\n                PlaneGame.__game_over()\n            elif event.type == CREATE_ENEMY_EVENT:\n                print(\"\u654c\u673a\u51fa\u573a...\")\n                enemy = Enemy()\n                self.enemy_group.add(enemy)\n\n    def __check_collide(self):  # \u78b0\u649e\u68c0\u6d4b\n        pass\n\n    def __update_sprites(self):\n\n        # \u66f4\u65b0\u80cc\u666f\u7cbe\u7075\n        self.back_group.update()\n        self.back_group.draw(self.screen)\n\n        # \u66f4\u65b0\u654c\u673a\u7cbe\u7075\n        self.enemy_group.update()\n        self.enemy_group.draw(self.screen)\n\n    @staticmethod\n    def __game_over():\n        print(\"\u6e38\u620f\u7ed3\u675f\")\n\n        pg.quit()\n        exit()\n\nif __name__==\"__main__\":\n\n    # \u521b\u5efa\u6e38\u620f\u5bf9\u8c61\n    game = PlaneGame()\n    # \u5f00\u59cb\u6e38\u620f\n    game.start_game()<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u5728\u98de\u673a\u5927\u6218\u5c0f\u6e38\u620f\u4e2d, \u9700\u8981\u6bcf\u96941\u79d2\u51fa\u73b0\u4e00\u67b6\u654c\u673a, \u6b64\u5916\u8fd8\u6709\u4ee5\u4e0b\u7279\u70b9 \u654c\u673a\u5411\u5c4f\u5e55\u4e0b\u65b9\u98de\u884c, \u98de\u884c\u901f\u5ea6\u5404\u4e0d\u76f8\u540c \u6bcf&hellip; <a href=\"https:\/\/www.52dixiaowo.com\/python\/post-138.html\" class=\"more-link\">\u7ee7\u7eed\u9605\u8bfb <span class=\"screen-reader-text\">pygame \u98de\u673a\u5927\u6218 \u654c\u673a\u51fa\u573a<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[13],"tags":[],"_links":{"self":[{"href":"https:\/\/www.52dixiaowo.com\/python\/wp-json\/wp\/v2\/posts\/138"}],"collection":[{"href":"https:\/\/www.52dixiaowo.com\/python\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.52dixiaowo.com\/python\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.52dixiaowo.com\/python\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.52dixiaowo.com\/python\/wp-json\/wp\/v2\/comments?post=138"}],"version-history":[{"count":0,"href":"https:\/\/www.52dixiaowo.com\/python\/wp-json\/wp\/v2\/posts\/138\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.52dixiaowo.com\/python\/wp-json\/wp\/v2\/media?parent=138"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.52dixiaowo.com\/python\/wp-json\/wp\/v2\/categories?post=138"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.52dixiaowo.com\/python\/wp-json\/wp\/v2\/tags?post=138"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}