鱼C论坛

 找回密码
 立即注册
查看: 2554|回复: 6

原来运行好好的,为什么加上一个按钮就全屏黑色?

[复制链接]
发表于 2021-5-12 14:14:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. import pygame.font


  2. class Button:

  3.     def __init__(self, ai_game, msg):
  4.         """初始化按钮的属性"""
  5.         self.screen = ai_game.screen
  6.         self.screen_rect = self.screen.get_rect()

  7.         # 设置按钮的尺寸和其他属性
  8.         self.width, self.height = 200, 50
  9.         self.button_color = (0, 0, 0)
  10.         self.text_color = (0, 0, 255)
  11.         self.font = pygame.font.SysFont(None, 48)

  12.         # 创建按钮的rect对象,并使其居中
  13.         self.rect = pygame.Rect(0, 0, self.width, self.height)
  14.         self.rect.center = self.screen_rect.center

  15.         # 按钮的标签只需创建一次
  16.         self._prep_msg(msg)

  17.     def _prep_msg(self, msg):
  18.         """将msg渲染为图像,并使其在按钮上居中"""
  19.         self.msg_image = self.font.render(msg, True, self.text_color,
  20.                                           self.button_color)
  21.         self.msg_image_rect = self.msg_image.get_rect()
  22.         self.msg_image_rect.center = self.rect.center

  23.     def draw_button(self):
  24.         # 绘制一个用颜色填充的按钮,再绘制文本
  25.         self.screen.fill(self.button_color, self.rect)
  26.         self.screen.blit(self.msg_image, self.msg_image_rect)
复制代码




这个是按钮的程序,是这个程序问题还是啥问题?
原来没有附加这按钮的时候一点问题没有,
后来就上后,直接pygame窗口就全黑了,但是我用鼠标点击中央位置,游戏有恢复正常运行了,这是什么原因啊?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-5-12 17:07:56 From FishC Mobile | 显示全部楼层
本帖最后由 小伤口 于 2021-5-12 17:09 编辑

一般这个黑屏基本都是缩进错误
有可能调用的时候出问题了吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-12 17:34:49 | 显示全部楼层
小伤口 发表于 2021-5-12 17:07
一般这个黑屏基本都是缩进错误
有可能调用的时候出问题了吧

就是调用的时候出问题了,开始游戏就出现这个问题,就是没找到哪里出问题了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-12 18:14:20 From FishC Mobile | 显示全部楼层
江湖散人 发表于 2021-5-12 17:34
就是调用的时候出问题了,开始游戏就出现这个问题,就是没找到哪里出问题了

