python pygame小游戏素材图片_<pygame> 打飞机(小游戏)

本文介绍了如何使用Python的Pygame库制作打飞机小游戏,包括游戏初始化、图像加载、游戏循环、事件监听、精灵与精灵组的使用,以及游戏循环中的图像绘制和更新等关键步骤。
摘要由CSDN通过智能技术生成

0.游戏的基本实现

'''

游戏的基本实现

游戏的初始化:设置游戏窗口,绘制图像的初始位置,设定游戏时钟

游戏循环:设置刷新频率,检测用户交互,更新所有图像位置,更新屏幕显示

'''

1.安装pygame模块

pip install pygame

1.1.验证是否安装成功

python -m pygame.examples.aliens

内置小游戏

1.2 导入游戏素材

将解压的images包复制项目目录下

游戏素材:https://pan.baidu.com/s/1pceVqlIeCyOYlq5aNDyftA

2.开始制作游戏

2.1 游戏的初始化和退出

import pygame

# 初始化方法:导入并初始化所有pygame的模块

pygame.init()

# 编写游戏代码

print("游戏代码在这里")

# 退出:卸载所有pygame模块,在游戏结束之前调用

pygame.quit()

2.2 坐标系

原点:左上角设置成坐标系的原点

x轴:水平方向向右,逐渐增大

y轴:垂直方向向下,逐渐增大

描述准确位置(矩形区域):(x,y)(width,height)-------顶点+宽度+高度

# pygame.Rect用于描述矩形区域,简单的数学计算,可以不进行初始化

hero_rect = pygame.Rect(100, 500, 120, 125)

print("英雄的原点 %d %d" % (hero_rect.x, hero_rect.y))

print("英雄的尺寸 %d %d" % (hero_rect.width, hero_rect.height))

# size返回元组,第一个值是矩形宽度,第二个值是矩形高度

print("英雄的尺寸 %d %d" % hero_rect.size)

2.3 游戏的主窗口

# 创建游戏的主窗口pygame.display用于创建,管理游戏窗口

# 第一个参数:窗口的宽度和高度,第二个参数:附加选项,全屏、边框等,第三个参数:颜色的位数(默认自动匹配)

screen = pygame.display.set_mode((480,700),flags=0,depth=0)

# 游戏循环

while True:

pass

2.4 绘制图像

# 绘制背景图像

# 1.pygame.image.load()加载图像数据

bg = pygame.image.load("./images/background.png")

# 2.屏幕对象调用blit方法,将图像绘制在指定位置

screen.blit(bg,(0,0))

# 3.pygame.display.update(),更新屏幕显示

# pygame.display.update()

# 绘制英雄图像

hero = pygame.image.load("./images/me1.png")

screen.blit(hero,(180,500))

# 可以在绘制完成后,统一调用一次update

pygame.display.update()

# 透明图像,如果下方有内容,就会透过透明区域显示出来,不会被遮挡

# 动画的实现原理,将静止的画面快速的播放,产生连贯的效果,每个静止的画面为1帧,60帧为连贯的标准

2.5 游戏循环的相关操作

# 游戏循环

while True:

# 防止pygame window未响应,最后关闭程序时要点击窗口关闭按钮

for event in pygame.event.get():

if event.type == pygame.QUIT:

pygame.quit()

# 创建时钟对象

clock = pygame.time.Clock()

# 1.reck记录飞机的初始位置

hero_rect = pygame.Rect(150,300,102,126)

# 游戏循环

while True:

# 1秒执行多少次,即刷新频率

clock.tick(60)

# 2.修改图像位置

# y控制上下,x控制左右

hero_rect.y -= 3

if hero_rect.y == -126:

hero_rect.y = 700

# 3.调用blit绘制图像

# 防止残影,先绘制背景图像

screen.blit(bg, (0, 0))

screen.blit(hero, hero_rect)

# 4.update更新显示

pygame.display.update()

# 防止pygame window未响应,最后关闭程序时要点击窗口关闭按钮

for event in pygame.event.get():

if event.type == pygame.QUIT:

pygame.quit()

2.6 事件监听

# 捕获事件

# 防止pygame window未响应,最后关闭程序时要点击窗口关闭按钮

