pygame 出问题了

如何让飞船不会出下边界?
go_plane_main.py:

# coding=utf-8

# 导入模块
import sys
import pygame
from settings import Settings
from hero import Hero

# 类
# 管理类
class one_pl:
    def __init__(self):
        pygame.init()
        self.settings=Settings()
        self.screen=pygame.display.set_mode((self.settings.screen_w,self.settings.screen_h))
        pygame.display.set_caption("游戏—按Q键退出")
        self.hero=Hero(self)
    def run_game(self):
        while True:
            self._check_events()
            self.hero.update()
            self._update_screen()
    def _check_events(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_q:
                    pygame.quit()
                    sys.exit()
                elif event.key == pygame.K_RIGHT:
                    self.hero.moving_right=True
                elif event.key == pygame.K_LEFT:
                    self.hero.moving_left=True
                elif event.key == pygame.K_UP:
                    self.hero.moving_up=True
                elif event.key == pygame.K_DOWN:
                    self.hero.moving_down=True
            elif event.type == pygame.KEYUP:
                if event.key == pygame.K_RIGHT:
                    self.hero.moving_right=False
                elif event.key == pygame.K_LEFT:
                    self.hero.moving_left=False
                elif event.key == pygame.K_UP:
                    self.hero.moving_up=False
                elif event.key == pygame.K_DOWN:
                    self.hero.moving_down=False
    def _update_screen(self):
        self.screen.fill(self.settings.bg_color)
        self.hero.blitme()
        pygame.display.flip()
def the_main():
    ai=one_pl()
    ai.run_game()
if __name__ == '__main__':
    the_main()


hero.py:


# 导入模块
import pygame

# 英雄类
class Hero:
    def __init__(self, ai_game):
        self.screen=ai_game.screen
        self.settings=ai_game.settings
        self.screen_rect=ai_game.screen.get_rect()
        self.image=pygame.image.load('./images/ship/ship_hero.png')     # 设置图片路径
        self.rect=self.image.get_rect()
        self.rect.midbottom=self.screen_rect.midbottom    # 设置图片在下中位置
        self.x=float(self.rect.x)
        self.y=float(self.rect.y)
        self.moving_right=False
        self.moving_left=False
        self.moving_up=False
        self.moving_down=False
    def update(self):
        if self.moving_right and self.rect.right < self.screen_rect.right:
            self.x+=self.settings.ship_speed
        if self.moving_left and self.rect.left > 0:
            self.x-=self.settings.ship_speed
        if self.moving_up and self.rect.y > 0:
            self.y-=self.settings.ship_speed
        if self.moving_down and self.rect.y < self.settings.screen_h:
            self.y+=self.settings.ship_speed
        self.rect.x=self.x
        self.rect.y=self.y
    def blitme(self):
        self.screen.blit(self.image,self.rect)

settings.py:

class Settings:
    def __init__(self):
        self.screen_w=800
        self.screen_h=600
        self.bg_color=(39,39,39)
        self.ship_speed=(1.5)

基于Monster 组和GPT的调写:
在Hero类的update方法中,可以在移动飞船前添加判断条件来防止飞船超出屏幕边界。具体方法如下:

添加下边界判断条件:当飞船的底部坐标小于屏幕的高度时,才可以向下移动。

修改上边界判断条件:当飞船的顶部坐标大于0时,才可以向上移动。

修改后的Hero类的update方法如下:

def update(self):
    if self.moving_right and self.rect.right < self.screen_rect.right:
        self.x += self.settings.ship_speed
    if self.moving_left and self.rect.left > 0:
        self.x -= self.settings.ship_speed
    if self.moving_up and self.rect.top > 0:
        self.y -= self.settings.ship_speed
    if self.moving_down and self.rect.bottom < self.screen_rect.bottom:
        self.y += self.settings.ship_speed
    self.rect.x = self.x
    self.rect.y = self.y


添加了if self.moving_down and self.rect.bottom < self.screen_rect.bottom语句,判断飞船的底部坐标是否小于屏幕的高度,如果小于才可以向下移动。同时,将原先的self.rect.y > 0改为self.rect.top > 0,判断飞船的顶部坐标是否大于0,如果大于才可以向上移动。

以下答案引用自GPT-3大模型,请合理使用:

修改示例:

要让飞船不会出下边界,在hero.py模块中,update()函数中限制移动的速度和位置即可:

def update(self):
    if self.moving_right and self.rect.right < self.screen_rect.right:
        self.x += min(self.settings.ship_speed, self.screen_rect.right - self.rect.right)  # 限制最大移动速度
    if self.moving_left and self.rect.left > 0:
        self.x -= min(self.settings.ship_speed, self.rect.left)  # 限制最大移动速度
    if self.moving_up and self.rect.y > 0:
        self.y -= min(self.settings.ship_speed, self.rect.y)  # 限制最大移动速度
    if self.moving_down and self.rect.y < self.settings.screen_h:
        self.y +=min(self.settings.ship_speed, self.settings.screen_h - self.rect.y)  # 限制最大移动速度
    self.rect.x=self.x
    self.rect.y=self.y

如果我的回答解决了您的问题,请采纳我的回答