在pygame中旋转图像,使其看起来像旋转一样

时间:2018-03-27 11:33:42

标签: python python-3.x rotation pygame

我正在创造一个玩家攻击旋转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()

2 个答案:

答案 0 :(得分:1)

如果按空格键,我会将self.stab变量设置为True,然后增加角度(self.rotate),旋转图像并获得每个帧的新矩形,以及超过360度时,重置self.stabself.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)

答案 1 :(得分:0)

由于您的简短示例,我不能给出一个正确的解决方案。但我有一些想法。

我的第一个想法是你可能已经将self.image加载到一个循环中,我怀疑你这样做了。如果你想,只需将图片加载到你班级的__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,而是保留原始图像然后创建旋转图像在另一个变量中。