Python_enjoy 2023-02-26 14:55 采纳率: 76.9%
浏览 32
已结题

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)

  • 写回答

3条回答 默认 最新

  • 社区专家-Monster-XH 2023-02-26 14:58
    关注

    基于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,如果大于才可以向上移动。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月1日
  • 已采纳回答 3月1日
  • 创建了问题 2月26日

悬赏问题

  • ¥20 西南科技大学数字信号处理
  • ¥15 有两个非常“自以为是”烦人的问题急期待大家解决!
  • ¥30 STM32 INMP441无法读取数据
  • ¥15 R语言绘制密度图,一个密度曲线内fill不同颜色如何实现
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥15 pyqt信号槽连接写法
  • ¥500 把面具戴到人脸上,请大家贡献智慧,别用大模型回答,大模型的答案没啥用
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。