

{"id":140,"date":"2021-06-30T20:06:28","date_gmt":"2021-06-30T12:06:28","guid":{"rendered":"https:\/\/www.52dixiaowo.com\/python\/?p=140"},"modified":"2021-06-30T20:06:28","modified_gmt":"2021-06-30T12:06:28","slug":"pygame-%e9%a3%9e%e6%9c%ba%e5%a4%a7%e6%88%98-%e7%a2%b0%e6%92%9e%e6%a3%80%e6%b5%8b","status":"publish","type":"post","link":"https:\/\/www.52dixiaowo.com\/python\/post-140.html","title":{"rendered":"pygame \u98de\u673a\u5927\u6218 \u78b0\u649e\u68c0\u6d4b"},"content":{"rendered":"\n<p>\u672c\u8282\u5185\u5bb9, \u4e3b\u8981\u4ecb\u7ecd\u4e86&#8221;\u53d1\u5c04\u5b50\u5f39&#8221;, \u4ee5\u53ca&#8221;\u78b0\u649e\u68c0\u6d4b&#8221;<\/p>\n\n\n\n<h2>\u53d1\u5c04\u5b50\u5f39\u903b\u8f91<\/h2>\n\n\n\n<p>\u53d1\u5c04\u5b50\u5f39, \u662fhero\u7684\u4e00\u4e2a\u65b9\u6cd5, \u5728hero\u4e2d, \u65b0\u589e\u4e00\u4e2a fire \u65b9\u6cd5, \u53d1\u5c04\u5b50\u5f39\u65f6<\/p>\n\n\n\n<ul><li>\u6bcf\u96940.5\u79d2\u53d1\u5c04\u4e00\u6b21, \u4e00\u6b21\u53d1\u5c043\u9897<\/li><li>\u5b50\u5f39\u5f80\u4e0a\u79fb\u52a8, \u78b0\u5230\u654c\u673a\u540e\u6d88\u5931, \u6216\u79fb\u51fa\u5c4f\u5e55\u5916\u6d88\u5931<\/li><\/ul>\n\n\n\n<p>\u6dfb\u52a0\u5b9a\u65f6\u5668\u5e38\u91cf<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>HERO_FIRE_EVENT = pg.USEREVENT + 1  # \u53d1\u5c04\u5b50\u5f39\u8ba1\u65f6\u5668<\/code><\/pre>\n\n\n\n<p>\u5b9e\u73b0hero\u7684fire\u65b9\u6cd5<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    def fire(self):\n        print(\"\u53d1\u5c04\u5b50\u5f39\")<\/code><\/pre>\n\n\n\n<p>\u5728main.py\u4e2d\u7684init\u65b9\u6cd5\u6dfb\u52a0\u5b9a\u65f6\u5668<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>        # 5.\u6dfb\u52a0\u5b50\u5f39\u5b9a\u65f6\u5668\n        pg.time.set_timer(HERO_FIRE_EVENT, 500)<\/code><\/pre>\n\n\n\n<p>\u5728\u6e38\u620f\u5faa\u73af\u4e2d, \u76d1\u542c\u5b50\u5f39\u4e8b\u4ef6<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>            elif event.type == HERO_FIRE_EVENT:\n                self.hero.fire()<\/code><\/pre>\n\n\n\n<p>\u5b8c\u6210\u4e0a\u8ff0\u4ee3\u4ee3\u7801, \u57fa\u672c\u53d1\u5c04\u903b\u8f91\u5df2\u7ecf\u642d\u5efa\u5b8c\u6bd5, \u63a5\u4e0b\u6765\u6211\u4eec\u9700\u8981\u642d\u5efa\u5b50\u5f39\u7c7b, \u5e76\u4f7f\u7528\u5b50\u5f39\u56fe\u7247<\/p>\n\n\n\n<h2>\u642d\u5efa\u5b50\u5f39\u7c7b<\/h2>\n\n\n\n<p>\u5728plane_sprites\u6a21\u5757\u4e2d, \u65b0\u589eBullet\u7c7b, \u4ee3\u7801\u5982\u4e0b<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class Bullet(GameSprite):\n    \"\"\"\u5b50\u5f39\u7cbe\u7075\"\"\"\n\n    def __init__(self):\n        # \u8c03\u7528\u7236\u7c7b\u65b9\u6cd5, \u8bbe\u7f6e\u5b50\u5f39\u56fe\u7247, \u4ee5\u53ca\u901f\u5ea6\n        super().__init__(\".\/images\/bullet1.png\", -2)  # \u5b50\u5f39\u7684y\u51cf\u5c11, \u6545\u8d1f\u6570\n\n    def update(self):\n        # \u8c03\u7528\u7236\u7c7b\u65b9\u6cd5, \u8ba9\u5b50\u5f39\u5782\u76f4\u98de\u884c\n        super().update()\n        # \u5224\u65ad\u5b50\u5f39\u662f\u5426\u98de\u51fa\u5c4f\u5e55\n        if self.rect.bottom &lt; 0:\n            self.kill()\n\n    def __del__(self):\n        print(\"\u5b50\u5f39\u9500\u6bc1\")<\/code><\/pre>\n\n\n\n<h2>\u53d1\u5c04\u5b50\u5f39\u5b9e\u73b0<\/h2>\n\n\n\n<p>\u5728hero\u7684init\u65b9\u6cd5\u4e2d\u521b\u5efa\u5b50\u5f39\u7cbe\u7075\u7ec4<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>        # \u521b\u5efa\u5b50\u5f39\u7cbe\u7075\u7ec4\n        self.bullets = pg.sprite.Group()<\/code><\/pre>\n\n\n\n<p>\u5728main.py\u7684\u91cd\u7ed8\u65b9\u6cd5\u4e2d, \u6dfb\u52a0\u7ed8\u5236\u5b50\u5f39\u65b9\u6cd5<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>        # \u66f4\u65b0\u5b50\u5f39\n        self.hero.bullets.update()\n        self.hero.bullets.draw(self.screen)<\/code><\/pre>\n\n\n\n<p>\u5728hero\u7684fire\u65b9\u6cd5\u4e2d, \u5b8c\u5584\u53d1\u5c04\u5b50\u5f39\u65b9\u6cd5<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># \u521b\u5efa\u5b50\u5f39\u7cbe\u7075\nbullet = Bullet()\n# \u8bbe\u7f6e\u5b50\u5f39\u7cbe\u7075\u7684\u4f4d\u7f6e\nbullet.rect.bottom = self.rect.y - 20\nbullet.rect.centerx = self.rect.centerx\n# \u6dfb\u52a0\u5b50\u5f39\u7cbe\u7075\u5230\u7cbe\u7075\u7ec4\nself.bullets.add(bullet)<\/code><\/pre>\n\n\n\n<h2>\u4e00\u6b21\u53d1\u5c043\u9897\u5b50\u5f39<\/h2>\n\n\n\n<p>\u4f7f\u7528for in\u5faa\u73af, \u521b\u5efa\u5b50\u5f39\u7cbe\u7075, \u8bbe\u7f6e\u5b50\u5f39\u7cbe\u7075\u7684\u4f4d\u7f6e, \u66f4\u65b0\u540e\u7684fire\u65b9\u6cd5<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    def fire(self):\n        print(\"\u53d1\u5c04\u5b50\u5f39\")\n        # \u521b\u5efa\u5b50\u5f39\u7cbe\u7075\n        for i in (0, 1, 2):\n\n            bullet = Bullet()\n            # \u8bbe\u7f6e\u5b50\u5f39\u7cbe\u7075\u7684\u4f4d\u7f6e\n            bullet.rect.bottom = self.rect.y - i * 20\n            bullet.rect.centerx = self.rect.centerx\n            # \u6dfb\u52a0\u5b50\u5f39\u7cbe\u7075\u5230\u7cbe\u7075\u7ec4\n            self.bullets.add(bullet)<\/code><\/pre>\n\n\n\n<h2>\u5b50\u5f39\u6467\u6bc1\u654c\u673a<\/h2>\n\n\n\n<p>pygame\u63d0\u4f9b\u4e86\u975e\u5e38\u65b9\u4fbf\u7684\u78b0\u649e\u68c0\u6d4b\u65b9\u6cd5<\/p>\n\n\n\n<p><strong>1.\u7cbe\u7075\u7ec4\u78b0\u649e\u68c0\u6d4b<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>groupcollide(group, group2, dokill1, dokill2, collied = None) -> Sprite_dict<\/code><\/pre>\n\n\n\n<p>\u5982\u679c\u5c06 dokill \u8bbe\u7f6e\u4e3a True, \u5219\u53d1\u751f\u78b0\u649e\u7684\u7cbe\u7075\u5c06\u88ab\u81ea\u52a8\u79fb\u9664<\/p>\n\n\n\n<p>collied\u53c2\u6570\u662f\u8ba1\u7b97\u78b0\u649e\u7684\u56de\u8c03\u51fd\u6570, \u5982\u679c\u6ca1\u6709\u6307\u5b9a, \u6bcf\u4e00\u4e2a\u7cbe\u7075\u5e94\u8be5\u6709rect\u5c5e\u6027<\/p>\n\n\n\n<p><strong>2.\u7cbe\u7075\u78b0\u649e\u68c0\u6d4b<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>spritecollide(sprite, group, dokill, collied = None) -> Sprite_List<\/code><\/pre>\n\n\n\n<p>\u8fd9\u4e2a\u51fd\u6570, \u662f\u67d0\u4e2a\u7cbe\u7075, \u4e0e\u53e6\u4e00\u4e2a\u7cbe\u7075\u7ec4\u4e2d\u7684\u7cbe\u7075\u78b0\u649e\u68c0\u6d4b\u65b9\u6cd5<\/p>\n\n\n\n<p>\u5b50\u5f39\u7ec4\u4e0e\u654c\u673a\u7ec4\u78b0\u649e\u68c0\u6d4b, \u5e94\u8be5\u4f7f\u7528\u7684\u662f\u7b2c\u4e00\u4e2a\u51fd\u6570, \u6211\u4eec\u5728main.py\u4e2d\u627e\u5230\u78b0\u649e\u68c0\u6d4b\u65b9\u6cd5, \u4ee3\u7801\u5982\u4e0b<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>        pg.sprite.groupcollide(self.hero.bullets, self.enemy_group, True, True)<\/code><\/pre>\n\n\n\n<h2>\u5df2\u673a\u649e\u6bc1<\/h2>\n\n\n\n<p>\u6211\u4eec\u4f7f\u7528\u7b2c\u4e8c\u4e2a\u78b0\u649e\u68c0\u6d4b\u7684\u65b9\u6cd5, \u5728\u78b0\u649e\u68c0\u6d4b\u65b9\u6cd5\u4e2d\u6dfb\u52a0\u4ee3\u7801<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>        # \u82f1\u96c4\u649e\u6bc1\n        enemies = pg.sprite.spritecollide(self.hero, self.enemy_group, True)\n        if len(enemies) > 0:\n            # \u8ba9\u82f1\u96c4\u727a\u7272\n            self.hero.kill()\n            # \u6e38\u620f\u7ed3\u675f\n            PlaneGame.__game_over()<\/code><\/pre>\n\n\n\n<h2>\u4ee3\u7801\u5c0f\u7ed3<\/h2>\n\n\n\n<p>\u5230\u6b64, \u4ee3\u7801\u57fa\u672c\u5b8c\u6210, \u540e\u7eed\u529f\u80fd\u8bf7\u81ea\u884c\u6dfb\u52a0<\/p>\n\n\n\n<p>plane_sprites\u6a21\u5757<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import random\nimport pygame as pg\n\nSCREEN_RECT = pg.Rect(0, 0, 480, 700)  # \u7a97\u4f53\u5c5e\u6027\nFRAME_PER_SEC = 60  # \u5237\u65b0\u5e27\u7387\nCREATE_ENEMY_EVENT = pg.USEREVENT  # \u521b\u5efa\u654c\u673a\u8ba1\u65f6\u5668\nHERO_FIRE_EVENT = pg.USEREVENT + 1  # \u53d1\u5c04\u5b50\u5f39\u8ba1\u65f6\u5668\n\n\nclass GameSprite(pg.sprite.Sprite):\n    \"\"\"\u98de\u673a\u5927\u6218\u6e38\u620f\u7cbe\u7075\"\"\"\n\n    def __init__(self, image_name, speed=1):\n        # \u8c03\u7528\u7236\u7c7b\u7684\u521d\u59cb\u5316\u65b9\u6cd5\n        super().__init__()\n\n        # \u5b9a\u4e49\u5bf9\u8c61\u7684\u5c5e\u6027\n        self.image = pg.image.load(image_name)\n        self.rect = self.image.get_rect()\n        self.speed = speed\n\n    def update(self):\n        # \u5728\u5c4f\u5e55\u7684\u5782\u76f4\u65b9\u5411\u4e0a\u79fb\u52a8\n        self.rect.y += self.speed\n\n\nclass Background(GameSprite):\n    \"\"\"\u6e38\u620f\u80cc\u666f\u7cbe\u7075\"\"\"\n\n    def __init__(self, is_alt=False):\n\n        # 1. \u8c03\u7528\u7236\u7c7b\u65b9\u6cd5\u5b9e\u73b0\u7cbe\u7075\u7684\u521b\u5efa(image\/rect\/speed)\n        super().__init__(\".\/images\/background.png\")\n\n        # 2. \u5224\u65ad\u662f\u5426\u662f\u4ea4\u66ff\u56fe\u50cf\uff0c\u5982\u679c\u662f\uff0c\u9700\u8981\u8bbe\u7f6e\u521d\u59cb\u4f4d\u7f6e\n        if is_alt:\n            self.rect.y = -self.rect.height\n\n    def update(self):\n\n        # 1. \u8c03\u7528\u7236\u7c7b\u7684\u65b9\u6cd5\u5b9e\u73b0\n        super().update()\n\n        # 2. \u5224\u65ad\u662f\u5426\u79fb\u51fa\u5c4f\u5e55\uff0c\u5982\u679c\u79fb\u51fa\u5c4f\u5e55\uff0c\u5c06\u56fe\u50cf\u8bbe\u7f6e\u5230\u5c4f\u5e55\u7684\u4e0a\u65b9\n        if self.rect.y >= SCREEN_RECT.height:\n            self.rect.y = -self.rect.height\n\n\nclass 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))\n\n\nclass Hero(GameSprite):\n    \"\"\"\u82f1\u96c4\u7cbe\u7075\"\"\"\n\n    def __init__(self):\n        # 1.\u8c03\u7528\u7236\u7c7b\u65b9\u6cd5, \u8bbe\u7f6eimage\n        super().__init__(\".\/images\/me1.png\", 0)  # \u8bbe\u7f6e\u901f\u5ea6\u4e3a0, \u4e0d\u79fb\u52a8\n\n        # \u8bbe\u7f6e\u521d\u59cb\u4f4d\u7f6e\n        self.rect.centerx = SCREEN_RECT.centerx\n        self.rect.bottom = SCREEN_RECT.bottom - 120\n\n        # \u521b\u5efa\u5b50\u5f39\u7cbe\u7075\u7ec4\n        self.bullets = pg.sprite.Group()\n\n    def update(self):\n\n        self.rect.x += self.speed\n        # \u63a7\u5236\u8fb9\u754c\n        if self.rect.x &lt; 0:\n            self.rect.x = 0\n\n        if self.rect.right > SCREEN_RECT.right:  # right\u5c5e\u6027, \u4e3ax+width\n            self.rect.right = SCREEN_RECT.right\n\n    def fire(self):\n        print(\"\u53d1\u5c04\u5b50\u5f39\")\n        # \u521b\u5efa\u5b50\u5f39\u7cbe\u7075\n        for i in (0, 1, 2):\n\n            bullet = Bullet()\n            # \u8bbe\u7f6e\u5b50\u5f39\u7cbe\u7075\u7684\u4f4d\u7f6e\n            bullet.rect.bottom = self.rect.y - i * 20\n            bullet.rect.centerx = self.rect.centerx\n            # \u6dfb\u52a0\u5b50\u5f39\u7cbe\u7075\u5230\u7cbe\u7075\u7ec4\n            self.bullets.add(bullet)\n\nclass Bullet(GameSprite):\n    \"\"\"\u5b50\u5f39\u7cbe\u7075\"\"\"\n\n    def __init__(self):\n        # \u8c03\u7528\u7236\u7c7b\u65b9\u6cd5, \u8bbe\u7f6e\u5b50\u5f39\u56fe\u7247, \u4ee5\u53ca\u901f\u5ea6\n        super().__init__(\".\/images\/bullet1.png\", -2)  # \u5b50\u5f39\u7684y\u51cf\u5c11, \u6545\u8d1f\u6570\n\n\n    def update(self):\n        # \u8c03\u7528\u7236\u7c7b\u65b9\u6cd5, \u8ba9\u5b50\u5f39\u5782\u76f4\u98de\u884c\n        super().update()\n        # \u5224\u65ad\u5b50\u5f39\u662f\u5426\u98de\u51fa\u5c4f\u5e55\n        if self.rect.bottom &lt; 0:\n            self.kill()\n\n    def __del__(self):\n        print(\"\u5b50\u5f39\u9500\u6bc1\")\n<\/code><\/pre>\n\n\n\n<p>main.py\u4ee3\u7801<\/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        # 5.\u6dfb\u52a0\u5b50\u5f39\u5b9a\u65f6\u5668\n        pg.time.set_timer(HERO_FIRE_EVENT, 500)\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        # \u521b\u5efa\u82f1\u96c4\u7684\u7cbe\u7075\u548c\u7cbe\u7075\u7ec4\n        self.hero = Hero()  # \u4fdd\u5b58\u5230self\u4e2d, \u56e0\u4e3a\u540e\u7eed\u9700\u8981\u5bf9\u5b83\u589e\u52a0\u5b50\u5f39\n        self.hero_group = pg.sprite.Group(self.hero)\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            elif event.type == HERO_FIRE_EVENT:\n                self.hero.fire()\n            # elif event.type == pg.KEYDOWN and event.key == pg.K_RIGHT:\n            #     print(\"\u5411\u53f3\u79fb\u52a8\")\n        keys_pressed = pg.key.get_pressed()\n        if keys_pressed&#91;pg.K_RIGHT]:\n            self.hero.speed = 2\n        elif keys_pressed&#91;pg.K_LEFT]:\n            self.hero.speed = -2\n        else:\n            self.hero.speed = 0\n\n    def __check_collide(self):  # \u78b0\u649e\u68c0\u6d4b\n        pg.sprite.groupcollide(self.hero.bullets, self.enemy_group, True, True)\n        # \u82f1\u96c4\u649e\u6bc1\n        enemies = pg.sprite.spritecollide(self.hero, self.enemy_group, True)\n        if len(enemies) > 0:\n            # \u8ba9\u82f1\u96c4\u727a\u7272\n            self.hero.kill()\n            # \u6e38\u620f\u7ed3\u675f\n            PlaneGame.__game_over()\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        # \u66f4\u65b0\u82f1\u96c4\u7cbe\u7075\n        self.hero_group.update()\n        self.hero_group.draw(self.screen)\n\n        # \u66f4\u65b0\u5b50\u5f39\n        self.hero.bullets.update()\n        self.hero.bullets.draw(self.screen)\n\n    @staticmethod\n    def __game_over():\n        print(\"\u6e38\u620f\u7ed3\u675f\")\n\n        pg.quit()\n        exit()\n\n\nif __name__ == \"__main__\":\n    # \u521b\u5efa\u6e38\u620f\u5bf9\u8c61\n    game = PlaneGame()\n    # \u5f00\u59cb\u6e38\u620f\n    game.start_game()\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u672c\u8282\u5185\u5bb9, \u4e3b\u8981\u4ecb\u7ecd\u4e86&#8221;\u53d1\u5c04\u5b50\u5f39&#8221;, \u4ee5\u53ca&#8221;\u78b0\u649e\u68c0\u6d4b&#8221; \u53d1\u5c04\u5b50&hellip; <a href=\"https:\/\/www.52dixiaowo.com\/python\/post-140.html\" class=\"more-link\">\u7ee7\u7eed\u9605\u8bfb <span class=\"screen-reader-text\">pygame \u98de\u673a\u5927\u6218 \u78b0\u649e\u68c0\u6d4b<\/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\/140"}],"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=140"}],"version-history":[{"count":0,"href":"https:\/\/www.52dixiaowo.com\/python\/wp-json\/wp\/v2\/posts\/140\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.52dixiaowo.com\/python\/wp-json\/wp\/v2\/media?parent=140"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.52dixiaowo.com\/python\/wp-json\/wp\/v2\/categories?post=140"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.52dixiaowo.com\/python\/wp-json\/wp\/v2\/tags?post=140"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}