[英]Python/Pygame What is inherited from pygame.sprite.Sprite?
[英]What is the purpose of the pygame sprite framework?
我正在学习 Pygame,并且一次又一次地偶然发现了在 Pygame 中使用 sprite 框架的教程。 我不清楚为什么他们选择使用这个框架而不是其他方法; 使用精灵框架是可移动对象的唯一可用方法,还是有另一种方法? 精灵框架到底是什么,是什么让它变得可取? 在一个教程实例中,我什至听到那个人说“它只是让整个事情变得容易多了。” 那么精灵框架的哪些品质使它优于其他方法(如果它们存在的话)?
谢谢阅读 :-)
而 PyGame 是一个库,它有很多绘制图形、位图、线条和形状的方法。 主要的游戏用例之一是绘制和移动位图图像。 此类操作涵盖了大量游戏,尤其是早期的“街机”游戏。
通常,游戏由可动部件和静止部件组成,最终需要进行碰撞测试。 作为游戏机制的一部分,墙壁、平台、怪物、子弹、树木等在某些时候需要与玩家发生碰撞。
位图碰撞从表面上看,很容易。 只需测试玩家位图占据的矩形是否与可碰撞矩形占据的矩形相交。 但是,如果您的位图不是方形的,并且角落周围的区域或某些尖刺部分“不存在”怎么办。 那怎么碰撞呢? (代码必须对另一个位图进行逐像素测试)。
PyGame Sprite 类已经编写了许多必要的基础结构,用于创建位图精灵、移动它们和测试碰撞。 此外,它还支持与对象组发生碰撞。
所有“繁重的工作”编码都已在库中完成,并以高效的方式编写。 很多时候我在这里回答了关于 SO 的问题,作者基本上已经编写了他们不需要编写的经过测试和部分调试的代码。 这对学习编码很有好处,但如果你真的想完成一个成品,你最好使用 Sprite 库,并将节省的时间花在游戏设计上。 当然,这取决于你。
为了完善答案,这是一个简单的精灵示例:
import pygame
import random
# Window size
WINDOW_WIDTH = 400
WINDOW_HEIGHT = 400
WINDOW_SURFACE = pygame.HWSURFACE|pygame.DOUBLEBUF|pygame.RESIZABLE
INKY_BLACK = ( 18, 18, 67)
class DemoSprite( pygame.sprite.Sprite ):
def __init__( self, image_filename, x, y ):
### Called when the sprite is created. Do initialisation here.
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load( image_filename ).convert_alpha() # the image used
self.rect = self.image.get_rect() # bounding rectangle for collision
self.rect.center = ( x, y ) # Initial position
self.movement = ( random.randrange(-2, 3), random.randrange(-2, 3) ) # move randomly
def update( self ):
### Called to move, or change the state of the sprite
dx, dy = self.movement
self.rect.x += dx
self.rect.y += dy
# make sure we're still on the screen, if not - wrap around
if ( self.rect.x < 0 ):
self.rect.x = WINDOW_WIDTH
elif ( self.rect.x > WINDOW_WIDTH ):
self.rect.x = 0
if ( self.rect.y < 0 ):
self.rect.y = WINDOW_HEIGHT
elif ( self.rect.y > WINDOW_HEIGHT ):
self.rect.y = 0
### MAIN
pygame.init()
window = pygame.display.set_mode( ( WINDOW_WIDTH, WINDOW_HEIGHT ), WINDOW_SURFACE )
pygame.display.set_caption("Sprite Demo")
# Add some sprites
sprite_group = pygame.sprite.Group()
for i in range( 30 ):
# Random position within the middle 80% of screen
pos_x = random.randrange( WINDOW_WIDTH//10, WINDOW_WIDTH-WINDOW_WIDTH//10 )
pos_y = random.randrange( WINDOW_HEIGHT//10, WINDOW_HEIGHT-WINDOW_HEIGHT//10 )
sprite_group.add( DemoSprite( "alien.png", pos_x, pos_y ) )
clock = pygame.time.Clock()
done = False
while not done:
# re-position all the cars
sprite_group.update()
# Handle any collisions
# Simply removes the sprites if they collide
for alien in sprite_group:
collided_with = pygame.sprite.spritecollide( alien, sprite_group, False )
collided_with.remove( alien ) # other than ourselves
if ( len( collided_with ) > 0 ):
sprite_group.remove( alien ) # it's now gone
# Handle User-input Events
for event in pygame.event.get():
if ( event.type == pygame.QUIT ):
done = True
elif ( event.type == pygame.MOUSEBUTTONUP ):
# On mouse-click, add a new sprite (at the cursor)
mouse_pos = pygame.mouse.get_pos()
sprite_group.add( DemoSprite( "alien.png", mouse_pos[0], mouse_pos[1] ) )
# Handle User Movement keys
keys = pygame.key.get_pressed()
#if ( keys[pygame.K_UP] ):
# print("up")
# Update the window, but not more than 60fps
window.fill( INKY_BLACK )
sprite_group.draw( window )
pygame.display.flip()
# Clamp FPS
clock.tick_busy_loop(60)
pygame.quit()
使用精灵库,我们设法在 5 行代码中将每个精灵与其他精灵碰撞。 当然这是一个简单的人为案例,但它可能很容易是子弹和外星人的 sprite_groups,或者玩家和平台——仍然不会有更多的代码。
它简单、快速并且已经编写好了。
如果你想自己写,很好! 如果你想使用图书馆,那也很棒。 这是您的代码,随心所欲。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.