Pygame基础2-精灵类 Sprite

2024-03-25 13:36
文章标签 基础 pygame sprite 精灵

本文主要是介绍Pygame基础2-精灵类 Sprite,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2. 精灵类

原理

精灵(sprite) 是一个古老的术语,用来描述游戏中的各种图像
精灵

在PyGame中,精灵类(Sprite) 是一个常用的类。精灵类有以下好处/用处:

  • 更好地表示游戏中的角色
  • 通过Group同时管理游戏中的多个精灵。
  • 更容易进行碰撞检测

在Pygame中,我们使用surface表示图形,用rect 移动图形。精灵类将两者结合到一个类中,这样我们就可以方便地绘制和移动图形。

在Pygame中,想要创建一个精灵类,只需要

  • 继承pygame.sprite.Sprite
  • 初始化函数中定义self.imageself.rect
  • 推荐编写update方法实现对象的更新

下面是一个例子,实现了一个随着鼠标移动的准星对象。

# 射击的准星
class Crosshair(pygame.sprite.Sprite):def __init__(self, img_path):super().__init__()self.image = pygame.image.load(img_path)self.rect = self.image.get_rect()self.gun_shot = pygame.mixer.Sound('gunshot.wav')def shoot(self):self.gun_shot.play()# 碰撞检测pygame.sprite.spritecollide(crosshair, target_group, True)def update(self):self.rect.center = pygame.mouse.get_pos()

当然,Crosshair作为一个类,除了上面说的必须的属性和方法,也可以添加任何你需要的属性和方法。我们添加了self.gun_shot表示射击声音,添加了shoot()方法表示射击动作。

注意在shoot()方法中,我们首先播放了射击声音,然后调用
pygame.sprite.spritecollide(crosshair, target_group, True) 进行碰撞检测,清除了射击到的靶子。

检测一个group中的一个精灵和另一个group的所有精灵的碰撞:
pygame.sprite.spritecollide(sprite, group, dokill, collided = None) -> Sprite_list

创建出精灵后,我们需要用Group 管理精灵:

# 为每个类别创建一个Group
crosshair_group = pygame.sprite.Group()
crosshair_group.add(crosshair)

精灵必须属于某个Group。即使Group里只有一个精灵。

在主函数中,我们通过Group 更新和绘制 其中的所有精灵。

while True:...crosshair_group.update()crosshair_group.draw(screen)

案例

使用精灵类创建一个射击游戏。

  1. 创建射击的准星Crosshair
  2. 创建射击的靶子Target
  3. 为每个类别创建一个Group
  4. 利用精灵类的碰撞检测实现射击效果。
    效果预览

使用的图片素材是在opengameart.org中下载的。

# 使用pygame SPrite实现射击游戏
import pygame
import random# 射击的准星
class Crosshair(pygame.sprite.Sprite):def __init__(self, img_path):super().__init__()self.image = pygame.image.load(img_path)self.rect = self.image.get_rect()self.gun_shot = pygame.mixer.Sound('gunshot.wav')def shoot(self):self.gun_shot.play()# 碰撞检测pygame.sprite.spritecollide(crosshair, target_group, True)def update(self):self.rect.center = pygame.mouse.get_pos()
# 射击的靶子
class Target(pygame.sprite.Sprite):def __init__(self, img_path, x, y):super().__init__()self.image = pygame.image.load(img_path)self.rect = self.image.get_rect()self.rect.center = (x, y)def update(self):pass# init 
pygame.init()
screen_width = 800
screen_height = 600
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.mouse.set_visible(False)
clock = pygame.time.Clock()
crosshair = Crosshair(r'PNG\HUD\crosshair_blue_small.png')# 为每个类别创建一个Group
crosshair_group = pygame.sprite.Group()
crosshair_group.add(crosshair)target_group = pygame.sprite.Group()
for i in range(20):x,y = random.randint(0, screen_width), random.randint(0, screen_height)target = Target(r'PNG\Objects\duck_target_yellow.png', x, y)target_group.add(target)bg_img = pygame.image.load(r'PNG\Stall\bg_wood.png')
bg_img = pygame.transform.scale(bg_img, (screen_width, screen_height))while True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()exit()if event.type == pygame.MOUSEBUTTONDOWN:crosshair.shoot()screen.blit(bg_img, (0, 0))target_group.update()target_group.draw(screen)crosshair_group.update()crosshair_group.draw(screen)pygame.display.flip()clock.tick(60)

