L19python-核心编程-飞机大战(day3、4)

L19python-核心编程-飞机大战(day3、4),第1张

目录

问题一:pygame中Rect(left, top, width, height)的参数详解

问题二:python - pygame 中 rect.move() 和 rect.move_ip 的区别

运行效果:

1、game_main.py

2、enemy_plane.py

3、game_map.py

4、hero_plane.py

5、plane_bullet.py

6、game_score.py


问题一:pygame中Rect(left, top, width, height)的参数详解

详情见:pygame中Rect(left, top, width, height)的参数详解_追随者永远是胜利者的博客-CSDN博客_pygame.rect

常用的Rect参数有这个形式:pygame.Rect(left, top, width, height)

left,top,width,height对应的具体表示如下图,

问题二:python - pygame 中 rect.move() 和 rect.move_ip 的区别

虽然 rect.move_ip 改变了 pygame.Rect 对象本身,
rect.move 不会改变对象,但它会返回一个具有相同大小和“移动”位置的新对象。
注意,rect.move_ip 的返回值是 None ,但是 rect.move 的返回值是一个新的 pygame.Rect 对象。
rect.move_ip(x, y) 与 rect = rect.move(x, y) 的作用相同

move_ip()不能识别浮点数

素材和文件见连接:https://download.csdn.net/download/qq_48328693/85274200

运行效果:

1、game_main.py
import pygame, sys, game_map, hero_plane, enemy_plane, game_score

#定义常量
WINDOW_WIDTH,WINDOW_HEIGHT = 512,768


class GameWindow(object):
    def __init__(self):#初始化
        # 对pygame进行实例化,也叫做硬件准备
        pygame.init()
        # 加载背景音乐
        # pygame.mixer.music.load("./res/bg2.ogg")
        # # 循环播放背景音乐
        # pygame.mixer.music.play(-1)

        # 加载音效
        self.boom_sound = pygame.mixer.Sound("./res/baozha.ogg")

        # 创立窗口  set_mode([400,400])  #512*768像素,背景图大小
        self.window = pygame.display.set_mode([WINDOW_WIDTH, WINDOW_HEIGHT])

        # 设置游戏窗口的标题
        pygame.display.set_caption('飞机大战')

        # 加载本地资源图片
        logo_image = pygame.image.load('res/app.ico')

        # 设置游戏窗口logo
        pygame.display.set_icon(logo_image)

        #地图对象
        self.map = game_map.GameMap()

        #英雄飞机的对象
        self.hero_plane = hero_plane.HeroPlane()

        #添加多个敌机对象(6个)
        self.enemy_list = [enemy_plane.EnemyPlane() for i in range(6)]

        #游戏分数
        self.game_score = game_score.GameScore(35)#字体大小35

    #定义各种矩形的坐标移动
    def __action(self):
        self.map.move_down()

        #遍历子d
        for bullet in self.hero_plane.buttle_list:
            if bullet.is_shot:#为true则说明已经发射
                bullet.move_up()

        #敌机向下移动
        for enemy in self.enemy_list:
            enemy.move_down()


    #根据矩形坐标,重新对元素进行描绘
    def __draw(self):
        #添加背景图片
        self.window.blit(self.map.img_1,(0,self.map.img_1_y))#在窗口内建立图片1,位置是(0,图片纵坐标)
        self.window.blit(self.map.img_2,(0,self.map.img_2_y))
        # 添加飞机图片
        self.window.blit(self.hero_plane.img,(self.hero_plane.img_rect[0],self.hero_plane.img_rect[1]))

        #添加子d
        for bullet in self.hero_plane.buttle_list:
            #判断子d是否发射
            if bullet.is_shot:
                self.window.blit(bullet.img,(bullet.img_rect[0],bullet.img_rect[1]))

        #添加敌机
        for enemy in self.enemy_list:
            self.window.blit(enemy.img,(enemy.img_rect[0],enemy.img_rect[1]))

        #添加文字
        self.window.blit(self.game_score.text_obj,(10,10))


    #处理窗口中的监听事件
    def __event(self):
        # 获取所有游戏窗口内的事件监听,返回一个列表
        event_list = pygame.event.get()
        # 循环遍历所有游戏事件
        for event in event_list:
            # 判断鼠标点击 *** 作
            if event.type == pygame.QUIT:
                self.game_over()

            # 监听键盘上的 *** 作
            if event.type == pygame.KEYDOWN:  # 判断是否键盘
                if event.key == pygame.K_ESCAPE:  # 判断是否esc键
                    self.game_over()
                if event.key == pygame.K_SPACE:
                    self.hero_plane.shot()

        # 监听键盘中的长按事件->元组(只有两种情况,0 或 1)(返回元组)
        pressed_keys = pygame.key.get_pressed()

        # 判断向上的按键是否在长按(1)
        if pressed_keys[pygame.K_UP] or pressed_keys[pygame.K_w]:
            self.hero_plane.move_up()

        # 判断向下的按键是否在长按(1)
        if pressed_keys[pygame.K_DOWN] or pressed_keys[pygame.K_s]:
            self.hero_plane.move_down()

        # 判断向左的按键是否在长按(1)
        if pressed_keys[pygame.K_LEFT] or pressed_keys[pygame.K_a]:
            self.hero_plane.move_left()

        # 判断向右的按键是否在长按(1)
        if pressed_keys[pygame.K_RIGHT] or pressed_keys[pygame.K_d]:
            self.hero_plane.move_right()

    #刷新窗口
    def __update(self):
        pygame.display.update()

    #把游戏结束函数封装
    def game_over(self):
        # 停止音效
        self.boom_sound.stop()
        # 停止背景音乐
        # pygame.mixer.music.stop()
        # 退出游戏
        pygame.quit()
        # 退出程序
        sys.exit()

    #游戏运行
    def run(self):
        while True:
            self.__action()
            self.__draw()
            self.__event()
            self.__update()
            self.__bullet_hit_enemy()

    #子d碰撞的函数
    def __bullet_hit_enemy(self):
        # 判断
        # 遍历子d
        for bullet in self.hero_plane.buttle_list:
            # 判断子d发射
            if bullet.is_shot:
                # 遍历敌机
                for enemy in self.enemy_list:
                    # 判断两个矩形是否相交,相交返回True,否则返回False
                    flag = pygame.Rect.colliderect(bullet.img_rect, enemy.img_rect)
                    if flag:
                         # 子d状态重置
                        bullet.is_shot = False
                        # 敌机敌机状态
                        enemy.reset()
                        # 播放音效
                        self.boom_sound.play()
                        # 设置分数
                        self.game_score.set_text_obj()



