鱼C论坛

 找回密码
 立即注册
查看: 2403|回复: 10

[已解决]请问代码运行没有报错,按钮“Play"没有显示出来,是什么原因

[复制链接]
发表于 2017-12-11 23:04:35 | 显示全部楼层 |阅读模式

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

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

x
请各位大神解惑(在鱼c发这帖子会不会被打 为了解惑,打也认了)。问题如下,代码可以正常运行,没有报错,但是按钮”Play“却没有在界面上显示出来,不知道是不是没有调用对应的函数,还是咋的。
相关的代码如下
alien_invasion.py

  1. import pygame
  2. import game_functions as gf
  3. from settings import Settings
  4. from ship import Ship
  5. from pygame.sprite import Group
  6. from game_stats import GameStats
  7. from button import Button

  8. def run_game():
  9.     #初始化游戏并创建一个屏幕对象
  10.     pygame.init()
  11.     ai_settings = Settings()
  12.     screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
  13.     pygame.display.set_caption("外星人入侵")

  14.     #创建Play按钮
  15.     play_button = Button(ai_settings,screen,"Play")

  16.     #创建一个用于存储游戏统计信息的实例
  17.     stats = GameStats(ai_settings)

  18.     #创建一艘飞船
  19.     ship = Ship(ai_settings,screen)
  20.     #创建一个用于存储子弹的编组
  21.     bullets = Group()
  22.     # 创建一个用于存储外星人群的编组
  23.     aliens = Group()

  24.     #创建外星人群
  25.     #alien = Alien(ai_settings,screen)#创建一个外星人
  26.     gf.create_fleet(ai_settings,screen,ship,aliens)

  27.    #开始游戏的主循环
  28.     while True:
  29.         # 监视键盘和鼠标事件
  30.         gf.check_events(ai_settings,screen,ship,bullets)

  31.         if stats.game_active:
  32.             #监视键盘松开或是按下向右的按钮
  33.             ship.update()
  34.             # 监视键盘松开或是按下空格键的按钮
  35.             gf.update_bullets(ai_settings,screen,ship,aliens,bullets)
  36.             #更新每个外星人的位置
  37.             gf.update_aliens(ai_settings,screen,stats,ship,aliens,bullets)

  38.         #每次循环都重新绘屏幕,让最近绘制的屏幕可见
  39.         gf.update_screen(ai_settings,screen,stats,ship,aliens,bullets,play_button)

  40. run_game()
复制代码


game_functions.py

  1. import sys
  2. import pygame
  3. from bullet import Bullet
  4. from alien import Alien
  5. from time import sleep

  6. def check_keydown_events(event,ai_settings,screen,ship,bullets):
  7.     """响应按键"""
  8.     if event.key == pygame.K_RIGHT:
  9.         ship.moving_right = True
  10.     elif event.key == pygame.K_LEFT:
  11.         ship.moving_left = True
  12.     elif event.key == pygame.K_SPACE:
  13.         fire_bullet(ai_settings,screen,ship,bullets)
  14.     elif event.key == pygame.K_q:
  15.         sys.exit()

  16. def fire_bullet(ai_settings,screen,ship,bullets):
  17.     """如果还没有到达限制,就发射一颗子弹"""
  18.     # 创建新子弹,并将其加入到编组bullets中
  19.     if len(bullets) < ai_settings.bullets_allowed:
  20.         new_bullet = Bullet(ai_settings, screen, ship)
  21.         bullets.add(new_bullet)

  22. def check_keyup_events(event,ship):
  23.     """响应松开"""
  24.     if event.key == pygame.K_RIGHT:
  25.         ship.moving_right = False
  26.     elif event.key == pygame.K_LEFT:
  27.         ship.moving_left = False

  28. def check_events(ai_settings,screen,ship,bullets):
  29.     """响应按键和鼠标事件"""
  30.     for event in pygame.event.get():
  31.         if event.type == pygame.QUIT:
  32.             sys.exit()
  33.         elif event.type == pygame.KEYDOWN:
  34.             check_keydown_events(event,ai_settings,screen,ship,bullets)
  35.         elif event.type == pygame.KEYUP:
  36.             check_keyup_events(event,ship)

  37. def update_screen(ai_settings,screen,stats,ship,aliens,bullets,play_button):
  38.     """更新屏幕上的图像,并切换到新屏幕"""
  39.     #每次循环时都重绘屏幕
  40.     screen.fill(ai_settings.bg_color)
  41.     #在飞船和外星人后面重绘所有子弹
  42.     for bullet in bullets.sprites():
  43.         bullet.draw_bullet()
  44.     ship.blitme()
  45.     aliens.draw(screen)
  46.     #如果游戏处于非活动状态,就绘制Play按钮
  47.     if not stats.game_active:
  48.         play_button.draw_button
  49.     #让最近绘制的屏幕可见
  50.     pygame.display.flip()