这篇关于Pygame基础2-精灵类 Sprite的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/845179

相关文章

python操作redis基础

《python操作redis基础》Redis(RemoteDictionaryServer)是一个开源的、基于内存的键值对(Key-Value)存储系统,它通常用作数据库、缓存和消息代理,这篇文章... 目录1. Redis 简介2. 前提条件3. 安装 python Redis 客户端库4. 连接到 Re

SpringBoot基础框架详解

《SpringBoot基础框架详解》SpringBoot开发目的是为了简化Spring应用的创建、运行、调试和部署等,使用SpringBoot可以不用或者只需要很少的Spring配置就可以让企业项目快... 目录SpringBoot基础 – 框架介绍1.SpringBoot介绍1.1 概述1.2 核心功能2

Spring Boot集成SLF4j从基础到高级实践(最新推荐)

《SpringBoot集成SLF4j从基础到高级实践(最新推荐)》SLF4j(SimpleLoggingFacadeforJava)是一个日志门面(Facade),不是具体的日志实现,这篇文章主要介... 目录一、日志框架概述与SLF4j简介1.1 为什么需要日志框架1.2 主流日志框架对比1.3 SLF4

Spring Boot集成Logback终极指南之从基础到高级配置实战指南

《SpringBoot集成Logback终极指南之从基础到高级配置实战指南》Logback是一个可靠、通用且快速的Java日志框架,作为Log4j的继承者,由Log4j创始人设计,:本文主要介绍... 目录一、Logback简介与Spring Boot集成基础1.1 Logback是什么?1.2 Sprin

MySQL复合查询从基础到多表关联与高级技巧全解析

《MySQL复合查询从基础到多表关联与高级技巧全解析》本文主要讲解了在MySQL中的复合查询,下面是关于本文章所需要数据的建表语句,感兴趣的朋友跟随小编一起看看吧... 目录前言:1.基本查询回顾:1.1.查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J1.2.按照部门

Android Mainline基础简介

《AndroidMainline基础简介》AndroidMainline是通过模块化更新Android核心组件的框架,可能提高安全性,本文给大家介绍AndroidMainline基础简介,感兴趣的朋... 目录关键要点什么是 android Mainline?Android Mainline 的工作原理关键

mysql的基础语句和外键查询及其语句详解(推荐)

《mysql的基础语句和外键查询及其语句详解(推荐)》:本文主要介绍mysql的基础语句和外键查询及其语句详解(推荐),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录一、mysql 基础语句1. 数据库操作 创建数据库2. 表操作 创建表3. CRUD 操作二、外键

Python基础语法中defaultdict的使用小结

《Python基础语法中defaultdict的使用小结》Python的defaultdict是collections模块中提供的一种特殊的字典类型,它与普通的字典(dict)有着相似的功能,本文主要... 目录示例1示例2python的defaultdict是collections模块中提供的一种特殊的字

Python基础文件操作方法超详细讲解(详解版)

《Python基础文件操作方法超详细讲解(详解版)》文件就是操作系统为用户或应用程序提供的一个读写硬盘的虚拟单位,文件的核心操作就是读和写,:本文主要介绍Python基础文件操作方法超详细讲解的相... 目录一、文件操作1. 文件打开与关闭1.1 打开文件1.2 关闭文件2. 访问模式及说明二、文件读写1.

C#基础之委托详解(Delegate)

《C#基础之委托详解(Delegate)》:本文主要介绍C#基础之委托(Delegate),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 委托定义2. 委托实例化3. 多播委托(Multicast Delegates)4. 委托的用途事件处理回调函数LINQ