赞
踩
一、第一部分
- #文件1.py
- from ship import Ship
- from settings import Settings
- from pygame.sprite import Group
- import pygame
- import game_functions as gf
- def run_game():
- pygame.init()
- my_set = Settings()
- screen = pygame.display.set_mode(my_set.set_mode)
- my_ship = Ship(screen,my_set)
- ships = Group()
- ships.add(my_ship)
- bullets = Group()
- pygame.display.set_caption(my_set.set_caption)
- while True:
- gf.check_events(screen,my_ship,my_set,bullets)
- bullets.update()
- #用编组update完全可以的
- ships.update()
- gf.update_screen(screen,my_ship,bullets,my_set)
- #删除多余的子弹
- for bullet in bullets.copy():
- if bullet.rect.bottom < 0:
- bullets.remove(bullet)
- run_game()
-
-
-
-
-
- #文件game_functions.py
- from bullet import Bullet
- import pygame
- import sys
- def check_keydown_events(screen,ship,ai_settings,bullets,event):
- if event.key == pygame.K_RIGHT:
- ship.moving_right = True
- elif event.key == pygame.K_LEFT:
- ship.moving_left = True
- elif event.key == pygame.K_UP:
- ship.moving_up = True
- elif event.key == pygame.K_DOWN:
- ship.moving_down = True
- elif event.key == pygame.K_SPACE:
- new_bullet = Bullet(screen,ship,ai_settings)
- bullets.add(new_bullet)
- elif event.key == pygame.K_q:
- sys.exit()
-
- def check_keyup_events(ship,event):
- if event.key == pygame.K_RIGHT:
- ship.moving_right = False
- elif event.key == pygame.K_LEFT:
- ship.moving_left = False
- elif event.key == pygame.K_UP:
- ship.moving_up = False
- elif event.key == pygame.K_DOWN:
- ship.moving_down = False
-
- def check_events(screen,ship,ai_settings,bullets):
- for event in pygame.event.get():
- if event.type == pygame.KEYDOWN:
- check_keydown_events(screen,ship,ai_settings,bullets,event)
- elif event.type == pygame.KEYUP:
- check_keyup_events(ship,event)
- elif event.type == pygame.QUIT:
- sys.exit()
-
- def update_screen(screen,ship,bullets,ai_settings):
- screen.fill(ai_settings.color)
- #这里不能用编组画ship,否则报错,
- #'Group' has no attribute 'blitme',所以,编组不能直接画飞船
- ship.blitme()
- for bullet in bullets.sprites():
- bullet.draw_bullet()
- pygame.display.flip()
-
-
-
-
- #文件settings.py
- import pygame
- import sys
- class Settings():
- def __init__(self):
- self.set_mode = (1000,800)
- self.set_caption = "alien invasion"
- self.color = (255,255,255)
-
- self.bullet_color = 60,60,60
- self.bullet_speed_factor = 0.5
- self.bullet_width = 3
- self.bullet_height = 15
-
-
- #文件ship.py
- import pygame
- from pygame.sprite import Sprite
- class Ship(Sprite):
- def __init__(self,screen,settings):
- super().__init__()
- self.screen = screen
- self.settings = settings
- self.image = pygame.image.load("ship.bmp")
- self.rect = self.image.get_rect()
- self.screen_rect = self.screen.get_rect()
- self.rect.centerx = self.screen_rect.centerx
- self.rect.bottom = self.screen_rect.bottom
-
- self.moving_right = False
- self.moving_left = False
- self.moving_up = False
- self.moving_down = False
-
- self.center = float(self.rect.centerx)
-
- def update(self):
- if self.moving_right and self.rect.right < self.screen_rect.right:
- self.rect.centerx += 1
- elif self.moving_left and self.rect.left > 0:
- self.rect.centerx -= 1
- elif self.moving_up and self.rect.top > self.screen_rect.top:
- self.rect.bottom -= 1
- elif self.moving_down and self.rect.bottom < self.screen_rect.bottom:
- self.rect.bottom += 1
-
- def blitme(self):
- self.screen.blit(self.image,self.rect)
-
-
-
-
-
-
- #文件bullet.py
- from pygame.sprite import Sprite
- import pygame
-
- class Bullet(Sprite):
- def __init__(self,screen,ship,ai_settings):
- super().__init__()
- self.screen = screen
- self.settings = ai_settings
- self.rect = pygame.Rect(0,0,ai_settings.bullet_width,ai_settings.bullet_height)
- self.rect.top = ship.rect.top
- self.rect.centerx = ship.rect.centerx
- self.y = float(self.rect.y)
- def draw_bullet(self):
- pygame.draw.rect(self.screen,self.settings.bullet_color,self.rect)
- def update(self):
- self.y -= self.settings.bullet_speed_factor
- self.rect.y = self.y
-
-
编组不能画飞船的意思是,如果在主函数1.py中创立编组,比如ships = Group(),然后把ship加入,执行ships.blitme()是错误的。不能运行成功。即称为编组不能画飞船。我自己理解的。
但是,编组可以执行飞船位置更新,也就是按上述过程创立编组,然后执行ships.update()可以把飞船的位置更新.
另外,虽然,编组不能画飞船,但是可以对编组的每个元素,飞别调用画飞船的函数。如下:
- for ship in ships.sprites():
- ship.blitme()
或者
- for ship in ships:
- ship.blitme()
两者有啥区别,我不知道,但是都可以运行成功,这样说来,飞船编组完全没问题。
假设ship的编组是ships,bullet的编组是bullets:
(1)ships可以执行update(飞船位置更新),但是不能执行ships.blitme(),否则会报错,’Group‘ has no attribute 'blitme'
(2)bullets可以执行update(子弹位置更新),但是不能执行bullets.draw_bullet(),否则汇报错:
- bullets.draw_bullet()
- AttributeError: 'Group' object has no attribute 'draw_bullet'
第二部分:
如果对子弹编组调用如下代码,汇报错:
bullets.draw(screen)
编译器提示如下:
- pygame 1.9.6
- Hello from the pygame community. https://www.pygame.org/contribute.html
- Traceback (most recent call last):
- File "game.py", line 23, in <module>
- run_game()
- File "game.py", line 22, in run_game
- update_screen(screen,my_set,my_ship,bullets)
- File "/home/r/alien_invasion/1/game_functions.py", line 46, in update_screen
- bullets.draw(screen)
- File "/usr/lib/python3/dist-packages/pygame/sprite.py", line 476, in draw
- self.spritedict[spr] = surface_blit(spr.image, spr.rect)
- AttributeError: 'Bullet' object has no attribute 'image'
大题意思是,bullet没有image属性,所以不能使用bullets.draw(screen)来运行代码。看编译结尾的叙述,类似 精灵编组.draw(screen)的代码其实是如下方式调用的:
self.screen.blit(self.image,self.rect) #这句是伪代码,是解释调用.draw(screen)的过程
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。