Python 拖动多个具有不同“颜色”的精灵;更新()”;Pygame中相同精灵类的方法

Python 拖动多个具有不同“颜色”的精灵;更新()”;Pygame中相同精灵类的方法,python,pygame,pygame-surface,Python,Pygame,Pygame Surface,我正在尝试制作多个精灵,它们都来自同一个pygame精灵类 class animatedSprites(pygame.sprite.Sprite): def __init__(self, spriteName): pygame.sprite.Sprite.__init__(self) self.image = pygame.Surface((width,height)) self.images = [] self.image

我正在尝试制作多个精灵,它们都来自同一个pygame精灵类

class animatedSprites(pygame.sprite.Sprite):
    def __init__(self, spriteName):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((width,height))
        self.images = []
        self.images.append(spriteName[0])
        self.rect = self.image.get_rect() #sets sprites size and pos
        self.rect.center = (POSITIONx1[4], POSITIONy1[4])
        self.animation_frames = 12
        self.current_frame = 0
        self.previous_positiony = self.rect.y
        self.previous_positionx = self.rect.x

    def update(self):
        global MOUSEPRESSED
        if (MOUSEPRESSED == 1):
            self.rect = self.image.get_rect()
            self.rect.y = POSITIONy1[get_square_under_mousey()] - 25
            self.rect.x = POSITIONx1[get_square_under_mousex()] - 25
        if (MOUSEPRESSED == 2):
            if collide(plant, bought2):
                self.rect.y = self.previous_positiony
                self.rect.x = self.previous_positionx
            else:
                self.rect = self.image.get_rect()
                self.rect.y = POSITIONy1[get_square_under_mousey()] + 35#pulled x and y pos from func
                self.rect.x = POSITIONx1[get_square_under_mousex()] - 25
                self.previous_positiony = self.rect.y
                self.previous_positionx = self.rect.x
            MOUSEPRESSED = 0
我使用这个类在屏幕上创建一个精灵,然后使用def update()来控制精灵。精灵的控制方式是,当用户单击精灵时,他们可以用鼠标拖动它,并在屏幕上移动它。问题是,如果我使用这个类创建第二个精灵,并且在屏幕上同时显示两个精灵,当用户“拾取”一个精灵时,它们都会移动到鼠标位置。我只想做一个动作,这取决于点击的是哪一个

我假设他们都在移动到相同的位置,因为他们都使用相同的def update()来决定他们的移动,所以我的问题是,在pygame或python中是否存在这样的情况,即在不创建第二个位置的情况下,让被单击的一个移动,而不是两个移动
class animatedsprite(pygame.sprite.sprite):
。我希望同时在屏幕上显示多个精灵,但不希望创建几十个单独的类和update()def来分别控制每个精灵

抱歉,如果这没有意义,我是python和pygame的初学者。

对于精灵管理,a将帮助您

因此,在安装过程中,请执行以下操作:

all_sprites = pygame.sprite.Group()
# create five initial sprites
for number in range(5):
    new_sprite = animatedSprites(f"Sprite {number}")
    all_sprites.add(new_sprite)
然后在事件处理过程中:

for event in pygame.event.get():
    if event.type == pygame.QUIT:
        # set termination condition here
        …
    elif event.type == pygame.MOUSEBUTTONDOWN:
        # use the click position in the name
        new_sprite = animatedSprites(f"Sprite X: {event.pos[0]} Y: {event.pos[1]}")
        all_sprites.add(new_sprite)
处理事件后:

# update game state
all_sprites.update()
# draw background
…
# draw sprites
all_sprites.draw()
# update display
pygame.display.update()


            

我建议创建一个类
DragOperator
,它可以拖动对象:

