Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Pygame和Pyganim旋转时,如何保持图像居中_Python_Rotation_Pygame_Image Rotation - Fatal编程技术网

Python 使用Pygame和Pyganim旋转时,如何保持图像居中

Python 使用Pygame和Pyganim旋转时,如何保持图像居中,python,rotation,pygame,image-rotation,Python,Rotation,Pygame,Image Rotation,Python版本:3.4 我最近开始使用Pygame,然后开始使用pyganim模块来处理精灵的动画。 我在尝试旋转动画时遇到了一个问题。从这个问题来看,它有一种奇怪的效果,如本例所示: 我尝试了多种修复方法,例如找到图像的中心等,但由于它是一个pyganim对象,我正在快速切换到我的表面,就像:屏幕是我的表面 player.blit(screen, playerpos) 改变它的中心似乎没有效果 我也尝试过将我正在使用的图像替换成一个完整的黑色正方形,但我仍然没有成功地调试它 我假设这是因

Python版本:3.4

我最近开始使用Pygame,然后开始使用pyganim模块来处理精灵的动画。

我在尝试旋转动画时遇到了一个问题。从这个问题来看,它有一种奇怪的效果,如本例所示:

我尝试了多种修复方法,例如找到图像的中心等,但由于它是一个pyganim对象,我正在快速切换到我的表面,就像:屏幕是我的表面

player.blit(screen, playerpos)
改变它的中心似乎没有效果

我也尝试过将我正在使用的图像替换成一个完整的黑色正方形,但我仍然没有成功地调试它


我假设这是因为我正在将pyganim对象blit到我的曲面,我可能需要将它blit到另一个曲面并旋转它?问题出在这里player.getRect->它返回可以安装的最小可能的rect。你应该在每一步中使用非旋转精灵的原始矩形。你的意思是这样的吗?playerpos1=playerpos[0]-orig_rectH/2,playerpos[1]-orig_rectW/2,其中ori_rectX由getRect.Width/Height在源位置设置?因为这并没有解决问题。知道图像的大小,如果我将图像大小设置为常量,例如playerpos[0]-44/2,playerpos[1]-44/2,也不能解决问题
# Set player position and rotation
position = pygame.mouse.get_pos()
angle = math.atan2(position[1]-(playerpos[1]),position[0]-(playerpos[0]))
player.clearTransforms()
player.rotate((360-angle*57.29)-90)
playerpos1 = (playerpos[0]-(player.getRect().width/2), playerpos[1]-(player.getRect().height/2))
player.blit(screen, playerpos1) 
# Import modules
import pygame
from pygame.locals import *
import pyganim
import math

# Initialise
pygame.init()
width, height = 640, 480
screen=pygame.display.set_mode((width, height))
keys = [False, False, False, False]
playerpos=[100,100]

# Load images
player = pyganim.PygAnimation([('resources/images/tdt/p1.png', 0.3), ('resources/images/tdt/p2.png', 0.3), ('resources/images/tdt/p3.png', 0.3), ('resources/images/tdt/p2.png', 0.3)])
player.play()
grass = pygame.image.load("resources/images/tdt/bg.png")
grasswidth = grass.get_width()
grassheight = grass.get_height()
myfont = pygame.font.SysFont("monospace", 20)


# loop
while 1:
# clear the screen before re-drawing
screen.fill(0)

# draw the screen elements
for x in range(width//grasswidth+1):
    for y in range(height//grassheight+1):
        screen.blit(grass,(x*100,y*100))

# Set player position and rotation
position = pygame.mouse.get_pos()
angle = math.atan2(position[1]-(playerpos[1]),position[0]-(playerpos[0]))
player.clearTransforms()
player.rotate((360-angle*57.29)-90)
playerpos1 = (playerpos[0]-(player.getRect().width/2), playerpos[1]-(player.getRect().height/2))
player.blit(screen, playerpos1) 


# render text
label = myfont.render("X pos: "+str(playerpos[0])+"| Y pos: "+str(playerpos[1]), 1, (255,255,0))
screen.blit(label, (20, 20))    

# Update the screen
pygame.display.flip()

# loop through the events
for event in pygame.event.get():
    #check if the event is the X button
    if event.type==pygame.QUIT:
        ##if it is, quit the game
        pygame.quit()
        exit(0)

    if event.type == pygame.KEYDOWN:
        if event.key==K_w:
            keys[0]=True
        elif event.key==K_a:
            keys[1]=True
        elif event.key==K_s:
            keys[2]=True
        elif event.key==K_d:
            keys[3]=True
    if event.type == pygame.KEYUP:
        if event.key==pygame.K_w:
            keys[0]=False
        elif event.key==pygame.K_a:
            keys[1]=False
        elif event.key==pygame.K_s:
            keys[2]=False
        elif event.key==pygame.K_d:
            keys[3]=False

# Move player
if keys[0]: # W
    playerpos[1]-=2
elif keys[2]: # S
    playerpos[1]+=2
if keys[1]: # A
    playerpos[0]-=2
elif keys[3]: # D
    playerpos[0]+=2
playerpos1 = rMoveAmount(playerpos,angle, 44)
player.blit(screen, playerpos1) 
def rMoveAmount(position, degrees, picsize):
#MOVE A BOX DEPENDING ON THE AMOUNT ROTATED
degTest = int(((360-degrees*57.29)-180)%90) 
#Has to be split up into two sections, before the half 90 degree rotation
if degTest < 45:
    t = int((((360-angle*57.29)-180)%45)//4) 
    nPos = (position[0] - t , position[1] - t )
#And after
if degTest > 44: 
    t = int((((360-angle*57.29)-180)%45)//4) 
    nPos = (position[0] + t - 11, position[1] + t - 11)

return nPos
# 3 - Load images
player = pyganim.PygAnimation([('resources/images/tdt/p1.png', 0.3), ('resources/images/tdt/p2.png', 0.3), ('resources/images/tdt/p3.png', 0.3), ('resources/images/tdt/p2.png', 0.3)])
player.play()
playerSize = player.getRect().width


 # 6.1 - Set player position and rotation
position = pygame.mouse.get_pos()
angle = math.atan2(position[1]-(playerpos[1]+(playerSize/2)),position[0]-(playerpos[0]+(playerSize/2)))
player.clearTransforms()
player.rotate((360-angle*57.29)-90)
playerpos1 = rMoveAmount(playerpos,angle, playerSize)
player.blit(screen, playerpos1)
def rMoveAmount(position, degrees, picsize):
#MOVE A BOX DEPENDING ON THE AMOUNT ROTATED
degTest = int(((360-degrees*57.29)-180)%90)
quartsize = picsize / 4
#Has to be split up into two sections, before the half 90 degree rotation
if degTest < 45:
    #t = int((((360-angle*57.29)-180)%45)//4)
    jump = (quartsize / 44)
    nPos = (position[0] - (jump * degTest)   , position[1] - (jump * degTest)  )
#And after
if degTest > 44:
    jump = (quartsize / 44)
    nPos = (position[0] + (jump * degTest) - (picsize/2) , position[1] + (jump * degTest) - (picsize/2))
return nPos