以 pygame 旋转图像,使其看起来像在旋转
Rotating an image in pygame so that it looks like its spinning
我正在创建一个玩家攻击是 360 度旋转的游戏。我已经做到了,所以它确实做到了,但是我遇到的问题是每次旋转时它都会回到原始图像。关于如何获得它以使图像不断旋转的任何想法
这是我的轮换代码片段:
self.rotate += 10
self.image_type = self.image
self.image = pygame.transform.rotate(self.image_type, self.rotate)
更新
这是我的大部分代码。我的程序分为两部分;主循环和 类 程序
我的代码 类:
import pygame
from pygame import *
import random
import time
import math as maths
pygame.init()
class character(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image1 = pygame.image.load("Knight_front.png").convert_alpha()
self.image_type = self.image1
self.image = self.image1
self.rect = self.image.get_rect()
self.rect.x, self.rect.y = 300,215
self.st = 0
self.dir = 0
self.stab = False
self.rotate = 0
def update(self,keypress):
self.prevx,self.prevy = self.rect.x,self.rect.y
if keypress[K_w]:
self.image = self.image_type
self.rect.y -= 3
self.dir = 0
if keypress[K_s]:
self.image = pygame.transform.rotate(self.image_type, 180)
self.rect.y += 3
self.dir = 180
if keypress[K_a]:
self.image = pygame.transform.rotate(self.image_type, 90)
self.rect.x -= 3
self.dir = 90
if keypress[K_d]:
self.image = pygame.transform.rotate(self.image_type, -90)
self.rect.x += 3
self.dir = -90
if keypress[K_SPACE] and self.stab == False and time.time()>self.st+0.5:
self.rotate += 10
self.image_type = self.image
self.image = pygame.transform.rotate(self.image_type, self.rotate)
self.st = time.time()
self.stab = True
if time.time() > self.st + 0.25 and self.stab == True:
self.image_type = self.image1
self.image = pygame.transform.rotate(self.image_type, self.dir)
self.stab = False
if self.rotate == 360:
self.rotate = 0
我的主循环代码:
import pygame
from pygame import *
width, height = 640, 480
screen = pygame.display.set_mode((width,height))#,FULLSCREEN)
from classes import *
import random
spriteList = pygame.sprite.Group()
player = character()
spriteList.add(player)
Clock = pygame.time.Clock()
while True:
keypress = pygame.key.get_pressed()
screen.fill((255,255,255))
spriteList.draw(screen)
player.update(keypress)
pygame.event.pump()
Clock.tick(30)
pygame.display.update()
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
quit()
if keypress[K_ESCAPE]:
pygame.quit()
由于您的示例太短,我无法给出一个正确的解决方案。不过我有一些想法。
我的第一个想法是您可能在循环中加载了 self.image
,我怀疑您是否这样做了。如果你 ddd,只需将图像的加载移动到 class 的 __init__()
函数。
我的第二个想法是在循环中将 self.rotate
变量定义或分配给 0,使其无法旋转。
但是,如果您要在循环之外加载图像,我可以提供的不多。我相信你给出的代码是正确的,但我可以给你另一种方法。
class Thing:
def __init__(self, location, image, rotate=0):
self.image = image # has to be alreedy loaded and converted
self.rotate = rotate # in case the instance wants a certain rotation when first drawn.
self.loc = ocation
self.rotated_image = pygame.transform.rotate(self.image, self.rotate)
def spin_and_draw(self):
rotate += 10
self.rotated_image = pygame.tranform.rotate(self.image, self.rotate)
screen.blit(self.rotated_image, (self.loc[0], self.loc[1]))
我所做的不是将 self.image_type
分配给图像并旋转 self.image_type
然后将旋转的结果提供给 self.image
,而是保留原始图像然后创建旋转图像它在另一个变量中。
如果按下空格键,我会将 self.stab
变量设置为 True
,然后增加角度 (self.rotate
),旋转图像并在每一帧获得一个新的矩形, 当超过 360 度时,重置 self.stab
和 self.rotate
变量。
if keypress[K_SPACE]:
self.stab = True
if self.stab:
self.rotate += 10
if self.rotate >= 360:
self.rotate = 0
self.stab = False
# Rotate the image and get a new rect with the old center.
self.image = pygame.transform.rotate(self.image_type, self.rotate)
self.rect = self.image.get_rect(center=self.rect.center)
我正在创建一个玩家攻击是 360 度旋转的游戏。我已经做到了,所以它确实做到了,但是我遇到的问题是每次旋转时它都会回到原始图像。关于如何获得它以使图像不断旋转的任何想法
这是我的轮换代码片段:
self.rotate += 10
self.image_type = self.image
self.image = pygame.transform.rotate(self.image_type, self.rotate)
更新
这是我的大部分代码。我的程序分为两部分;主循环和 类 程序
我的代码 类:
import pygame
from pygame import *
import random
import time
import math as maths
pygame.init()
class character(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image1 = pygame.image.load("Knight_front.png").convert_alpha()
self.image_type = self.image1
self.image = self.image1
self.rect = self.image.get_rect()
self.rect.x, self.rect.y = 300,215
self.st = 0
self.dir = 0
self.stab = False
self.rotate = 0
def update(self,keypress):
self.prevx,self.prevy = self.rect.x,self.rect.y
if keypress[K_w]:
self.image = self.image_type
self.rect.y -= 3
self.dir = 0
if keypress[K_s]:
self.image = pygame.transform.rotate(self.image_type, 180)
self.rect.y += 3
self.dir = 180
if keypress[K_a]:
self.image = pygame.transform.rotate(self.image_type, 90)
self.rect.x -= 3
self.dir = 90
if keypress[K_d]:
self.image = pygame.transform.rotate(self.image_type, -90)
self.rect.x += 3
self.dir = -90
if keypress[K_SPACE] and self.stab == False and time.time()>self.st+0.5:
self.rotate += 10
self.image_type = self.image
self.image = pygame.transform.rotate(self.image_type, self.rotate)
self.st = time.time()
self.stab = True
if time.time() > self.st + 0.25 and self.stab == True:
self.image_type = self.image1
self.image = pygame.transform.rotate(self.image_type, self.dir)
self.stab = False
if self.rotate == 360:
self.rotate = 0
我的主循环代码:
import pygame
from pygame import *
width, height = 640, 480
screen = pygame.display.set_mode((width,height))#,FULLSCREEN)
from classes import *
import random
spriteList = pygame.sprite.Group()
player = character()
spriteList.add(player)
Clock = pygame.time.Clock()
while True:
keypress = pygame.key.get_pressed()
screen.fill((255,255,255))
spriteList.draw(screen)
player.update(keypress)
pygame.event.pump()
Clock.tick(30)
pygame.display.update()
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
quit()
if keypress[K_ESCAPE]:
pygame.quit()
由于您的示例太短,我无法给出一个正确的解决方案。不过我有一些想法。
我的第一个想法是您可能在循环中加载了 self.image
,我怀疑您是否这样做了。如果你 ddd,只需将图像的加载移动到 class 的 __init__()
函数。
我的第二个想法是在循环中将 self.rotate
变量定义或分配给 0,使其无法旋转。
但是,如果您要在循环之外加载图像,我可以提供的不多。我相信你给出的代码是正确的,但我可以给你另一种方法。
class Thing:
def __init__(self, location, image, rotate=0):
self.image = image # has to be alreedy loaded and converted
self.rotate = rotate # in case the instance wants a certain rotation when first drawn.
self.loc = ocation
self.rotated_image = pygame.transform.rotate(self.image, self.rotate)
def spin_and_draw(self):
rotate += 10
self.rotated_image = pygame.tranform.rotate(self.image, self.rotate)
screen.blit(self.rotated_image, (self.loc[0], self.loc[1]))
我所做的不是将 self.image_type
分配给图像并旋转 self.image_type
然后将旋转的结果提供给 self.image
,而是保留原始图像然后创建旋转图像它在另一个变量中。
如果按下空格键,我会将 self.stab
变量设置为 True
,然后增加角度 (self.rotate
),旋转图像并在每一帧获得一个新的矩形, 当超过 360 度时,重置 self.stab
和 self.rotate
变量。
if keypress[K_SPACE]:
self.stab = True
if self.stab:
self.rotate += 10
if self.rotate >= 360:
self.rotate = 0
self.stab = False
# Rotate the image and get a new rect with the old center.
self.image = pygame.transform.rotate(self.image_type, self.rotate)
self.rect = self.image.get_rect(center=self.rect.center)