鱼C论坛

 找回密码
 立即注册
查看: 4903|回复: 9

增加按钮就黑屏是啥原因啊?

[复制链接]
发表于 2021-5-13 08:18:09 | 显示全部楼层 |阅读模式

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

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

x
在学习外星人入侵游戏的时候,在添加play按钮的时候就黑屏了,可以点击屏幕中央开始,但是没点之前都是黑屏,是啥原因啊?
还有后边添加几行代码来隐藏鼠标的光标的,不添加还好,添加以后直接全部黑屏了,连点击中央的位置也都没反应了,只是隐藏了光标,再没有任何回应了。
有哪位前辈可以帮忙解答一下啊?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-13 11:21:27 | 显示全部楼层
我猜是你的代码第 549 行的变量 str 没有定义
在第 548 行添加
char *str = "你为什么不发代码?"
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-13 16:01:26 | 显示全部楼层
人造人 发表于 2021-5-13 11:21
我猜是你的代码第 549 行的变量 str 没有定义
在第 548 行添加
char *str = "你为什么不发代码?"
  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, 255, 0)
  10.         self.text_color = (255, 255, 255)
  11.         self.font = pygame.font.SysFont("Arial", 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)
复制代码

这是按钮的类。


  1. import sys
  2. from time import sleep
  3. import pygame
  4. from settings import Settings
  5. from game_stats import GameStats
  6. from scoreboard import Scoreboard
  7. from button import Button
  8. from ship import Ship
  9. from bullet import Bullet
  10. from alien import Alien


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

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

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

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

  44.     def _check_play_button(self, mouse_pos):
  45.         """在玩家单击Play按钮式开始新游戏"""
  46.         # button_clicked = self.play_button.rect.collidepoint(mouse_pos)
  47.         if self.play_button.rect.collidepoint(mouse_pos):

  48.             # 重置游戏设置
  49.             self.settings.initialize_dynamic_settings()

  50.             # 重置游戏统计信息
  51.             self.stats.reset_stats()
  52.             self.stats.game_active = True
  53.             self.sb.prep_score()
  54.             self.sb.prep_level()
  55.             self.sb.prep_ships()

  56.             # 清空余下的外星人和子弹
  57.             self.aliens.empty()
  58.             self.bullets.empty()

  59.             # 创建一群新的外星人并让飞船居中
  60.             self._create_fleet()
  61.             self.ship.center_ship()
  62.             # 隐藏鼠标光标
  63.             # pygame.mouse.set_visible(False)

  64.     def _check_keydown_events(self, event):
  65.         """响应按键"""
  66.         if event.key == pygame.K_RIGHT:
  67.             self.ship.moving_right = True
  68.         elif event.key == pygame.K_LEFT:
  69.             self.ship.moving_left = True
  70.         elif event.key == pygame.K_q:
  71.             sys.exit()
  72.         elif event.key == pygame.K_SPACE:
  73.             self._fire_bullet()

  74.     def _check_keyup_events(self, event):
  75.         """响应松开"""
  76.         if event.key == pygame.K_RIGHT:
  77.             self.ship.moving_right = False
  78.         elif event.key == pygame.K_LEFT:
  79.             self.ship.moving_left = False

  80.     def _fire_bullet(self):
  81.         """创建一颗子弹,并将其加入编组bullets中。"""
  82.         if len(self.bullets) < self.settings.bullet_allowed:
  83.             new_bullet = Bullet(self)
  84.             self.bullets.add(new_bullet)

  85.     def _create_fleet(self):
  86.         """创建外星人群并计算一行能容纳多少个外星人"""
  87.         # 外星人的间距为外星人宽度
  88.         alien = Alien(self)
  89.         alien_width, alien_height = alien.rect.size
  90.         available_space_x = self.settings.screen_width - (2*alien_width)
  91.         number_aliens_x = available_space_x // (2*alien_width)

  92.         # 计算屏幕可容纳多少行外星人
  93.         ship_height = self.ship.rect.height
  94.         available_space_y = (self.settings.screen_height -
  95.                              (3 * alien_height) - ship_height)
  96.         number_rows = available_space_y // (2 * alien_height)

  97.         # 创建第一行外星人群
  98.         for row_number in range(number_rows):
  99.             for alien_number in range(number_aliens_x):
  100.                 self._create_alien(alien_number, row_number)

  101.     def _create_alien(self, alien_number, row_number):
  102.         # 创建一个外星人并将其加入当前行
  103.         alien = Alien(self)
  104.         alien_width, aline_height = alien.rect.size
  105.         alien.x = alien_width + 2 * alien_width * alien_number
  106.         alien.rect.x = alien.x
  107.         alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number
  108.         self.aliens.add(alien)

  109.     def _check_fleet_edages(self):
  110.         """有外星人到达边缘时采取措施"""
  111.         for alien in self.aliens.sprites():
  112.             if alien.check_edges():
  113.                 self._change_fleet_direction()
  114.                 break

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

  120.     def _update_bullets(self):
  121.         """更新子弹的位置并删除消失的子弹"""
  122.         # 更新子弹的位置。
  123.         self.bullets.update()
  124.         # 删除消失的子弹。
  125.         for bullet in self.bullets.copy():
  126.             if bullet.rect.bottom <= 0:
  127.                 self.bullets.remove(bullet)
  128.         self._check_bullet_alien_collisions()

  129.     def _check_bullet_alien_collisions(self):
  130.         """响应子弹和外星人碰撞"""
  131.         # 删除发生碰撞的子弹和外星人
  132.         collisions = pygame.sprite.groupcollide(self.bullets, self.aliens, True, True)
  133.         if collisions:
  134.             for aliens in collisions.values():
  135.                 self.stats.score += self.settings.alien_points * len(aliens)
  136.                 self.sb.prep_score()
  137.                 self.sb.check_high_score()
  138.         if not self.aliens:
  139.             # 删除现有的所有子弹,并创建一群新的外星人
  140.             self.bullets.empty()
  141.             self._create_fleet()
  142.             self.settings.increase_speed()

  143.             # 提高等级
  144.             self.stats.level += 1
  145.             self.sb.prep_level()

  146.     def _update_aliens(self):
  147.         """更新外星人群中所有外星人的位置"""
  148.         self._check_fleet_edages()
  149.         self.aliens.update()
  150.         # 检测外星人和飞船之间的碰撞
  151.         if pygame.sprite.spritecollideany(self.ship, self.aliens):
  152.             self._ship_hit()
  153.         # 检查是否有外星人到达了屏幕底端
  154.         self._check_aliens_bottom()

  155.     def _ship_hit(self):
  156.         """响应飞船被外星人撞到"""
  157.         if self.stats.ships_left > 0:
  158.             # 将ship_left减 1 。
  159.             self.stats.ships_left -= 1
  160.             self.sb.prep_ships()

  161.             # 清空余下的外星人和子弹
  162.             self.aliens.empty()
  163.             self.bullets.empty()

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

  167.             # 暂停
  168.             sleep(0.5)
  169.         else:
  170.             self.stats.game_active = False
  171.             # pygame.mouse.set_visible(True)

  172.     def _check_aliens_bottom(self):
  173.         """检查是否有外星人到达了屏幕底端"""
  174.         screen_rect = self.screen.get_rect()
  175.         for alien in self.aliens.sprites():
  176.             if alien.rect.bottom >= screen_rect.bottom:
  177.                 # 像飞船被撞一样处理
  178.                 self._ship_hit()
  179.                 break

  180.     def _update_screen(self):
  181.         # 更新屏幕上的图像,并切换到新屏幕
  182.         self.screen.fill(self.settings.bg_color)
  183.         self.ship.blitme()
  184.         for bullet in self.bullets.sprites():
  185.             bullet.draw_bullet()
  186.         self.aliens.draw(self.screen)

  187.         # 显示得分
  188.         self.sb.show_score()

  189.         # 如果游戏处于非活动状态,就绘制Play按钮
  190.         if not self.stats.game_active:
  191.             self.play_button.draw_button()

  192.         # 让最近绘制的屏幕可见
  193.         pygame.display.flip()

  194.     def run_game(self):
  195.         """开始游戏的主循环"""
  196.         while True:
  197.             self._check_events()
  198.             if self.stats.game_active:
  199.                 self.ship.update()
  200.                 self._update_bullets()
  201.                 self._update_screen()

  202.             self._update_aliens()


  203. if __name__ == '__main__':
  204.     # 创建游戏实例并运行游戏
  205.     ai = AlienInvasion()
  206.     ai.run_game()
