差不多用了三天的空闲时间,把这个案例看完了一遍,并且实际操作了一下,其实难度确实不高,很适合我们这样的新人去操作。不过其实遇到了许多的问题,但大多都是我的问题,做的我是心态崩了。
今天最后做play按钮的时候,怎么也不出效果,把 game_active
改为 False
就显示黑屏,而换成 True
显示内容但是没啥卵用,因为不是静态的。当时是真的不想做了,因为确实没有啥错误,出去吃了个饭,再仔细一看发现我是真的蠢!
1 2 3 4 5 6 7 8 9
| while True: gf.check_events(ai_settings, screen, stats, board, play_button, ship, aliens, bullets) if stats.game_active: ship.update() bullets.update() gf.update_bullets(ai_settings, screen, stats, board, ship, aliens, bullets) gf.update_aliens(ai_settings, screen, stats, board, ship, aliens, bullets) gf.update_screen(ai_settings, screen, stats, board, ship, aliens, bullets, play_button)
|
这一段,最后的 gf.update_screen
应该在 if
外,因为它是做出那个静态效果的,但是我当时把它放到了 if
里,所以改成 False
时,显示黑屏,我当时真的找了半天,因为他这个如果你没改 False
的话是没有任何问题出现的,最后随便一看,发现了这个错误,把我气的。
还有一些非常蠢的错误,基本上全是自己的失误吧,哎,说多了都是泪。
其实很重要的一个模块就是 pygame.sprite
,毕竟你要修改游戏要进行交互等等吧,很重要。
不得不说,细节决定成败,这句话非常有道理!
我就把外星人、计分板和按钮的 Python 文件发一下源代码,其余的还是改成附件上传吧,毕竟有点小多。
计分板的 scoreboard.py
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| import pygame.font from pygame.sprite import Group from ship import Ship
class Scoreboard(): """显示得分信息的类"""
def __init__(self, ai_settings, screen, stats): self.screen = screen self.screen_rect = screen.get_rect() self.ai_settings = ai_settings self.stats = stats self.text_color = (50, 50, 50) self.font = pygame.font.SysFont(None, 48)
self.prep_score() self.prep_high_score() self.prep_level() self.prep_ships()
def prep_ships(self): self.ships = Group() for ship_number in range(self.stats.ships_left): ship = Ship(self.ai_settings, self.screen) ship.rect.x = 10 + ship_number * ship.rect.width ship.rect.y = 10 self.ships.add(ship)
def prep_high_score(self): high_score = int(round(self.stats.high_score, -1)) high_score_str = "{:,}".format(high_score) self.high_score_image = self.font.render(high_score_str, True, self.text_color, self.ai_settings.bg_color) self.high_score_rect = self.high_score_image.get_rect() self.high_score_rect.centerx = self.screen_rect.centerx self.high_score_rect.top = self.score_rect.top
def prep_level(self): self.level_image = self.font.render(str(self.stats.level), True, self.text_color, self.ai_settings.bg_color) self.level_rect = self.level_image.get_rect() self.level_rect.right = self.score_rect.right self.level_rect.top = self.score_rect.bottom + 10
def prep_score(self): """将得分转化为图像""" rounded_score = int(round(self.stats.score, -1)) score_str = "{:,}".format(rounded_score) self.score_image = self.font.render(score_str, True, self.text_color, self.ai_settings.bg_color) self.score_rect = self.score_image.get_rect() self.score_rect.right = self.screen_rect.right - 20 self.score_rect.top = 20
def show_score(self): """在屏幕上显示得分""" self.screen.blit(self.score_image, self.score_rect) self.screen.blit(self.high_score_image, self.high_score_rect) self.screen.blit(self.level_image, self.level_rect) self.ships.draw(self.screen)
|
外星人的 alien.py
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| import pygame from pygame.sprite import Sprite
class Alien(Sprite): def __init__(self, ai_settings, screen): """初始化外星人起始位置""" super(Alien, self).__init__() self.ai_settings = ai_settings self.screen = screen
self.image = pygame.image.load("images/alien.bmp") self.rect = self.image.get_rect()
self.rect.x = self.rect.width self.rect.y = self.rect.height
self.x = float(self.rect.x)
def blitme(self): self.screen.blit(self.image, self.rect)
def check_edges(self): """如果外星人位于屏幕边缘,就返回 true""" screen_rect = self.screen.get_rect() if self.rect.right >= screen_rect.right: return True elif self.rect.left <= 0: return True
def update(self): """
向右移动外星人""" self.x += self.ai_settings.alien_speed_factor * self.ai_settings.fleet_direction self.rect.x = self.x
|
按钮的 button.py
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| import pygame.font
class Button(): def __init__(self, ai_settings, screen, msg): self.screen = screen self.screen_rect = screen.get_rect() self.width, self.height = 200, 50 self.button_color = (0, 255, 0) self.text_color = (255, 255, 255) self.font = pygame.font.SysFont(None, 48) self.rect = pygame.Rect(0, 0, self.width, self.height) self.rect.center = self.screen_rect.center self.prep_msg(msg)
def prep_msg(self, msg): self.msg_image = self.font.render(msg, True, self.text_color, self.button_color) self.msg_image_rect = self.msg_image.get_rect() self.msg_image_rect.center = self.rect.center
def draw_button(self): self.screen.fill(self.button_color, self.rect) self.screen.blit(self.msg_image, self.msg_image_rect)
|
你可以通过点击以下链接下载附件:
如果你有任何问题或需要进一步的帮助,请随时在评论区发送,我会尽力解答!