您的位置:首页 > 编程语言 > Python开发

python 发射子弹

2018-01-23 00:00 387 查看
摘要: 飞船能上下移动,能够发射子弹,以及处理消失的子弹

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 i
3ff0
n 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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Python