复制代码

这是主程序的类

麻烦前辈帮我看看,是哪里出问题了,谢谢啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-13 16:39:42 | 显示全部楼层
ModuleNotFoundError: No module named 'settings'
settings 是 ?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-13 17:23:03 | 显示全部楼层
人造人 发表于 2021-5-13 16:39
ModuleNotFoundError: No module named 'settings'
settings 是 ?
  1. class Settings:
  2.     """存储游戏《外星人入侵》种所有的设置的类"""

  3.     def __init__(self):
  4.         """初始化游戏的设置"""
  5.         # 屏幕设置
  6.         self.screen_width = 1200
  7.         self.screen_height = 800
  8.         self.bg_color = (230, 230, 230)
  9.         self.ship_speed = 1.1
  10.         self.ship_limit = 3

  11.         # 子弹设置
  12.         self.bullet_speed = 1.5
  13.         self.bullet_width = 3
  14.         self.bullet_height = 15
  15.         self.bullet_color = (255, 0, 0)
  16.         self.bullet_allowed = 10

  17.         # 外星人设置
  18.         self.alien_speed = 0.5
  19.         self.fleet_drop_speed = 10
  20.         self.speedup_scale = 1.1
  21.         self.score_scale = 1.5
  22.         self.initialize_dynamic_settings()

  23.     def initialize_dynamic_settings(self):
  24.         """初始化随游戏进行而变化的设置"""
  25.         self.ship_speed = 1.5
  26.         self.bullet_speed = 2.5
  27.         self.alien_speed = 1.0

  28.         # fleet_direction 为 1 表示向右移,为 -1 表示向左移
  29.         self.fleet_direction = 1

  30.         # 记分
  31.         self.alien_points = 50

  32.     def increase_speed(self):
  33.         """提高速度设置和外星人分数"""
  34.         self.ship_speed *= self.speedup_scale
  35.         self.bullet_speed *= self.speedup_scale
  36.         self.alien_speed *= self.speedup_scale
  37.         self.alien_points = int(self.alien_points * self.score_scale)
