python 发射子弹

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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值