我试图在按键时旋转我的球拍一次,但此刻,我的turnLeft()不会停止旋转我的球拍,而我的turnRight()甚至不会开始。
这是我在GameScene中调用它的地方。
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()
这是我的图像类,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
我在另一个文件中测试了我的旋转代码并且它工作得很好(一次按键是一次旋转)所以我现在迷惑为什么现在正在发生这种情况。
编辑:SceneBase类
class SceneBase:
number_of_players = None
is_game_over = False
third_player_mode = None
def __init__(self):
self.next = self
def ProcessInput(self, events, pressed_keys):
pass
def Update(self):
pass
def Render(self, screen):
pass
def SwitchToScene(self, next_scene):
self.next = next_scene
def Terminate(self):
self.SwitchToScene(None)
答案 0 :(得分:0)
我认为这与您的self.dir
变量有关。我希望转向函数只需对其调用的每次迭代应用一个转弯,而不是在病房后更新转弯值。让我们考虑一下。你有三个函数可以转换角色。两个只在你按左或右时调用,一个叫做 everysingle迭代, character.update()
。
因此,如果您向左或向右按下,假设您的转弯功能正确应用旋转(它们没有),您将只是连续旋转:
def update(self):
self.angle = (self.angle + self.dir) % 360
self.image = pygame.transform.rotate(self.original_image, self.angle).convert()
现在的问题是,当你第一次调用转弯操作时,根本不会旋转。在每个函数中,您将angle
(实际上是您的实际旋转角度,传递给pygame转换函数的内容)设置为0,然后使用(self.angle + self.dir) % 360
更新它,因为self.dir也会启动在零,你再次留下零...
所以在开始时,你的转弯事件的第一个实例,你实际上不会转动任何东西。那你做点奇怪......
self.dir -= 45
if self.dir < 0:
self.dir = 315
所以,你开始使用self.dir = 315
在下一个事件左转(0 + 315) % 360 = 315
,所以你只需将整个图像旋转315度。哦,现在你也将在你的更新功能中不断旋转你的图像315度,因为它总是被调用,你每次都用+ self.angle
更新self.dir
,直到你为止再次按事件键。
因此,如果您不希望这种情况不断发生,请不要在更新功能中更新它。
最后,如果你继续按下右键,那么你实际上不会因为angles are always positive而向右转。 pygame需要相反旋转的负角度。
那你怎么解决这个问题?
不要更新update()
功能中的旋转以停止恒定旋转
在您想要的方向上将当前角度偏移常数值(如10或30度)。不要使用self.dir
,更改角度上的符号,并找出要旋转到pygame.transform.rotate的正角或负角。
例如,如果你想逆时针旋转它,只需使用正常的正角度值,添加你想要使用的角度的值,如果它是负的则添加360,并像之前一样做%360
如果您想要按时钟方式旋转,请从self.angle
中减去常数值,然后减去360(如果其正数)和%-360
答案 1 :(得分:0)
问题可能是因为update()
你有
self.angle = (self.angle + self.dir) % 360
和update()
在每个循环中执行。
您应该只在turnLeft
和turnRight
更改角度,而不是update()
BTW:您不需要self.dir
和self.angle
,因为两者都是相同的。
你宁愿需要
在turnLeft()
“减去45”
self.angle = (self.angle - 45) % 360
在turnRight()
“加上45”
self.angle = (self.angle + 45) % 360
正如我在turnLeft
和turnRigth
的评论中写的那样,你应该只改变角度并最终调用update()
。
但似乎GameScene.Update()
会自动调用update()
,因此您可能无需在update()
和turnLeft
中调用turnRigth
。