我试着按一次键来旋转我的桨,但是现在,我的turnlight()无法停止旋转我的桨,而turnRight()甚至无法启动。你知道吗
这就是我在游戏场景中所说的。你知道吗
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
我在另一个文件中测试了我的旋转代码,它运行得非常好(一次按键就是一次旋转),所以我现在很困惑为什么现在会发生这种情况。你知道吗
编辑:场景库类
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
变量有关。我希望一个turning函数只为它调用的每个迭代应用一个turn,而不是在wards之后更新turn值本身。让我们想想这个。你有三个可以改变角色的函数。两个仅在按left或right时调用,另一个称为everysingle iteration,character.update()
。你知道吗因此,如果按“左”或“右”键,假设您的旋转功能正确地应用了旋转(它们没有),您将得到一个连续的旋转:
现在的问题是,当你第一次调用任何一个转弯操作时,你根本不会旋转。在每个函数中,您将
angle
(这实际上是您的实际旋转角度,它传递到pygame变换函数中的值)设置为0,然后用(self.angle + self.dir) % 360
更新它自我目录同样从零开始,你又剩下零。。。你知道吗所以在开始的时候,第一次轮到你的时候,你不会真的轮到任何东西。然后你做一些奇怪的事。。。你知道吗
所以,你从
self.dir = 315
开始,在下一个事件中,左转,(0 + 315) % 360 = 315
,所以你把整个图像旋转了315度。哦,现在你也将在update函数中不断地将图像旋转315度,因为它总是被调用的,并且你每次都用+self.dir
更新self.angle
,直到你再次按下事件键,这个值保持315度。你知道吗因此,如果不希望这种情况经常发生,就不要在update函数中更新它。你知道吗
最后,如果你继续按右边的按钮,你实际上不会右转,因为你的angles are always positive。pygame需要反向旋转的负角度。你知道吗
那你怎么解决这个问题呢?你知道吗
不要在
update()
函数中更新旋转以停止恒定旋转按所需方向将当前角度偏移常量值(如10或30度)。不要使用
self.dir
,改变你角度上的符号,并找出旋转的正或负角度pygame.transform.rotate文件.例如,如果要逆时针旋转,只需使用正常的正角度值,添加要使用的角度值,如果是负角度,则添加360,然后像以前一样执行%360
如果要按时钟顺序旋转,请从
self.angle
中减去常量值,如果是正数,则减去360,-360问题可能是因为在
update()
中在每个循环中执行
update()
。你知道吗只能在
turnLeft
和turnRight
中更改角度,而不能在update()
中更改顺便说一句:你不需要
self.dir
和self.angle
,因为两者都是一样的。你知道吗你需要
在
turnLeft()
“减45”在
turnRight()
“加45”正如我在
turnLeft
和turnRigth
的评论中所写,您应该只改变角度,并最终调用update()
。你知道吗但似乎
GameScene.Update()
会自动调用update()
,所以您可能不需要在turnLeft
和turnRigth
中调用update()
。你知道吗相关问题 更多 >
编程相关推荐