【问题标题】:How to i make an sprite rotate smoothly如何使精灵平滑旋转
【发布时间】:2021-04-22 19:52:02
【问题描述】:

我需要帮助我的精灵平滑旋转。

现在我必须多次按下按钮来旋转精灵。 当我旋转精灵时,它也会以一种奇怪的方式扭曲精灵。

如果你进入主循环,你可以看到我现在是如何尝试在我的代码中实现旋转的。 我是编程新手,所以如果有人可以 ELI5,我将不胜感激。

import pygame as pg
    import sys
    x, y = 0, 0
    class Rocket(pg.sprite.Sprite):
        def __init__(self, picture_path, x, y):
            super().__init__()
            self.image = pg.image.load(picture_path)
            self.image = pg.transform.scale(self.image, (120, 100))
            self.angle_change = 0
            self.angle = 90 + self.angle_change
            self.image = pg.transform.rotate(self.image, self.angle)
            self.rect = self.image.get_rect()
            self.rect.x = 900
            self.rect.y = 400
            self.pressed_w = False
            self.pressed_a = False
            self.pressed_s = False
            self.pressed_d = False
            self.speed = 3
            self.gravity = False
        def update(self):
            if self.pressed_a:
                self.rect.x -= self.speed
            if self.pressed_d:
                self.rect.x += self.speed
            if self.pressed_w:
                self.rect.y -= self.speed
            if self.pressed_s:
                self.angle_change += 3
            if self.gravity:
                self.rect.y += self.speed
            if self.rect.left < 0: self.rect.left = 0
            if self.rect.right > width: self.rect.right = width
            if self.rect.top < 0: self.rect.top = 0
            if self.rect.bottom > height: self.rect.bottom = height
    class Rocket1(pg.sprite.Sprite):
        def __init__(self, picture_path, x, y):
            super().__init__()
            self.image = pg.image.load(picture_path)
            self.image = pg.transform.scale(self.image, (120, 100))
            self.rotate = 90
            self.image = pg.transform.rotate(self.image, self.rotate)
            self.rect = self.image.get_rect()
            self.rect.x = 900
            self.rect.y = 400
            self.pressed_up = False
            self.pressed_left = False
            self.pressed_down = False
            self.pressed_right = False
            self.speed = 3
            self.gravity = False
        def update(self):
            if self.pressed_left:
                self.rect.x -= self.speed
            if self.pressed_right:
                self.rect.x += self.speed
            if self.pressed_up:
                self.rect.y -= self.speed
            if self.pressed_down:
                self.rect.y += self.speed
            if self.gravity:
                self.rect.y += self.speed
            if self.rect.left < 0: self.rect.left = 0
            if self.rect.right > width: self.rect.right = width
            if self.rect.top < 0: self.rect.top = 0
            if self.rect.bottom > height: self.rect.bottom = height
    pg.init()
    clock = pg.time.Clock()
    width = 1920
    height = 1080
    screen = pg.display.set_mode((width, height))
    background = pg.image.load("bg.jpg")
    #rocket
    player_rect = Rocket("rocket.png", x, y)
    player_rect1 = Rocket1("rocketflames.png", x, y)
    rocket_group = pg.sprite.Group()
    rocket_group.add(player_rect,player_rect1)
    while True:
        rocket_rotate = 0
        for event in pg.event.get():
            if event.type == pg.QUIT:
                pg.quit()
                sys.exit()
            if event.type == pg.KEYDOWN:
                if event.key == pg.K_w:
                    player_rect.pressed_w = True
                    player_rect.gravity = False
            if event.type == pg.KEYDOWN:
                if event.key == pg.K_s:
                    rocket_rotate += 1
                    for rocket in rocket_group:
                        rocket.image = pg.transform.rotate(rocket.image, rocket_rotate)
            if event.type == pg.KEYDOWN:
                if event.key == pg.K_d:
                    player_rect.pressed_d = True
            if event.type == pg.KEYDOWN:
                if event.key == pg.K_a:
                    player_rect.pressed_a = True
            if event.type == pg.KEYUP:
                if event.key == pg.K_w:
                    player_rect.pressed_w = False
                    player_rect.gravity = True
            if event.type == pg.KEYUP:
                if event.key == pg.K_s:
                    rocket_rotate += 0
                    for rocket in rocket_group:
                        rocket.image = pg.transform.rotate(rocket.image, rocket_rotate)
            if event.type == pg.KEYUP:
                if event.key == pg.K_d:
                    player_rect.pressed_d = False
                    player_rect.gravity = True
            if event.type == pg.KEYUP:
                if event.key == pg.K_a:
                    player_rect.pressed_a = False
                    player_rect.gravity = True
            ###
            if event.type == pg.KEYDOWN:
                if event.key == pg.K_UP:
                    player_rect1.pressed_up = True
                    player_rect1.gravity = False
            if event.type == pg.KEYDOWN:
                if event.key == pg.K_DOWN:
                    player_rect1.pressed_down = True
            if event.type == pg.KEYDOWN:
                if event.key == pg.K_RIGHT:
                    player_rect1.pressed_right = True
            if event.type == pg.KEYDOWN:
                if event.key == pg.K_LEFT:
                    player_rect1.pressed_left = True
            if event.type == pg.KEYUP:
                if event.key == pg.K_UP:
                    player_rect1.pressed_up = False
                    player_rect1.gravity = True
            if event.type == pg.KEYUP:
                if event.key == pg.K_DOWN:
                    player_rect1.pressed_down = False
                    player_rect1.gravity = True
            if event.type == pg.KEYUP:
                if event.key == pg.K_RIGHT:
                    player_rect1.pressed_right = False
                    player_rect1.gravity = True
            if event.type == pg.KEYUP:
                if event.key == pg.K_LEFT:
                    player_rect1.pressed_left = False
                    player_rect1.gravity = True
        pg.display.flip()
        screen.blit(background, (0, 0))
        rocket_group.draw(screen)
        rocket_group.update()
        clock.tick(120)

【问题讨论】:

  • 如果 event.type == pg.key.get_pressed()[pg.K_s]:rocket_rotate += 1 火箭组中的火箭:rocket.image = pg.transform.rotate(rocket.image, Rocket_rotate) 尝试过这样,但现在精灵根本不会旋转

标签: python pygame sprite


【解决方案1】:

您必须使用pygame.key.get_pressed() 而不是键盘事件。

键盘事件(请参阅pygame.event 模块)仅在按键状态更改时发生一次。每次按下某个键时,KEYDOWN 事件就会发生一次。每次释放键时,KEYUP 出现一次。将键盘事件用于单个操作或逐步移动。

pygame.key.get_pressed() 返回一个包含每个键状态的列表。如果按住某个键,则该键的状态为True,否则为False。使用pygame.key.get_pressed() 评估按钮的当前状态并获得连续移动。

另外我推荐阅读How do I rotate an image around its center using PyGame?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-23
    相关资源
    最近更新 更多