python飞机大战(上)

  1. 类对象设置及分析:
    游戏类
    英雄飞机类
    子弹类

  2. gif转化器的因故,图片不清晰:

Alt

  1. 按键监测(单次按击,长按):
def event(self):
        #获取键盘按下事件
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                print("点击关闭窗口按钮")
                sys.exit()     #关闭程序
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE:
                    print("space")
                    self.heroPlane.fire()

        pressed_keys = pygame.key.get_pressed()         #获取键盘长按事件
        if pressed_keys[pygame.K_LEFT] or pressed_keys[pygame.K_a]:
            self.heroPlane.move_left()
        elif pressed_keys[pygame.K_RIGHT] or pressed_keys[pygame.K_d]:
            self.heroPlane.move_right()
        elif pressed_keys[pygame.K_UP] or pressed_keys[pygame.K_w]:
            self.heroPlane.move_up()
        elif pressed_keys[pygame.K_DOWN] or pressed_keys[pygame.K_s]:
            self.heroPlane.move_down()
  1. 英雄飞机类设计:
class HeroPlane:
    def __init__(self):
        self.image = pygame.image.load("images/heroplane0.png")
        self.width = self.image.get_width()
        self.heigh = self.image.get_height()
        self.x = (SCREEN_RECT.width - self.width) / 2
        self.y = SCREEN_RECT.height - self.heigh
        self.bullets = []      #记录飞机发出的所有子弹

    def move_left(self):
        self.x -= 5
        if self.x <= 0:
            self.x = 0          #控制飞机不越界

    def move_right(self):
        self.x += 5
        if self.x >= SCREEN_RECT.width - self.width:
            self.x = SCREEN_RECT.width - self.width       #控制飞机不越界

    def move_up(self):
        self.y -= 5
        if self.y <= 0:
            self.y = 0          #控制飞机不越界

    def move_down(self):
        self.y += 5
        if self.y >= SCREEN_RECT.height - self.heigh:
            self.y = SCREEN_RECT.height - self.heigh           #控制飞机不越界

    def fire(self):
        bullet = Bullet()
        bullet.x = self.x + self.width * 0.5 - bullet.width * 0.5
        bullet.y = self.y - bullet.heigh
        self.bullets.append(bullet)
  1. 子弹类设计:
class Bullet:
    #子弹位置应该立足于英雄飞机位置
    def __init__(self):
        self.image = pygame.image.load("images/herobullet0.png")
        self.x = -500
        self.y = -500
        self.width = self.image.get_width()
        self.heigh = self.image.get_height()

    #向上移动
    def move(self):
        self.y -= 5
  1. 图中运行结果代码如下:
import pygame
import sys
SCREEN_RECT = pygame.Rect(0,0,480,700)
class Game:
    def __init__(self):
        self.window = pygame.display.set_mode(SCREEN_RECT.size)
        self.backgroundImg = pygame.image.load("images/background.jpg")
        self.heroPlane = HeroPlane()    #英雄飞机


    #事件监测,按键
    def event(self):
        #获取键盘按下事件
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                print("点击关闭窗口按钮")
                sys.exit()     #关闭程序
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE:
                    print("space")
                    self.heroPlane.fire()

        pressed_keys = pygame.key.get_pressed()         #获取键盘长按事件
        if pressed_keys[pygame.K_LEFT] or pressed_keys[pygame.K_a]:
            self.heroPlane.move_left()
        elif pressed_keys[pygame.K_RIGHT] or pressed_keys[pygame.K_d]:
            self.heroPlane.move_right()
        elif pressed_keys[pygame.K_UP] or pressed_keys[pygame.K_w]:
            self.heroPlane.move_up()
        elif pressed_keys[pygame.K_DOWN] or pressed_keys[pygame.K_s]:
            self.heroPlane.move_down()

    def drow(self):
        self.window.blit(self.backgroundImg, (0, 0))
        # 要描述一个矩形区域有四个要素:(x, y)(width, height);在游戏中,所有可见的元素 都是以 矩形区域 来描述位置的。
        self.window.blit(self.heroPlane.image,(self.heroPlane.x,self.heroPlane.y))  #贴飞机图
        #贴子弹图
        for bullet in self.heroPlane.bullets:
            self.window.blit(bullet.image,(bullet.x,bullet.y))

    def update(self):
        pygame.display.update()

    def action(self):
        for bullet in self.heroPlane.bullets:
            bullet.move()
            if bullet.y <= 0:
                self.heroPlane.bullets.remove(bullet)

    def run(self):
        #一直刷新
        while True:
            # 贴背景图
            self.drow()
            # 刷新界面
            self.update()
            self.action()
            self.event()




#英雄飞机
class HeroPlane:
    def __init__(self):
        self.image = pygame.image.load("images/heroplane0.png")
        self.width = self.image.get_width()
        self.heigh = self.image.get_height()
        self.x = (SCREEN_RECT.width - self.width) / 2
        self.y = SCREEN_RECT.height - self.heigh
        self.bullets = []      #记录飞机发出的所有子弹

    def move_left(self):
        self.x -= 5
        if self.x <= 0:
            self.x = 0          #控制飞机不越界

    def move_right(self):
        self.x += 5
        if self.x >= SCREEN_RECT.width - self.width:
            self.x = SCREEN_RECT.width - self.width       #控制飞机不越界

    def move_up(self):
        self.y -= 5
        if self.y <= 0:
            self.y = 0          #控制飞机不越界

    def move_down(self):
        self.y += 5
        if self.y >= SCREEN_RECT.height - self.heigh:
            self.y = SCREEN_RECT.height - self.heigh           #控制飞机不越界

    def fire(self):
        bullet = Bullet()
        bullet.x = self.x + self.width * 0.5 - bullet.width * 0.5
        bullet.y = self.y - bullet.heigh
        self.bullets.append(bullet)

#子弹类
class Bullet:
    #子弹位置应该立足于英雄飞机位置
    def __init__(self):
        self.image = pygame.image.load("images/herobullet0.png")
        self.x = -500
        self.y = -500
        self.width = self.image.get_width()
        self.heigh = self.image.get_height()

    #向上移动
    def move(self):
        self.y -= 5
if __name__ == '__main__':
    game = Game()
    game.run()
发布了59 篇原创文章 · 获赞 2 · 访问量 1946

猜你喜欢

转载自blog.csdn.net/weixin_43148062/article/details/104516948