如何在 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__()
不需要任何参数
if
和 while
循环不需要括号
- 你不需要导入 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
下面我所做的只是简单地创建了一个精灵,如图所示.. 进一步做一些有趣的事情,想到线程我添加了一个线程来检查光标位置,因此更新全局 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__()
不需要任何参数if
和while
循环不需要括号- 你不需要导入 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