微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用鼠标 python 旋转图像

如何解决如何使用鼠标 python 旋转图像

所以我一直在努力使我的大炮图像可以旋转到我的鼠标所在的位置,但是我正在尝试的代码有问题。我的大炮不跟随我的鼠标,当我放置旋转代码时,我丢失了另一个精灵,我尝试了一个将在下面显示代码,但是我尝试的代码导致了我的问题。下面还有我的大炮和我的另一个精灵。

enter image description here

enter image description here

我的代码和我尝试过的

import pygame,math
pygame.init()

# Windowing screen width and height
width = 700
height = 500
window = pygame.display.set_mode((width,height))

# Name of window
pygame.display.set_caption("Game")

# A Part of cannon rotating

def blitRotate(surf,image,pos,originPos,angle):

    # calcaulate the axis aligned bounding Box of the rotated image
    w,h         = image.get_size()
    sin_a,cos_a = math.sin(math.radians(angle)),math.cos(math.radians(angle)) 
    min_x,min_y = min([0,sin_a*h,cos_a*w,sin_a*h + cos_a*w]),max([0,sin_a*w,-cos_a*h,sin_a*w - cos_a*h])

    # calculate the translation of the pivot 
    pivot        = pygame.math.Vector2(originPos[0],-originPos[1])
    pivot_rotate = pivot.rotate(angle)
    pivot_move   = pivot_rotate - pivot

    # calculate the upper left origin of the rotated image
    origin = (pos[0] - originPos[0] + min_x - pivot_move[0],pos[1] - originPos[1] - min_y + pivot_move[1])

    # get a rotated image
    rotated_image = pygame.transform.rotate(image,angle)

    # rotate and blit the image
    surf.blit(rotated_image,origin)
 
#####

# Player class
class Player:
    def __init__(self,x,y,width,height,color):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.color = color
        self.speed = 4
        self.cannon = pygame.image.load("img/cannon.png")
        self.cannon2 = pygame.image.load("img/cannon2.png")
        self.cannon = pygame.transform.scale(self.cannon,(self.cannon.get_width()//2,self.cannon.get_height()//2))
        self.cannon2 = pygame.transform.scale(self.cannon2,(self.cannon2.get_width()//2,self.cannon2.get_height()//2))
        self.rect = pygame.Rect(x,height)
        #Another part of cannon roting
        self.image = self.cannon
        self.rect  = self.image.get_rect(center = (self.x,self.y))
        self.look_at_pos = (self.x,self.y)

        self.isLookingAtPlayer = False
        self.look_at_pos = (x,y)

        
    def get_rect(self):
        self.rect.topleft = (self.x,self.y)
        return self.rect
    def draw(self):
        self.rect.topleft = (self.x,self.y)
        pygame.draw.rect(window,self.color,self.rect)


        player_rect = self.cannon.get_rect(center = self.get_rect().center)
        player_rect.centerx -= 0.4
        player_rect.centery += 0
        window.blit(self.cannon,player_rect)

        player_rect = self.cannon2.get_rect(center = self.get_rect().center)
        player_rect.centerx -= 0.7
        player_rect.centery += 30
        window.blit(self.cannon2,player_rect)

        # Another part of cannon rotating     
        dx = self.look_at_pos[0] - self.rect.centerx
        dy = self.look_at_pos[1] - self.rect.centery 
        
        angle = (180/math.pi) * math.atan2(-dy,dx)
  
        gun_size = self.image.get_size()
        pivot = (8,gun_size[1]//2)
        blitRotate(window,self.image,self.rect.center,pivot,angle)
  
    def lookAt( self,coordinate ):
        self.look_at_pos = coordinate
        
        


# The color white
white = (255,255,255)

# The xy cords,height and color of my classes[]

playerman = Player(350,416,34,75,white)

# This is where my balloons get hit by the bullet and disappers
# redrawing window
def redrawwindow():
    window.fill((0,0))

    # drawing the player in window
    playerman.draw()



# Frames for game
fps = 30
clock = pygame.time.Clock()
#projectile empty list
bullets = []
# main loop
run = True
while run:
    clock.tick(fps)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    # cannon rotation
    mousex,mousey = pygame.mouse.get_pos()
    if not playerman.isLookingAtPlayer:
        playerman.lookAt((mousex,mousey))

                    
    # telling game that key means when a key get pressed
    keys = pygame.key.get_pressed()

    # The player moving when the key a is pressed
    if keys[pygame.K_a] and playerman.x > playerman.speed:
        playerman.x -= playerman.speed

    # The player moving when the key a is pressed
    if keys[pygame.K_d] and playerman.x < 500 - playerman.width - playerman.height:
        playerman.x += playerman.speed

    # Calling the redraw function
    redrawwindow()
    # updating game
    pygame.display.update()
# quiting the game
pygame.quit()

解决方法

按照对How to rotate an image(player) to the mouse direction? 的答案中的建议进行操作。您必须考虑大炮图像的方向:

angle = (180/math.pi) * math.atan2(-dy,dx) - 90

angle = (180/math.pi) * math.atan2(-dy,dx) - 90

How do I rotate an image around its center using PyGame?How can you rotate an image around an off center pivot in PyGame
pos 的第二个参数 (blitRotate) 是窗口中枢轴点的位置,第三个参数 (originPos) 是旋转 上枢轴点的位置表面

blitRotate(window,self.image,self.rect.center,pivot,angle)

gun_size = self.image.get_size()
pivot_abs = player_rect.centerx,player_rect.top + 10
pivot_rel = (gun_size[0] // 2,105)
        
blitRotate(window,pivot_abs,pivot_rel,angle)

完整的Player.draw方法:

class Player:
    # [...]

    def draw(self):
        self.rect.topleft = (self.x,self.y)
    
        player_rect = self.cannon2.get_rect(center = self.get_rect().center)
        player_rect.centerx -= 0
        player_rect.centery -= 10
    
        # Another part of cannon rotating     
        dx = self.look_at_pos[0] - self.rect.centerx
        dy = self.look_at_pos[1] - self.rect.centery 
        
        angle = (180/math.pi) * math.atan2(-dy,dx) - 90
  
        gun_size = self.image.get_size()
        pivot_abs = player_rect.centerx,player_rect.top + 10
        pivot_rel = (gun_size[0] // 2,105)
        
        pygame.draw.rect(window,self.color,self.rect)
        blitRotate(window,angle)
        window.blit(self.cannon2,player_rect)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。