如何在 pygame 中通过光标移动来移动 Sprite 图像?

How to move Sprite image with cursor movement in pygame?

下面我所做的只是简单地创建了一个精灵,如图所示.. 进一步做一些有趣的事情,想到线程我添加了一个线程来检查光标位置,因此更新全局 x 和 y 导致由 display.update 触发的精灵位置变化 我是新手,所以我可能在很多方面都错了……所以请容忍我…… 非常感谢

    from pygame import *
    from main import *
    import threading
    import sys
    #lets add our sprites

    (x,y) = (0, 0)

    class threading1(threading.Thread):


        def run(self):
            global x,y
            clockobj1 = pygame.time.Clock()
            while (True):

                clockobj1.tick(6)
                (x,y)=pygame.mouse.get_pos()
                display.update()


    class sprites(pygame.sprite.Sprite ):

        def __init__(self,color= redd, width=120, height=120):
            super(sprites,self).__init__()
            self.image = pygame.Surface((width,height))
            self.image.fill(color)

            self.rect=self.image.get_rect()
            self.rect.move_ip(x,y)
            display.update()



    if __name__ == '__main__':
        clockobj = pygame.time.Clock()


        init()
        mainwin = pygame.display.set_mode((720,640))

        sprite1 =  sprites()


        spritegrp =  pygame.sprite.Group()
        spritegrp.add(sprite1)
        spritegrp.update()
        mainwin.fill(blue)
        spritegrp.draw(mainwin)
        threadingobj = threading1()
        threadingobj.start()


        x = True
        while(x):
            display.update()

            for evt in event.get() :
             if (evt.type == QUIT) :
                 quit()
                 x=False
             clockobj.tick(40)

***以下是我的最新代码------------根据答案更新***请检查

    import pygame
    from main import *
    import threading
    import sys

    #  lets add our sprites


    class Sprites(pygame.sprite.Sprite ):
        def __init__(self, color=redd, width=120, height=120):
            super().__init__()
            self.image = pygame.Surface((width, height))
            self.image.fill(color)
            self.rect = self.image.get_rect()

        def updaterect(self):
            print("i m in updatereact")
            print(pygame.mouse.get_pos())
            self.rect.center= pygame.mouse.get_pos()
            pygame.display.update()
    if __name__ == '__main__':
        clockobj = pygame.time.Clock()
        pygame.init()
        mainwin = pygame.display.set_mode((720,640))
        sprite1 = Sprites()
        sprite1.updaterect()
        spritegrp = pygame.sprite.Group()
        spritegrp.add(sprite1)
        spritegrp.update()
        mainwin.fill(blue)
        spritegrp.draw(mainwin)
        x = True
        while x:
            sprite1.updaterect()
            pygame.display.update()
            for evt in pygame.event.get() :
             if evt.type == pygame.QUIT :
                 quit()
                 x=False        

线程只会使事情复杂化。摆脱它,并从 __init__ 中取出 self.rect.move_ip(x,y)display.update() 以获得 class。在 class 中创建一个名为 update() 的函数。这个函数将通过说来移动矩形。 self.rect.center = pygame.mouse.get_pos()。然后在主游戏循环中,将 sprite1.update() 放在那里或使用组名称更新它(就像您对 spritegrp.update() 所做的那样),然后也在那里而不是在函数中调用 display.update() .

其他:

  • super().__init__() 不需要任何参数
  • ifwhile 循环不需要括号
  • 你不需要导入 main(我可能错了,但我不这么认为)
  • from module import * 通常是一种不好的做法,但如果你打算这样做(我不推荐),你不能把 module.method 放在任何地方。你做了 from pygame import *,但仍然放了 pygame.mouse 和其他类似的东西。也许你的意思是 from pygame.locals import * ?
  • 冒号和单词之间没有 space,即 for evt in event.get() : 是错误的
  • 缩进也应该是制表符的长度,或者四个 spaces。 (你在用什么IDE?大部分都是自动完成的。)
  • 变量赋值应该有 spaces: x = False