赞
踩
这是主程序1.py
- #1.py主程序
- import sys
- import pygame
- from settings import Settings
- from ship import Ship
- from gamefunctions import update_screen
- from bullet import Bullet
- from gamefunctions import check_events
- from pygame.sprite import Group
- def run_game():
- pygame.init()
- my_set = Settings()
- screen = pygame.display.set_mode(my_set.set_mode)
- my_ship = Ship(screen,my_set)
- screen = pygame.display.set_mode(my_set.set_mode)
- pygame.display.set_caption(my_set.set_caption)
- bullets = Group()
- while True:
- update_screen(my_ship,my_set,screen,bullets)
-
- run_game()

这是bullet.py子弹定义的程序
- #bullet.py 这是子弹的定义程序
- import pygame
- #导入精灵的类Sprite,用于创建子弹,精灵方便用pygame.sprite的组Group管理子弹
- from pygame.sprite import Sprite
- #定义子弹的类Bullet,这是一个继承类,继承了类Sprite
- class Bullet(Sprite):
- def __init__(self,ai_settings,screen,ship):
- #初始化父类
- super().__init__()
- self.screen = screen
-
- #定义表示子弹的长方形,位置为屏幕左上角(0,0)
- self.rect = pygame.Rect(0,0,ai_settings.bullet_width,
- ai_settings.bullet_height)
- #设置子弹的位置为飞船的顶部
- self.rect.centerx = ship.rect.centerx
- self.rect.top = ship.rect.top
- #定义self.py表示飞船的位置,这里为了微调子弹,所以定义为一个float对象
- self.y = float(self.rect.y)
- #存储子弹颜色
- self.color = ai_settings.bullet_color
- #子弹的速度
- self.speed_factor = ai_settings.bullet_speed_factor
- def update(self):
- #这个函数更新子弹的位置,子弹向屏幕上方移动,横坐标不变,所以只需要改变纵坐标
- self.y -= self.speed_factor
- #把self.py赋值给子弹的纵坐标
- self.rect.y =self.y
- def draw_bullet(self):
- #下面这句是表示在屏幕上绘制子弹
- pygame.draw.rect(self.screen,self.color,self.rect)
-
-

- #gamefunctions.py
- import pygame
- import sys
- #因为下面要创建子弹实例,所以必须导入表示子弹的类
- from bullet import Bullet
- def check_keydown(event,ship,screen,bullets,settings):
- if event.key == pygame.K_DOWN:
- ship.moving_down = True
- if event.key == pygame.K_UP:
- ship.moving_up = True
- if event.key == pygame.K_LEFT:
- ship.moving_left = True
- if event.key == pygame.K_RIGHT:
- ship.moving_right = True
- if event.key == pygame.K_SPACE:
- #创建一个子弹
- new_bullet = Bullet(settings,screen,ship)
- #把子弹加入组bullets中,bullets是一个Group,一会方便用这个Group对象管理所有子弹
- #特别是方便更新子弹的位置
- bullets.add(new_bullet)
-
- #放开按键不用增加别的代码,因为放开按键对子弹没有什么影响
- def check_keyup(event,ship):
- if event.key == pygame.K_RIGHT:
- ship.moving_right = False
- if event.key == pygame.K_LEFT:
- ship.moving_left = False
- if event.key == pygame.K_UP:
- ship.moving_up = False
- if event.key == pygame.K_DOWN:
- ship.moving_down = False
- def check_events(ship,screen,bullets,settings):
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- sys.exit()
- if event.type == pygame.KEYDOWN:
- check_keydown(event,ship,screen,bullets,settings)
- if event.type == pygame.KEYUP:
- check_keyup(event,ship)
- def update_screen(ship,settings,screen,bullets):
- check_events(ship,screen,bullets,settings)
- ship.update()
- screen.fill(settings.color)
- #刷新子弹位置
- bullets.update()
- ship.blitme()
- #对bullets中每一个子弹,都绘制到屏幕上,sprites()得到所有子弹的一个类似列表的对象
- for bullet in bullets.sprites():
- bullet.draw_bullet()
- #下面是屏幕刷新程序,在刷新前必须绘制子弹
- pygame.display.flip()
-

- #settings.py 这是设置程序
- class Settings():
- def __init__(self):
- self.set_mode = (1000,800)
- self.set_caption = "alien invasion"
- self.speed_factor = 1.5
- self.color = (255,255,255)
-
- self.bullet_speed_factor = 1
- self.bullet_color = 60,60,60
- self.bullet_width = 3
- self.bullet_height = 15
-
- #ship.py
- import pygame
-
- class Ship():
- def __init__(self,screen,settings):
- 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_left = False
- self.moving_right = False
- self.moving_up = False
- self.moving_down = False
- self.center_x = float(self.rect.centerx)
-
- self.settings = settings
- def blitme(self):
- self.screen.blit(self.image,self.rect)
- def update(self):
- if self.moving_left and self.rect.left > 0:
- self.center_x -= self.settings.speed_factor
- if self.moving_right and self.rect.right < self.screen_rect.right:
- self.center_x += self.settings.speed_factor
- if self.moving_up:
- self.rect.bottom -= 1
- if self.moving_down:
- self.rect.bottom += 1
- self.rect.centerx = self.center_x
-

本文所用到的ship.bmp的下载 链接: https://pan.baidu.com/s/1Dn5yaQGZLIsN0BohM8PzoA 密码: 38ie
运行结果:
注意几个问题:
1.有时候定义类的对象的时候,少几个参数编译器是检测不出来的。
2.定义矩形的代码是:pygame.Rect(0,0,width,height),这里的R是大写的,如果写成小写,会报告以下错误:
- self.rect = pygame.rect(0,0,settings.bullet_width,settings.bullet_height)
- TypeError: 'module' object is not callable
这是目前自己学习是pygame中的第一个以大写字母开头的pygame的方法
3.精灵的英文是:sprite,读作[spraɪt]
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。