复制代码


game_stats.py

  1. class GameStats():
  2.     """跟踪游戏的统计信息"""

  3.     def __init__(self,ai_settings):
  4.         """初始化统计信息"""
  5.         self.ai_settings = ai_settings
  6.         self.reset_stats()
  7.         #游戏刚启动时处于非活动状态
  8.         self.game_active = False

  9.     def reset_stats(self):
  10.         """初始化在游戏运行期间可能变化的统计信息"""
  11.         self.ships_left = self.ai_settings.ship_limit
复制代码


button.py

  1. import pygame.ftfont

  2. class Button():

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

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

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

  15.         # &#160;&#160;&#160;按钮的标签只需创建一次
  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,self.button_color)
  20.         self.msg_image_rect = self.msg_image.get_rect()
  21.         self.msg_image_rect.center = self.rect.center


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


运行alien_invasion.py文件,游戏界面的截图如附件,”Play“的按钮没有显示出来

最佳答案
2017-12-13 20:48:20
木易杨 发表于 2017-12-13 16:44
好的,是我这边考虑不全 现在就把源代码打包了,并上传到附件中。

    if not stats.game_active:
        play_button.draw_button()

方法记得要() ,要不然得到的就是函数的地址。

请忽略因电脑屏幕小,而没有显示全的界面

请忽略因电脑屏幕小,而没有显示全的界面
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-12-12 00:32:54 | 显示全部楼层
没出来,要不就是没有绘制,要不就是被覆盖了。好好检查下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-13 08:47:28 From FishC Mobile | 显示全部楼层
ba21 发表于 2017-12-12 00:32
没出来,要不就是没有绘制,要不就是被覆盖了。好好检查下

嗯,因初学,不知道怎样去判断是没有绘制,还是被覆盖了。我自己检查n遍代码,也找了好多资料,还是没有解决。求大神指点
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-13 09:12:46 | 显示全部楼层
石辽志吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-13 10:39:30 | 显示全部楼层

石辽志?什么意思?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-13 11:32:06 | 显示全部楼层
木易杨 发表于 2017-12-13 08:47
嗯,因初学,不知道怎样去判断是没有绘制,还是被覆盖了。我自己检查n遍代码,也找了好多资料,还是没有 ...

求指点就把源代码打包上来才是吧。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-13 16:44:00 | 显示全部楼层
ba21 发表于 2017-12-13 11:32
求指点就把源代码打包上来才是吧。

好的,是我这边考虑不全 现在就把源代码打包了,并上传到附件中。

alien_invasion.zip

172.65 KB, 下载次数: 2

里面的alien_invasion.py是主程序

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-13 20:48:20 | 显示全部楼层    本楼为最佳答案   
木易杨 发表于 2017-12-13 16:44
好的,是我这边考虑不全 现在就把源代码打包了,并上传到附件中。

    if not stats.game_active:
        play_button.draw_button()

方法记得要() ,要不然得到的就是函数的地址。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-13 22:55:23 | 显示全部楼层
ba21 发表于 2017-12-13 20:48
if not stats.game_active:
        play_button.draw_button()

谢谢大神,看来我的基本的知识还需好好努力
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-13 23:10:36 | 显示全部楼层
ba21 发表于 2017-12-13 20:48
if not stats.game_active:
        play_button.draw_button()

在请问个问题,在button.py文件中的第一个函数方法def __init__中,为什么一定要有"ai_settings"这个参数,在这个这个函数中,都没有用到这个参数。下面是button.py文件的代码
button.py

  1. import pygame.ftfont

  2. class Button():

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

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

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

  15.         # &#160;&#160;&#160;按钮的标签只需创建一次
  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,self.button_color)
  20.         self.msg_image_rect = self.msg_image.get_rect()
  21.         self.msg_image_rect.center = self.rect.center


  22.     def draw_button(self):
  23.         #制一个用颜色填充的按钮,再绘制文本
  24.         self.screen.fill(self.button_color,self.rect)
  25.         self.screen.blit(self.msg_image,self.msg_image_rect)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-14 10:42:24 | 显示全部楼层
木易杨 发表于 2017-12-13 23:10
在请问个问题,在button.py文件中的第一个函数方法def __init__中,为什么一定要有"ai_settings"这个参数 ...

没有就不用
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-4 17:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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