for event in pygame.event.get():

if event.type == pygame.QUIT:

print("退出游戏")

pygame.quit()

exit()

3 .精灵和精灵组

# 精灵:1.负责封装图像image,位置rect,速度speed

# 2.提供update方法,根据需求,更新位置rect

# 精灵组:包含多个精灵对象

# 1.update方法,让精灵组中的所有精灵调用,更新其位置

# 2.draw(screen)方法:在screen中绘制所有精灵

plane_sprites.py

import pygame

class GameSprite(pygame.sprite.Sprite):

'''飞机大战游戏精灵'''

def __init__(self, image_name, speed=1):

# 1.调用初始化方法

super().__init__()

# 2.属性

self.image = pygame.image.load(image_name)

self.rect = self.image.get_rect()

self.speed = speed

def update(self):

# 移动

self.rect.y += self.speed

# 精灵对象

enemy = GameSprite('./images/enemy1.png')

enemy1 = GameSprite('./images/enemy1.png',2)

# 精灵组

enemy_group = pygame.sprite.Group(enemy,enemy1)

游戏循环内

# 精灵组调用2个方法

# update

enemy_group.update()

# draw

enemy_group.draw(screen)

plane_sprites.py

# 精灵:1.负责封装图像image,位置rect,速度speed

# 2.提供update方法,根据需求,更新位置rect

# 精灵组:包含多个精灵对象

# 1.update方法,让精灵组中的所有精灵调用,更新其位置

# 2.draw(screen)方法:在screen中绘制所有精灵

import random

import pygame

# 屏幕大小的常量:都大写用下划线连接

SCREEN_RECT = pygame.Rect(0, 0, 480, 700)

# 刷新的帧率

FRAME_PER_SEC = 60

# 敌机的定时器常量

CREAT_ENEMY_EVENT = pygame.USEREVENT

# 英雄发射子弹事件

HERO_FIRE_EVENT = pygame.USEREVENT + 1

class GameSprite(pygame.sprite.Sprite):

'''飞机大战游戏精灵'''

def __init__(self, image_name, speed=1):

# 1.调用初始化方法

super().__init__()

# 2.属性

self.image = pygame.image.load(image_name)

self.rect = self.image.get_rect()

self.speed = speed

def update(self):

# 移动

self.rect.y += self.speed

class Background(GameSprite):

"""游戏背景精灵"""

def __init__(self, is_alt=False):

# 1.调用父类方法实现精灵的创建(image/rect/speed)

super().__init__("./images/background.png")

# 2.判断是否是交替图像

if is_alt:

self.rect.y = -self.rect.height

def update(self):

# 1.调用父类方法

super().update()

# 2.判断是否移除屏幕

if self.rect.y > SCREEN_RECT.height:

self.rect.y = -self.rect.height

class Enemy(GameSprite):

"""敌机精灵"""

def __init__(self):

# 1.调用父类方法,创建敌机精灵,同时设定敌机图片

super().__init__("./images/enemy1.png")

# 2.指定敌机的初始随机速度

self.speed = random.randint(1, 4)

# 3.指定敌机的初始随机位置,要表现飞入的感觉

self.rect.bottom = 0

max_x = SCREEN_RECT.width - self.rect.width

self.rect.x = random.randint(0, max_x)

def update(self):

# 1.调用父类方法,保持垂直方向飞行

super().update()

# 2.判断是否飞出屏幕,若飞出进行删除

if self.rect.y >= SCREEN_RECT.height:

# print("飞出屏幕。。。需要从内存销毁")

# kill可以将精灵从所有精灵组中删除

self.kill()

def __del__(self):

# print("敌机挂了。。。%s"% self.rect)

pass

class Hero(GameSprite):

"""英雄精灵"""

def __init__(self):

# 1.调用父类方法,设置英雄的图像及初始速度

super().__init__("./images/me1.png", 0)

# 2.设置英雄的初始位置

self.rect.centerx = SCREEN_RECT.centerx

self.rect.bottom = SCREEN_RECT.bottom - 80

# 3.建立子弹精灵组,英雄发射子弹

self.bullets = pygame.sprite.Group()

def update(self):

# 英雄在水平方向移动

self.rect.x += self.speed