类DragOperator:
定义初始化(自我,精灵):
self.sprite=精灵
self.draging=False
self.rel_pos=(0,0)
def更新(自身、事件列表):
对于事件列表中的事件:
如果event.type==pygame.MOUSEBUTTONDOWN:
self.dragging=self.sprite.rect.collidepoint(event.pos)
self.rel_pos=event.pos[0]-self.sprite.rect.x,event.pos[1]-self.sprite.rect.y
如果event.type==pygame.MOUSEBUTTONUP:
self.draging=False
如果event.type==pygame.MOUSEMOTION和self.drawing:
self.sprite.rect.topleft=event.pos[0]-self.rel_pos[0],event.pos[1]-self.rel_pos[1]
矩形的拖动在更新方法中实现。在对象中使用此类。将事件列表传递给精灵的
update
方法,并将其委托给拖动操作符:

类动画精灵(pygame.sprite.sprite):
def uuu init uuu(self,spriteName):
# [...]
self.drag=DragOperator(self)
def更新(自身、事件列表):
self.drag.update(事件列表)
将事件列表从主应用程序循环传递到:

all_sprites=pygame.sprite.Group()
添加(动画精灵(“我的精灵”))
运行=真
运行时:
event_list=pygame.event.get()
对于事件列表中的事件:
如果event.type==pygame.QUIT:
运行=错误
所有精灵更新(事件列表)
# [...]

例如:

导入pygame
类DragOperator:
定义初始化(自我,精灵):
self.sprite=精灵
self.draging=False
self.rel_pos=(0,0)
def更新(自身、事件列表):
对于事件列表中的事件:
如果event.type==pygame.MOUSEBUTTONDOWN:
self.dragging=self.sprite.rect.collidepoint(event.pos)
self.rel_pos=event.pos[0]-self.sprite.rect.x,event.pos[1]-self.sprite.rect.y
如果event.type==pygame.MOUSEBUTTONUP:
self.draging=False
如果event.type==pygame.MOUSEMOTION和self.drawing:
self.sprite.rect.topleft=event.pos[0]-self.rel_pos[0],event.pos[1]-self.rel_pos[1]
类SpriteObject(pygame.sprite.sprite):
定义初始值(自、x、y、颜色):
super()。\uuuu init\uuuuu()
self.original_image=pygame.Surface((50,50),pygame.SRCALPHA)
pygame.draw.circle(self.original_图像,颜色,(25,25,25)
self.drag_image=pygame.Surface((50,50),pygame.SRCALPHA)
pygame.draw.circle(self.drag_图像,颜色,(25,25,25)
pygame.draw.circle(self.drag_图像,(255,255,255),(25,25,25,4)
self.image=self.original\u图像
self.rect=self.image.get_rect(中心=(x,y))
self.drag=DragOperator(self)
def更新(自身、事件列表):
self.drag.update(事件列表)
self.image=如果self.drag.dragging else self.original\u图像,则self.drag\u图像
pygame.init()
window=pygame.display.set_模式((300300))
clock=pygame.time.clock()
sprite_object=SpriteObject(*window.get_rect().center,(255,255,0))
group=pygame.sprite.group([
SpriteObject(window.get\u width()//3,window.get\u height()//3,(255,0,0)),
SpriteObject(window.get\u width()*2//3,window.get\u height()//3,(0,255,0)),
SpriteObject(window.get\u width()//3,window.get\u height()*2//3,(0,0,255)),
SpriteObject(window.get_width()*2//3,window.get_height()*2//3,(255,255,0)),
])
运行=真
运行时:
时钟滴答(60)
event_list=pygame.event.get()
对于事件列表中的事件:
如果event.type==pygame.QUIT:
运行=错误
组更新(事件列表)
窗口填充(0)
组图(窗口)
pygame.display.flip()
pygame.quit()
退出()

为什么要为每个可能出现的精灵创建一个单独的精灵类?因为我不知道其他任何方法来创建多个精灵,我可以在一个类中以不同的方式移动,因为它们都使用相同的update()函数。您是否混淆了对象定义和实例化?也许这个问题的答案会有帮助。每个问题的逻辑是否不同?听起来它们都是以相同的方式控制的。它们都是以相同的方式控制的,但我当前的设置是同时控制它们,但我希望一次只控制一个。