ship.py主文件 `# -- coding:utf-8 --
import pygame
from settings_test import Settings_test
from ship_test import Ship_Test
import game_test as gt
from pygame.sprite import Group
def run_game():
pygame.init()
setscreen = Settings_test()
screen = pygame.display.set_mode((setscreen.screen_width,setscreen.screen_height))
pygame.display.set_caption('Blues Screen')
#新建飞船
xing = Ship_Test(setscreen,screen)
#存放子弹的编组
bullets = Group()
while True:
gt.check_events(setscreen,screen,xing,bullets)
xing.update()
gt.update_bullets(setscreen,bullets)
gt.update_screen(setscreen,screen,xing,bullets)
run_game()
` 设置文件
# -*- coding:utf-8 -*-
class Settings_test():
def __init__(self):
self.screen_width = 500
self.screen_height = 500
self.bg_color = (220, 220, 220)
self.bg_color_white = (255, 255, 255)
self.ship_speed_factor = 1.5
# 子弹设置【单位是像素】
self.bullet_speed_factor = 1
self.bullet_width = 15
self.bullet_height = 3
self.bullet_color = 60, 60, 60
self.bullet_allowed = 10
子弹文件
# -*- coding:utf-8 -*-
import pygame
from pygame.sprite import Sprite
class Bullet2(Sprite):
'''对飞船发射的子弹管理类'''
def __init__(self,setscreen,screen,xing):
'''在飞船的位置上创建一个子弹对象'''
super().__init__()
self.screen = screen
#在(0.0)坐标处创建一个子弹的矩形,之后在调整位置
self.rect = pygame.Rect(0,0,setscreen.bullet_width,setscreen.bullet_height) #子弹不是图像,需要使用pygame的rect画一个矩形
self.rect.centery = xing.rect.centery
self.rect.right = xing.rect.right
#存储用小数表示的子弹位置
self.x = float(self.rect.x)
self.color = setscreen.bullet_color
self.speed_factor = setscreen.bullet_speed_factor
def update(self):
'''向右移动子弹'''
#更新表示子弹位置的小数
self.x += self.speed_factor
#更新表示子弹rect的位置
self.rect.x = self.x
def draw_bullet(self):
'''在屏幕上绘制子弹'''
pygame.draw.rect(self.screen,self.color,self.rect)
简化主文件的函数文件
# -*- coding:utf-8 -*-
import sys,pygame
from bullet2 import Bullet2
def check_keydown_events(event,setscreen,screen,xing,bullets):
if event.key == pygame.K_RIGHT:
xing.moving_right = True
elif event.key == pygame.K_LEFT:
xing.moving_left = True
elif event.key == pygame.K_DOWN:
xing.moving_down = True
elif event.key == pygame.K_UP:
xing.moving_up = True
elif event.key == pygame.K_SPACE:
fire(setscreen,screen,xing,bullets)
elif event.key == pygame.K_q:
sys.exit()
def check_keyup_events(event,xing):
if event.key == pygame.K_RIGHT:
xing.moving_right = False
elif event.key == pygame.K_LEFT:
xing.moving_left = False
elif event.key == pygame.K_DOWN:
xing.moving_down = False
elif event.key == pygame.K_UP:
xing.moving_up = False
def check_events(setscreen,screen,xing,bullets):
'''监控鼠标和键盘事件'''
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
check_keydown_events(event,setscreen,screen,xing,bullets)
elif event.type == pygame.KEYUP:
check_keyup_events(event,xing)
def update_screen(setscreen,screen,xing,bullets):
'''更新屏幕图像,显示新屏幕图像'''
# 每次循环都重新绘制屏幕
screen.fill(setscreen.bg_color) #屏幕填充颜色
#显示飞船
xing.blitme()
#显示子弹
for bullet in bullets.sprites():
bullet.draw_bullet()
# 让最新绘制的屏幕可见
pygame.display.flip()
def update_bullets(setscreen,bullets):
#更新子弹的位置
bullets.update()
# 删除消失在屏幕的子弹
for bullet in bullets.copy(): #从子弹编组的副本中操作
if bullet.rect.right >= setscreen.screen_width:
bullets.remove(bullet)
# print(len(bullets))
def fire(setscreen,screen,xing,bullets):
#子弹数量没有达到限制时,创建子弹并添加到编组中
if len(bullets) < setscreen.bullet_allowed:
new_bullet = Bullet2(setscreen, screen, xing)
bullets.add(new_bullet)
飞船文件
# -*- coding:utf-8 -*-
import pygame
class Ship_Test():
def __init__(self,setscreen,screen):
'''加载图片并获取属性信息'''
self.screen = screen
self.image = pygame.image.load('images/test.bmp')
self.rect = self.image.get_rect()
self.screen_rect = self.screen.get_rect()
#火箭放置屏幕最左边y轴中间
self.rect.centery = self.screen_rect.centery
self.rect.left = self.screen_rect.left
#上下方向的移动标志
self.moving_down = False
self.moving_up = False
self.setscreen = setscreen
self.center = float(self.rect.centery)
def update(self):
'''更新上下移动的位置'''
if self.moving_down and self.rect.bottom < self.screen_rect.bottom:
self.center += self.setscreen.ship_speed_factor
elif self.moving_up and self.rect.top > self.screen_rect.top:
self.center -= self.setscreen.ship_speed_factor
self.rect.centery = self.center
def blitme(self):
'''屏幕显示'''
self.screen.blit(self.image,self.rect)