# 控制英雄的位置

if self.rect.x <= 0:

self.rect.x = 0

elif self.rect.right > SCREEN_RECT.right:

self.rect.right = SCREEN_RECT.right

def fire(self):

# 一次发射的子弹数

for i in (0,1,2):

# 1.创建子弹精灵

bullet = Bullet()

# 2.设置精灵的位置,在英雄的上方

bullet.rect.bottom = self.rect.y - 20 * i

bullet.rect.centerx = self.rect.centerx

# 3.将精灵添加到精灵组

self.bullets.add(bullet)

class Bullet(GameSprite):

"""子弹精灵"""

def __init__(self):

# 调用父类方法,设置子弹图片和速度

super().__init__("./images/bullet1.png", -2)

def update(self):

# 调用父类方法,子弹垂直方向飞行

super().update()

# 判断子弹是否飞出屏幕

if self.rect.bottom <=0:

self.kill()

def __del__(self):

print("销毁子弹")

plane_main.py

import pygame

from plane_sprites import *

class PlaneGame(object):

"""游戏主程序"""

def __init__(self):

"""游戏初始化"""

# 1.创建游戏窗口,利用常量设定

self.screen = pygame.display.set_mode(SCREEN_RECT.size)

# 2.创建游戏时钟

self.clock = pygame.time.Clock()

# 3.调用私有方法,创建精灵和精灵组

self.__create_sprites()

# 4.设置定时器事件-创建敌机-1秒

pygame.time.set_timer(CREAT_ENEMY_EVENT, 1000)

pygame.time.set_timer(HERO_FIRE_EVENT, 500)

print("游戏初始化")

def __create_sprites(self):

"""私有方法:创建精灵"""

# 1.创建背景精灵,2张图片循环滚动

# bg1 = Background("./images/background.png")

# bg2 = Background("./images/background.png")

# bg2.rect.y= -bg2.rect.height

bg1 = Background()

# 第二张图像

bg2 = Background(True)

# 2.创建背景精灵组

self.back_group = pygame.sprite.Group(bg1,bg2)

# 3.创建敌机的精灵组

self.enemy_group = pygame.sprite.Group()

# 4.创建英雄的精灵和精灵组

self.hero = Hero()

self.hero_group = pygame.sprite.Group(self.hero)

def start_game(self):

"""游戏开始"""

print("游戏开始")

while True:

# 1.设置刷新帧率,常量

self.clock.tick(FRAME_PER_SEC)

# 2.事件监听

self.__event_handler()

# 3.碰撞检测

self.__check_collide()

# 4.更新/绘制精灵组

self.__update_sprites()

# 5.更新显示

pygame.display.update()

def __event_handler(self):

for event in pygame.event.get():

# 判断是否退出游戏

if event.type == pygame.QUIT:

PlaneGame.__game_over()

elif event.type == CREAT_ENEMY_EVENT:

# print("敌机出场")

# 1.创建敌机精灵

enemy = Enemy()

# 2.将精灵添加中精灵组

self.enemy_group.add(enemy)

# 缺点:不能一直按着不放

# elif event.type == pygame.KEYDOWN and event.key == pygame.K_RIGHT:

# print("向右移动%s"%event.key)

elif event.type == HERO_FIRE_EVENT:

# 发射子弹事件监听

self.hero.fire()

# 键盘提供的方法,获取键盘按键,返回按键元组

keys_pressed = pygame.key.get_pressed()

# 判断元组中按键索引值 ,1表示按下了

if keys_pressed[pygame.K_RIGHT]:

self.hero.speed = 2

elif keys_pressed[pygame.K_LEFT]:

self.hero.speed = -2

else:

self.hero.speed = 0

def __check_collide(self):

# 1.子弹摧毁敌机,精灵1,精灵2,是否销毁精灵1,是否销毁精灵2

pygame.sprite.groupcollide(self.hero.bullets, self.enemy_group, True, True)

# 2.英雄与敌机碰撞,

enemies = pygame.sprite.spritecollide(self.hero, self.enemy_group, True)

# 3.判断返回的列表是否有内容,有内容就销毁英雄

if len(enemies) > 0:

# 英雄牺牲

self.hero.kill()

# 结束游戏