复制代码



不好意思啊,忘记了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-14 16:18:07 | 显示全部楼层
老哥,你这个问题解决了吗,我也遇到了这种情况
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-15 21:35:00 | 显示全部楼层
小路灯 发表于 2022-3-14 16:18
老哥,你这个问题解决了吗,我也遇到了这种情况

没解决,一直都没人回答。这里吧,其实就是小白应该来的地方,想更加深入的话,还是找别的地方吧!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-1 17:47:33 | 显示全部楼层
你好,可以试着调整下游戏主循环  # 开始游戏的主循环
    while True:
        gf.check_events(ai_settings, screen, ship, bullets)
        gf.update_screen(ai_settings, screen, stats, ship, aliens, bullets, play_button)
        if stats.game_active:
            ship.update()
            gf.update_bullets(ai_settings, screen, ship, aliens, bullets)
            gf.update_aliens(ai_settings, stats, screen, ship, aliens, bullets)
其中
        gf.update_screen(ai_settings, screen, stats, ship, aliens, bullets, play_button)
这条命令应该是在游戏非激活状态下运行的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2023-1-29 16:18:52 | 显示全部楼层
Kindyuan26 发表于 2022-6-1 17:47
**** 作者被禁止或删除 内容自动屏蔽 ****

亲测有效 感谢~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-17 17:47:13 | 显示全部楼层
Kindyuan26 发表于 2022-6-1 17:47
**** 作者被禁止或删除 内容自动屏蔽 ****

有效,谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 16:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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