Python PlayerPaddle-won';不要停止旋转
我试着按一次键旋转我的桨,但现在,我的左转弯()无法停止旋转我的桨,而右转弯()甚至无法启动 这就是我在游戏场景中所说的Python PlayerPaddle-won';不要停止旋转,python,pygame,Python,Pygame,我试着按一次键旋转我的桨,但现在,我的左转弯()无法停止旋转我的桨,而右转弯()甚至无法启动 这就是我在游戏场景中所说的 class GameScreen(SceneBase): def __init__(self): SceneBase.__init__(self) self.player_paddle = classes.PlayerPaddle(screen_size) self.my_font = pygame.font.Sys
class GameScreen(SceneBase):
def __init__(self):
SceneBase.__init__(self)
self.player_paddle = classes.PlayerPaddle(screen_size)
self.my_font = pygame.font.SysFont("Arial", 50)
def ProcessInput(self, events, pressed_keys):
for event in events:
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP:
self.player_paddle.direction = -1
elif event.key == pygame.K_DOWN:
self.player_paddle.direction = 1
elif event.key == pygame.K_LEFT:
self.player_paddle.turnLeft()
elif event.key == pygame.K_RIGHT:
self.player_paddle.turnRight()
if event.type == pygame.KEYUP:
if event.key == pygame.K_UP and self.player_paddle.direction == -1:
self.player_paddle.direction = 0
elif event.key == pygame.K_DOWN and self.player_paddle.direction == 1:
self.player_paddle.direction = 0
def Update(self):
self.player_paddle.update()
这是我的image类,PlayerPaddle从中继承
class Image(pygame.sprite.Sprite):
def __init__(self, screen_size, color=(255,0,0)):
super().__init__()
self.screen_size = screen_size
self.angle = 0
#self.dir = 0
self.original_image = pygame.image.load('naruto.png').convert()
self.colorkey = self.original_image.get_at((0,0))
self.original_image = pygame.transform.scale(self.original_image, (20, 100))
self.rect = self.original_image.get_rect()
self.update()
def turnLeft(self):
self.angle = (self.angle - 45) % 360
def turnRight(self):
print("entered")
self.angle = (self.angle + 30) % 360
def update(self):
self.image = pygame.transform.rotate(self.original_image, self.angle).convert()
self.image.set_colorkey(self.colorkey)
#self.rect = self.image.get_rect(center = screen_rect.center)
self.rect = self.image.get_rect()
self.mask = pygame.mask.from_surface(self.image)
self.olist = self.mask.outline()
if self.olist:
pygame.draw.lines(self.image, (0, 0, 0), 3, self.olist)
def draw(self, screen):
screen.blit(self.original_image, self.rect)
连同我的PlayerPaddle类:
class PlayerPaddle(Image):
def __init__(self, screen_size, color = (255,0,0)):
self.centerx = 10
self.centery = screen_size[1] // 2
self.height = 100
self.width = 20
self.speed = 3
self.direction = 0
super().__init__(screen_size, color = (255, 0, 0))
def update(self):
super().update()
self.centery += self.direction*self.speed
self.rect.center = (self.centerx, self.centery)
if self.rect.top < 0:
self.rect.top = 0
if self.rect.bottom > self.screen_size[1]-1:
self.rect.bottom = self.screen_size[1]-1
我相信这与您的
self.dir
变量有关。我希望一个转向函数只为它调用的每个迭代应用一个转向,而不是在调用之后更新转向值本身。让我们想想这个。您有三个函数可以转换角色。两个仅在按left或right时调用,另一个称为everysingle iteration,character.update()
因此,如果按“左”或“右”,假设您的旋转功能正确地应用了旋转(它们没有),您将得到一个连续的旋转:
def update(self):
self.angle = (self.angle + self.dir) % 360
self.image = pygame.transform.rotate(self.original_image, self.angle).convert()
现在的问题是,当你第一次调用任意一个旋转操作时,你根本不会旋转。在每个函数中,您将角度
(实际上是您的实际旋转角度,它传递到pygame变换函数中)设置为0,然后使用(self.angle+self.dir)%360更新它,并且由于self.dir也从零开始,因此您仍然保留零
所以在开始的时候,第一次轮换的时候,你实际上什么都不会轮换。然后你做一些奇怪的事
self.dir -= 45
if self.dir < 0:
self.dir = 315
self.dir-=45
如果self.dir<0:
self.dir=315
因此,在左转的下一个事件中,您从self.dir=315
开始,(0+315)%360=315
,因此您只需将整个图像旋转315度。哦,现在你也将在更新函数中不断地将图像旋转315度,因为它总是被调用,并且你每次都用+self.dir
更新self.angle
,直到你再次按下事件键为止,它将保持315度
因此,如果您不希望这种情况持续发生,请不要在update函数中更新它
最后,如果你继续按右边的按钮,你就不会真正右转,因为你的车坏了。pygame需要反向旋转的负角度
那么你如何解决这个问题呢
不要在update()
函数中更新旋转以停止恒定旋转
按所需方向将当前角度偏移常量值(如10或30度)。不要使用self.dir
,更改角度上的符号,并为pygame.transform.rotate计算出要旋转的正角度或负角度
例如,如果要逆时针旋转,只需使用正常的正角度值,添加要使用的角度值,如果是负角度,则添加360,然后像前面一样执行%360
如果你想按时钟旋转,从你的自我角度中减去你的常量值,如果它是正的,那么减去360,-360问题可能是因为在update()
中你有
self.angle = (self.angle + self.dir) % 360
并且在每个循环中执行update()
只能在左转
和右转
中更改角度,而不能在更新()中更改角度
顺便说一句:您不需要self.dir
和self.angle
,因为两者的作用相同
你需要
在左转()
“减45”
在右转()
“加45”
正如我在turnLeft
和turnRigth
中的评论中所写,您应该只更改角度,并最终调用update()
但是它似乎自动调用了gamesene.Update()
所以您可能不需要调用Update())
在turnlight
和turnRigth
顺便说一句:我认为你应该只使用self.dir
或只使用self.angle
-你不需要两者都旋转它,因为你可以在很多地方使用print()
来查看变量中的值以及执行了哪部分代码-这有助于发现问题(而且你不必学习如何使用Debugger)你在turnLeft
、turnRight
和update()
中有几乎相同的代码。请参阅-不要重复你自己。你应该在turnLeft
、turnRight
中更改self.angle
,然后调用update()
。甚至你也可以不调用update()
来更改角度,因为GameScreen.update()
将自动执行。我对代码进行了旋转更改,并删除了update()中的多余调用.然而,现在我的划桨从屏幕上飞走了,这很奇怪,因为我已经对边界设置了限制。我想这可能与我的自我有关。尽管有些不同,但我还是想从左转,和右转中删除重复的代码,并将其仅保留在更新()
在update()
中需要此代码。在左转
和右转
中,您应该只更改自身角度
而不旋转图像。我没有显示class场景库
,但我认为游戏场景.update()
应该执行更新()
需要时。我再次重复:如果有问题,请使用print()
查看变量中的内容以及执行的代码部分-这有助于解决问题,您无需询问其他人。旋转似乎不起作用。它没有偏离中心轴旋转。相反,拨片只是左右移动。我还添加了SceneBase类。此外,我一直在使用打印语句,但ey没有帮我调试。谢谢你的帮助!你必须使用print()
来显示变量中的值,然后才能查看它们是否正确。使用print()
来查看它是否以正确的顺序执行函数,以及它是否执行
self.angle = (self.angle + self.dir) % 360
self.angle = (self.angle - 45) % 360
self.angle = (self.angle + 45) % 360