#主函数
def main():

    game_window = GameWindow()
    game_window.run()

if __name__ == '__main__':#像是一个标志,象征着Java等语言中的程序主入口,告诉其他程序员,代码入口在此
    main()

2、enemy_plane.py
import random,pygame

#定义常量
WINDOW_WIDTH,WINDOW_HEIGHT = 512,768

# 自定义敌机类
class EnemyPlane(object):
    #初始化敌机
    def __init__(self):
        #敌机数量
        self.num = str(random.randint(1,7))#6架敌机
        #敌机图片
        self.img = pygame.image.load('res/img-plane_'+ self.num+'.png')
        #获取敌军飞机的图片矩阵
        self.img_rect = self.img.get_rect()

        self.reset()#因为敌军的位置和速度是随机的,所以在这里需要重置

    #设置敌机位置和速度(有修改,因为speed太快,所以调整了出现的位置代替速度的随机性)
    def reset(self):
       self.img_rect[0] = random.randint(0,WINDOW_WIDTH-self.img_rect[2])
       self.img_rect[1] = random.randint(-WINDOW_HEIGHT,-WINDOW_HEIGHT/3)
       self.speed = 1

    #敌机向下移动
    def move_down(self):
        self.img_rect.move_ip(0,self.speed)
        #判断如果在屏幕消失以后,重置敌机位置
        if self.img_rect[1] >= WINDOW_HEIGHT:
            self.reset()
3、game_map.py
import random,pygame

#定义常量
WINDOW_WIDTH,WINDOW_HEIGHT = 512,768

