繁体   English   中英

旋转方向与角度不一样

[英]Direction of the rotation not the same as the angle

直升机应该按角度1飞行。当按下一个键时,它应该按角度2飞行。它正在工作。 角度 1 = 0 时,直升机平行于 x 轴飞行。 直升机图像也显示了这一点。 角度 2 = 45 时,它沿对角线向下。 但是图片显示是斜向上的。 如何调和角度和图像旋转?

import pygame, sys
import random
import math

pygame.init()
clock = pygame.time.Clock()
screen = pygame.display.set_mode((1000,600))

class Helikopter(pygame.sprite.Sprite):       
    def __init__(self,x,y,speed,angle1,angle2):
        pygame.sprite.Sprite.__init__(self)   
        self.image = pygame.image.load("Bilder/heli1.png").convert_alpha()
        self.img = pygame.transform.scale(self.image,(160,60))       
        self.rect = self.img.get_rect() 
        self.rect.center=(x,y)
        self.rot1 = angle1
        self.rot2 = angle2
        self.angle1 = math.radians(angle1)         
        self.angle2 = math.radians(angle2)
        self.rot = self.rot1
        self.angle = self.angle1    
        self.speed = speed
        self.absturz = False       
     
    def update(self):      
        if self.rect.x > 1000 or self.rect.y > 600:
            self.rect.x = - 20
            self.rect.y = random.randrange(100,300)
            self.absturz = False 
            self.rot = self.rot1
            self.angle = self.angle1            
        if self.absturz == True: 
            self.angle = self.angle2 
            self.rot = self.rot2 - 45    
        else:
            self.absturz = False
        self.rect.center=calculate_new_xy(self.rect.center,self.speed,self.angle)   
        self.image = pygame.transform.rotate(self.img, self.rot) 
 
def calculate_new_xy(old_xy,speed,angle_in_radians):
    new_x = old_xy[0] + (speed*math.cos(angle_in_radians))
    new_y = old_xy[1] + (speed*math.sin(angle_in_radians))
    return new_x, new_y

heli = Helikopter(300,100,3,30,60)
alle_sprites = pygame.sprite.Group() 
heli_sprites = pygame.sprite.Group()
heli = Helikopter(300,100,3,0,90)
heli_sprites.add(heli)
alle_sprites.add(heli)

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        if event.type == pygame.KEYDOWN:
            heli.absturz = True
    screen.fill((250,250,250))  
    alle_sprites.update()
    alle_sprites.draw(screen)
    
    pygame.display.flip()
    clock.tick(60)

在 Pygame 坐标系中,y 轴指向屏幕下方,但数学 y 轴指向从底部到顶部。 为了补偿您必须在调用pygame.transform.rotate时反转旋转角度:

self.image = pygame.transform.rotate(self.img, self.rot)

self.image = pygame.transform.rotate(self.img, -self.rot) 

另请参阅如何使用 PyGame 围绕其中心旋转图像?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM