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日

悬赏问题

  • ¥15 angular项目错误
  • ¥20 需要帮我远程操控一下,运行一下我的那个代码,我觉得我无能为力了
  • ¥20 有偿:在ubuntu上安装arduino以及其常用库文件。
  • ¥15 请问用arcgis处理一些数据和图形,通常里面有一个根据点划泰森多边形的命令,直接划的弊端是只能执行一个完整的边界,但是我们有时候会用到需要在有很多边界内利用点来执行划泰森多边形的命令
  • ¥30 在wave2foam中执行setWaveField时遇到了如下的浮点异常问题,请问该如何解决呢?
  • ¥750 关于一道数论方面的问题,求解答!(关键词-数学方法)
  • ¥200 csgo2的viewmatrix值是否还有别的获取方式
  • ¥15 Stable Diffusion,用Ebsynth utility在视频选帧图重绘,第一步报错,蒙版和帧图没法生成,怎么处理啊
  • ¥15 请把下列每一行代码完整地读懂并注释出来
  • ¥15 寻找公式识别开发,自动识别整页文档、图像公式的软件