class GameMap(object):

    def __init__(self):#定义地图初始化

        self.num = str(random.randint(1,5))#定义1-5随机数

        #获取图片
        self.img_1 = pygame.image.load('res/img_bg_level_'+ self.num +'.jpg')#图片1-5随机显示
        self.img_2 = pygame.image.load('res/img_bg_level_'+ self.num +'.jpg')

        #设置和记录背景图片的y轴(x轴默认为0)
        self.img_1_y = -WINDOW_HEIGHT
        self.img_2_y = 0#第二张图片顶上

        #下降速度
        self.speed = 0.3

    #背景向下移动
    def move_down(self):#向下移动的类
        #重置地图y轴(初始化)
        if self.img_1_y >= 0:
            self.img_1_y = -WINDOW_HEIGHT
            self.img_2_y = 0

        self.img_1_y += self.speed
        self.img_2_y += self.speed
4、hero_plane.py
import random,pygame,plane_bullet

#定义常量
WINDOW_WIDTH,WINDOW_HEIGHT = 512,768

class HeroPlane(object):

    #初始化飞机类
    def __init__(self):
        #加载飞机图片
        self.img = pygame.image.load('res/hero.png')
        #获取飞机矩阵
        self.img_rect = self.img.get_rect()
        #设置飞机初始位置
        self.img_rect.move_ip((WINDOW_WIDTH - self.img_rect[2])/2,WINDOW_HEIGHT -self.img_rect[3]-50)

        #设置飞机速度
        self.speed = 1#不知道为啥速度为0.5就不能移动,我这个速度比教程里的速度要快好多倍

        #子dd夹
        self.buttle_list = [plane_bullet.PlaneBullet() for i in range(6)]#一次发射五个子d


   #向上
    def move_up(self):
        #边缘检测
        if self.img_rect[1] >= 0:#rect四个参数的意义详解见笔记
            self.img_rect.move_ip(0,-self.speed)

   #向下
    def move_down(self):
        #边缘检测
        if self.img_rect[1] <= WINDOW_HEIGHT -self.img_rect[3]:
            self.img_rect.move_ip(0,self.speed)

   #向左
    def move_left(self):
        if self.img_rect[0] >= 0:
            self.img_rect.move_ip(-self.speed, 0)

   #向右
    def move_right(self):
        if self.img_rect[0] <= WINDOW_WIDTH -self.img_rect[2]:
            self.img_rect.move_ip(self.speed, 0)

   #发射子弹
    def shot(self):
       #遍历所有子弹
        for buttet in self.buttle_list:
            #判断未发射的
            if not buttet.is_shot:
                #设置子弹位置
                buttet.img_rect[0] = self.img_rect[0] + (self.img_rect[2]/2 - buttet.img_rect[2]/2)
                buttet.img_rect[1] = self.img_rect[1] - buttet.img_rect[3]

                #设置子弹的发送状态

                buttet.is_shot = True
                #一次只能发射一颗子弹
                break
5、plane_bullet.py
import pygame

#定义常量
WINDOW_WIDTH,WINDOW_HEIGHT = 512,768

# 自定义一个英雄飞机子d类
class PlaneBullet(object):

    def __init__(self):
        #图片
        self.img = pygame.image.load('res/bullet_10.png')
        #获取图片矩形
        self.img_rect = self.img.get_rect()
        #设置子d状态
        self.is_shot = False
        #子d速度
        self.speed = 1

    #向上移动
    def move_up(self):

        self.img_rect.move_ip(0,-self.speed)
        #注意修改子d状态
        if self.img_rect[1] <= -self.img_rect[3]:
            self.is_shot = False
6、game_score.py

import pygame, random

# 自定义文字管理类
class GameScore(object):

    # 记录分数
    __cls_score = 0

    def __init__(self, font_size):
        # 设置字体和大小
        self.font = pygame.font.SysFont("SimHei", font_size)#(默认字体,字体大小)
        # render(text(文本内容), antialias(抗锯齿值,默认1), color(RGB)),返回文字对象
        self.text_obj = self.font.render("分数:0", 1, (255, 255, 255))

    # 设置显示的文字和字体颜色
    def set_text_obj(self):
        # 加5分
        GameScore.__cls_score += 5
        # 随机颜色值
        r = random.randint(0, 255)
        g = random.randint(0, 255)
        b = random.randint(0, 255)

        # 重新赋值
        self.text_obj = self.font.render("分数:%d" % GameScore.__cls_score, 1, (r, g, b))

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/793328.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-06
下一篇 2022-05-06

发表评论

登录后才能评论

评论列表(0条)

保存