那把完整代码发一下吧,
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-12 22:44:59 | 显示全部楼层
小伤口 发表于 2021-5-12 18:14
那把完整代码发一下吧,
  1. import sys
  2. from time import sleep
  3. import pygame
  4. from settings import Settings
  5. from game_stats import GameStats
  6. from button import Button
  7. from ship import Ship
  8. from bullet import Bullet
  9. from alien import Alien


  10. class AlienInvasion:
  11.     """管理游戏和行为的类"""

  12.     def __init__(self):
  13.         """初始化游戏并创建游戏资源"""
  14.         pygame.init()
  15.         self.settings = Settings()

  16.         self.screen = pygame.display.set_mode((self.settings.screen_width, self.settings.screen_height))
  17.         pygame.display.set_caption('Alien Invasion')
  18.         # 设置背景颜色
  19.         self.bg_color = (230, 230, 230)
  20.         # 创建一个用于存储游戏统计信息的实例
  21.         self.stats = GameStats(self)
  22.         self.ship = Ship(self)
  23.         self.bullets = pygame.sprite.Group()
  24.         self.aliens = pygame.sprite.Group()
  25.         self._create_fleet()
  26.         # 创建Play按钮
  27.         self.play_button = Button(self, 'Play')

  28.     def _check_events(self):
  29.         # 响应键盘和鼠标事件。
  30.         for event in pygame.event.get():
  31.             if event.type == pygame.QUIT:
  32.                 sys.exit()
  33.             elif event.type == pygame.KEYDOWN:
  34.                 self._check_keydown_events(event)
  35.             elif event.type == pygame.KEYUP:
  36.                 self._check_keyup_events(event)
  37.             elif event.type == pygame.MOUSEBUTTONDOWN:
  38.                 mouse_pos = pygame.mouse.get_pos()
  39.                 self._check_play_button(mouse_pos)

  40.     def _check_play_button(self, mouse_pos):
  41.         """在玩家单击Play按钮式开始新游戏"""
  42.         # button_clicked = self.play_button.rect.collidepoint(mouse_pos)
  43.         if self.play_button.rect.collidepoint(mouse_pos):
  44.             # 重置游戏设置
  45.             self.settings.initialize_dynamic_settings()
  46.             # 重置游戏统计信息
  47.             self.stats.game_active = True
  48.             # self.stats.reset_stats()

  49.             # 清空余下的外星人和子弹
  50.             self.aliens.empty()
  51.             self.bullets.empty()

  52.             # 创建一群新的外星人并让飞船居中
  53.             self._create_fleet()
  54.             self.ship.center_ship()
  55.             # 隐藏鼠标光标
  56.             # pygame.mouse.set_visible(False)

  57.     def _check_keydown_events(self, event):
  58.         """响应按键"""
  59.         if event.key == pygame.K_RIGHT:
  60.             self.ship.moving_right = True
  61.         elif event.key == pygame.K_LEFT:
  62.             self.ship.moving_left = True
  63.         elif event.key == pygame.K_q:
  64.             sys.exit()
  65.         elif event.key == pygame.K_SPACE:
  66.             self._fire_bullet()

  67.     def _check_keyup_events(self, event):
  68.         """响应松开"""
  69.         if event.key == pygame.K_RIGHT:
  70.             self.ship.moving_right = False
  71.         elif event.key == pygame.K_LEFT:
  72.             self.ship.moving_left = False

  73.     def _fire_bullet(self):
  74.         """创建一颗子弹,并将其加入编组bullets中。"""
  75.         if len(self.bullets) < self.settings.bullet_allowed:
  76.             new_bullet = Bullet(self)
  77.             self.bullets.add(new_bullet)

  78.     def _create_fleet(self):
  79.         """创建外星人群并计算一行能容纳多少个外星人"""
  80.         # 外星人的间距为外星人宽度
  81.         alien = Alien(self)
  82.         alien_width, alien_height = alien.rect.size
  83.         available_space_x = self.settings.screen_width - (2*alien_width)
  84.         number_aliens_x = available_space_x // (2*alien_width)

  85.         # 计算屏幕可容纳多少行外星人
  86.         ship_height = self.ship.rect.height
  87.         available_space_y = (self.settings.screen_height -
  88.                              (3 * alien_height) - ship_height)
  89.         number_rows = available_space_y // (2 * alien_height)

  90.         # 创建第一行外星人群
  91.         for row_number in range(number_rows):
  92.             for alien_number in range(number_aliens_x):
  93.                 self._create_alien(alien_number, row_number)

  94.     def _create_alien(self, alien_number, row_number):
  95.         # 创建一个外星人并将其加入当前行
  96.         alien = Alien(self)
  97.         alien_width, aline_height = alien.rect.size
  98.         alien.x = alien_width + 2 * alien_width * alien_number
  99.         alien.rect.x = alien.x
  100.         alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number
  101.         self.aliens.add(alien)

  102.     def _check_fleet_edages(self):
  103.         """有外星人到达边缘时采取措施"""
  104.         for alien in self.aliens.sprites():
  105.             if alien.check_edges():
  106.                 self._change_fleet_direction()
  107.                 break

  108.     def _change_fleet_direction(self):
  109.         """将整群外星人下移,并改变他们的方向"""
  110.         for alien in self.aliens.sprites():
  111.             alien.rect.y += self.settings.fleet_drop_speed
  112.         self.settings.fleet_direction *= -1

  113.     def _update_bullets(self):
  114.         """更新子弹的位置并删除消失的子弹"""
  115.         # 更新子弹的位置。
  116.         self.bullets.update()
  117.         # 删除消失的子弹。
  118.         for bullet in self.bullets.copy():
  119.             if bullet.rect.bottom <= 0:
  120.                 self.bullets.remove(bullet)
  121.         self._check_bullet_alien_collisions()

  122.     def _check_bullet_alien_collisions(self):
  123.         """响应子弹和外星人碰撞"""
  124.         # 删除发生碰撞的子弹和外星人
  125.         collisions = pygame.sprite.groupcollide(self.bullets, self.aliens, True, True)
  126.         if not self.aliens:
  127.             # 删除现有的所有子弹,并创建一群新的外星人
  128.             self.bullets.empty()
  129.             self._create_fleet()
  130.             self.settings.increase_speed()

  131.     def _update_aliens(self):
  132.         """更新外星人群中所有外星人的位置"""
  133.         self._check_fleet_edages()
  134.         self.aliens.update()
  135.         # 检测外星人和飞船之间的碰撞
  136.         if pygame.sprite.spritecollideany(self.ship, self.aliens):
  137.             self._ship_hit()
  138.         # 检查是否有外星人到达了屏幕底端
  139.         self._check_aliens_bottom()

  140.     def _ship_hit(self):
  141.         """响应飞船被外星人撞到"""
  142.         if self.stats.ships_left > 0:
  143.             # 将ship_left减 1 。
  144.             self.stats.ships_left -= 1

  145.             # 清空余下的外星人和子弹
  146.             self.aliens.empty()
  147.             self.bullets.empty()

  148.             # 创建一群新的外星人,并将飞船放到屏幕底端的中央
  149.             self._create_fleet()
  150.             self.ship.center_ship()

  151.             # 暂停
  152.             sleep(0.5)
  153.         else:
  154.             self.stats.game_active = False
  155.             # pygame.mouse.set_visible(True)

  156.     def _check_aliens_bottom(self):
  157.         """检查是否有外星人到达了屏幕底端"""
  158.         screen_rect = self.screen.get_rect()
  159.         for alien in self.aliens.sprites():
  160.             if alien.rect.bottom >= screen_rect.bottom:
  161.                 # 像飞船被撞一样处理
  162.                 self._ship_hit()
  163.                 break

  164.     def _update_screen(self):
  165.         # 更新屏幕上的图像,并切换到新屏幕
  166.         self.screen.fill(self.settings.bg_color)
  167.         self.ship.blitme()
  168.         for bullet in self.bullets.sprites():
  169.             bullet.draw_bullet()
  170.         self.aliens.draw(self.screen)
  171.         # 如果游戏处于非活动状态,就绘制Play按钮
  172.         if not self.stats.game_active:
  173.             self.play_button.draw_button()
  174.         # 让最近绘制的屏幕可见
  175.         pygame.display.flip()

  176.     def run_game(self):
  177.         """开始游戏的主循环"""
  178.         while True:
  179.             self._check_events()
  180.             if self.stats.game_active:
  181.                 self.ship.update()
  182.                 self._update_bullets()
  183.                 self._update_screen()

  184.             self._update_aliens()


  185. if __name__ == '__main__':
  186.     # 创建游戏实例并运行游戏
  187.     ai = AlienInvasion()
  188.     ai.run_game()
复制代码


还需要别的吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-12 23:05:11 From FishC Mobile | 显示全部楼层
江湖散人 发表于 2021-5-12 22:44
还需要别的吗?

好久没写Python了
没找到问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-13 08:10:01 | 显示全部楼层
小伤口 发表于 2021-5-12 23:05
好久没写Python了
没找到问题

没事,还是要谢谢你,花费这么多时间帮我看代码。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-24 01:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表