PlaneGame.__game_over()

def __update_sprites(self):

# 更新精灵和精灵组

self.back_group.update()

self.back_group.draw(self.screen)

# 更新敌机精灵和精灵组

self.enemy_group.update()

self.enemy_group.draw(self.screen)

# 更新英雄的精灵和精灵组

self.hero_group.update()

self.hero_group.draw(self.screen)

# 更新绘制子弹

self.hero.bullets.update()

self.hero.bullets.draw(self.screen)

@staticmethod

def __game_over():

print("游戏结束")

pygame.quit()

exit()

if __name__ == '__main__':

# 创建游戏对象

game = PlaneGame()

# 启动游戏

game.start_game()

好的,我可以给你分享一下我对于设计和开发Python飞机游戏的一些思路和代码实现。 首先,我们使用Pygame这个游戏开发框架来实现游戏。PygamePython的一个游戏开发库,可以帮助我们快速地开发2D游戏。在开始开发之前,我们需要先安装Pygame库,可以通过pip进行安装。 接下来,我们需要设计游戏的场景和元素。打飞机游戏的场景通常是一个背景图片,我们可以通过Pygame中的Surface对象来加载和显示图片。游戏的元素包括玩家飞机、敌机、子弹等,我们可以使用Pygame中的Sprite类来实现这些元素。 在游戏中,玩家可以通过键盘控制飞机的移动和发射子弹。我们可以通过监听键盘事件来实现这个功能。同时,敌机会不断地从顶部下落,玩家需要躲避敌机并发射子弹来打击敌机。 下面是一个简单的代码实现,可以供你参考: ```python import pygame import random # 初始化Pygame pygame.init() # 设置游戏窗口大小 WIDTH = 480 HEIGHT = 600 screen = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("打飞机") # 加载背景图片 bg_image = pygame.image.load("background.png").convert_alpha() # 定义玩家飞机类 class Player(pygame.sprite.Sprite): def __init__(self, x, y): super().__init__() self.image = pygame.image.load("player.png").convert_alpha() self.rect = self.image.get_rect() self.rect.x = x self.rect.y = y def move_left(self): self.rect.x -= 5 def move_right(self): self.rect.x += 5 def shoot(self): bullet = Bullet(self.rect.centerx, self.rect.top) all_sprites.add(bullet) bullets.add(bullet) # 定义子弹类 class Bullet(pygame.sprite.Sprite): def __init__(self, x, y): super().__init__() self.image = pygame.image.load("bullet.png").convert_alpha() self.rect = self.image.get_rect() self.rect.x = x - self.rect.width // 2 self.rect.y = y - self.rect.height def update(self): self.rect.y -= 10 if self.rect.bottom < 0: self.kill() # 定义敌机类 class Enemy(pygame.sprite.Sprite): def __init__(self): super().__init__() self.image = pygame.image.load("enemy.png").convert_alpha() self.rect = self.image.get_rect() self.rect.x = random.randint(0, WIDTH - self.rect.width) self.rect.y = -self.rect.height def update(self): self.rect.y += 5 if self.rect.top > HEIGHT: self.kill() # 创建游戏精灵组 all_sprites = pygame.sprite.Group() player = Player(WIDTH // 2, HEIGHT - 100) enemies = pygame.sprite.Group() bullets = pygame.sprite.Group() all_sprites.add(player) # 设置游戏循环 clock = pygame.time.Clock() running = True while running: # 处理事件 for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: player.move_left() elif event.key == pygame.K_RIGHT: player.move_right() elif event.key == pygame.K_SPACE: player.shoot() # 创建敌机 if random.randint(1, 50) == 1: enemy = Enemy() all_sprites.add(enemy) enemies.add(enemy) # 更新游戏精灵 all_sprites.update() # 检测子弹和敌机的碰撞 hits = pygame.sprite.groupcollide(bullets, enemies, True, True) # 更新屏幕 screen.blit(bg_image, (0, 0)) all_sprites.draw(screen) pygame.display.flip() # 控制游戏帧率 clock.tick(60) # 退出Pygame pygame.quit() ``` 这段代码实现了一个简单的打飞机游戏,你可以根据自己的需求进行修改和扩展。希望我的回答能对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值