我试图在键盘上旋转一次桨,但是目前,我的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)
与我的玩家类别类别:
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
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)
我相信这与您的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 Transform函数)为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.dir
更新self.angle
,直到您再次按事件键为止,它将保持315。
因此,如果您不希望这种情况不断发生,请不要在更新功能中进行更新。
最后,如果您继续按下右键,那么您实际上不会向右转,因为您的角度始终是积极的。pygame需要对相反旋转的负角度。
那么如何修复此操作?
不要更新
update()
功能中的旋转以停止常量旋转在您想要的方向上,将当前角度偏移到常数值(例如10或30度)。不要使用
self.dir
,在角度上更改符号,然后找出旋转到pygame.transform.rotate的正角或负角度。
,例如,如果要旋转它的计数时钟明智,只需使用正常的正角值,添加要使用的角度的值,请添加360,如果其为负,则添加%360,例如
之前如果您想明智地旋转时钟,请从 self.angle
中减去常数值,然后减去360,如果是正值,则%-360
问题可能是因为在update()
中您有
self.angle = (self.angle + self.dir) % 360
和update()
在每个循环中执行。
您应该仅在turnLeft
和turnRight
中更改角度,而不是update()
btw:您不需要self.dir
和self.angle
,因为两者都这样做。
您宁愿
在turnLeft()
" MINUS 45"
self.angle = (self.angle - 45) % 360
在turnRight()
" Plus 45"
self.angle = (self.angle + 45) % 360
正如我在turnLeft
和turnRigth
中评论中所写的那样,您只能更改角度,最终致电update()
。
但似乎GameScene.Update()
自动调用update()
,因此您可能无需在turnLeft
和turnRigth
中调用update()
。