<Python編程>
外星人入侵游戲編程練習(xí)
1.鍵盤(pán)不動(dòng)事件
找了半天,找不到鍵盤(pán)按下,飛船不動(dòng)是什么原因,然后仔細(xì)對(duì)照自己的代碼和書(shū)上的代碼,發(fā)現(xiàn)事件監(jiān)聽(tīng)錯(cuò)誤,如下:
game_functions:
import sys
import pygame
def check_events(ship):
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.event == pygame.K_RIGHT:
# ship.rect.centerx += 100
ship.moving_right = True
elif event.event == pygame.K_LEFT:
ship.moving_left = True
elif event.type == pygame.KEYUP:
if event.event == pygame.K_RIGHT:
ship.moving_right = False
elif event.event == pygame.K_LEFT:
ship.moving_left = False
def update_screen(ai_settings, screen, ship):
screen.fill(ai_settings.bg_color)
ship.blitme()
pygame.display.flip()
錯(cuò)誤原因分析:
在pygame中,鍵盤(pán)是否按下監(jiān)聽(tīng)事件是通過(guò) event.type 事件;
而具體按鍵事件是要通過(guò) event.key事件;
并且在重構(gòu)ship類(lèi)代碼時(shí)也犯了錯(cuò)誤:
下面代碼時(shí)正確的,之前犯的錯(cuò)誤是在update()方法中,更新的仍是rect屬性,而不是新加的center屬性.
import pygame
class Ship():
def __init__(self, ai_settings, screen):
#初始化飛船位置
self.screen = screen
self.ai_settings = ai_settings
self.image = pygame.image.load('images/ship.bmp')
self.rect = self.image.get_rect()
self.screen_rect = screen.get_rect()
self.rect.centerx = self.screen_rect.centerx
self.rect.bottom = self.screen_rect.bottom
self.center = float(self.rect.centerx)
self.moving_right = False
self.moving_left = False
def update(self):
if self.moving_right:
self.center += self.ai_settings.ship_speed_factor
elif self.moving_left:
self.center -= self.ai_settings.ship_speed_factor
self.rect.centerx = self.center
def blitme(self):
self.screen.blit(self.image, self.rect)