Pygame - Python - 立方体上的 360 度角,光标/指针/鼠标方向
Pygame - Python - 360-degree angle on a cube, cursor / pointer / mouse orientation
我正在尝试解决这个角度问题,我注意到坐标中有两个 0,0,也许这就是阻止立方体进行 360 度旋转的原因,请按照视频和代码进行操作.
有人可以帮助我吗?
import pygame
import sys
import os
import math
def main():
pygame.init()
clock = pygame.time.Clock()
screen = pygame.display.set_mode([1000, 500])
pygame.display.set_caption('Example 1')
player = pygame.image.load(os.path.join('img', 'rect.png')).convert_alpha() #path to cube ./img/rect.png
pygame.font.init()
font = pygame.font.get_default_font()
font_angle = pygame.font.SysFont(font, 44, True)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
clock.tick(60)
screen.fill((255, 255, 255)) #screen background color
player_rect = player.get_rect() #player rect (for center position)
mouse_x, mouse_y = pygame.mouse.get_pos() #mouse position (x, y)
#to define angle - start
hypo = math.sqrt(math.pow(mouse_x - (player_rect[0] + player_rect.centerx), 2) +
math.pow(mouse_y - (player_rect[1] + player_rect.centery), 2))
cos = (mouse_x - (player_rect[0] + player_rect.centerx)) / hypo
sin = (mouse_y - (player_rect[1] + player_rect.centery)) / hypo
angle = (180 / math.pi) * - math.atan2(sin, cos)
#end
newplayer = pygame.transform.rotate(player, angle) #rotate cube
screen.blit(newplayer, [300, 100]) #show cube in screen
text = font_angle.render(str("%.2f" % angle), 1, (255, 0, 0)) #show angle in mouse position
screen.blit(text, ((mouse_x+20), mouse_y)) #show text
pygame.display.update() #update frames
main()
你可以直接从mouse_x
的位置减去player_rect.centerx
的位置(y
也一样)然后传给math.atan2
:
dist_x = mouse_x - player_rect.centerx
dist_y = mouse_y - player_rect.centery
angle = -math.degrees(math.atan2(dist_y, dist_x))
在 while 循环开始之前创建矩形并传递所需的中心坐标。在图像旋转后使用get_rect
创建一个新的rect,并传递之前rect的中心坐标以保持其居中。并在 player_rect
处(即在其 topleft
坐标处)blit 图像。
import pygame
import sys
import os
import math
def main():
pygame.init()
clock = pygame.time.Clock()
screen = pygame.display.set_mode([1000, 500])
# player = pygame.image.load(os.path.join('img', 'rect.png')).convert_alpha() #path to cube ./img/rect.png
player = pygame.Surface((50, 30), pygame.SRCALPHA)
pygame.draw.polygon(player, (100, 200, 255), [(0, 0), (50, 15), (0, 30)])
player_rect = player.get_rect(center=(500, 250)) # player rect (for center position)
font = pygame.font.get_default_font()
font_angle = pygame.font.SysFont(font, 44, True)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
clock.tick(60)
screen.fill((255, 255, 255))
mouse_x, mouse_y = pygame.mouse.get_pos()
dist_x = mouse_x - player_rect.centerx
dist_y = mouse_y - player_rect.centery
angle = -math.degrees(math.atan2(dist_y, dist_x))
newplayer = pygame.transform.rotate(player, angle)
# Create a new rect and pass the center of the old rect.
player_rect = newplayer.get_rect(center=player_rect.center)
screen.blit(newplayer, player_rect) # Blit it at the player_rect.
text = font_angle.render(str("%.2f" % angle), 1, (255, 0, 0))
screen.blit(text, ((mouse_x+20), mouse_y))
pygame.display.update()
main()
我正在尝试解决这个角度问题,我注意到坐标中有两个 0,0,也许这就是阻止立方体进行 360 度旋转的原因,请按照视频和代码进行操作.
有人可以帮助我吗?
import pygame
import sys
import os
import math
def main():
pygame.init()
clock = pygame.time.Clock()
screen = pygame.display.set_mode([1000, 500])
pygame.display.set_caption('Example 1')
player = pygame.image.load(os.path.join('img', 'rect.png')).convert_alpha() #path to cube ./img/rect.png
pygame.font.init()
font = pygame.font.get_default_font()
font_angle = pygame.font.SysFont(font, 44, True)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
clock.tick(60)
screen.fill((255, 255, 255)) #screen background color
player_rect = player.get_rect() #player rect (for center position)
mouse_x, mouse_y = pygame.mouse.get_pos() #mouse position (x, y)
#to define angle - start
hypo = math.sqrt(math.pow(mouse_x - (player_rect[0] + player_rect.centerx), 2) +
math.pow(mouse_y - (player_rect[1] + player_rect.centery), 2))
cos = (mouse_x - (player_rect[0] + player_rect.centerx)) / hypo
sin = (mouse_y - (player_rect[1] + player_rect.centery)) / hypo
angle = (180 / math.pi) * - math.atan2(sin, cos)
#end
newplayer = pygame.transform.rotate(player, angle) #rotate cube
screen.blit(newplayer, [300, 100]) #show cube in screen
text = font_angle.render(str("%.2f" % angle), 1, (255, 0, 0)) #show angle in mouse position
screen.blit(text, ((mouse_x+20), mouse_y)) #show text
pygame.display.update() #update frames
main()
你可以直接从mouse_x
的位置减去player_rect.centerx
的位置(y
也一样)然后传给math.atan2
:
dist_x = mouse_x - player_rect.centerx
dist_y = mouse_y - player_rect.centery
angle = -math.degrees(math.atan2(dist_y, dist_x))
在 while 循环开始之前创建矩形并传递所需的中心坐标。在图像旋转后使用get_rect
创建一个新的rect,并传递之前rect的中心坐标以保持其居中。并在 player_rect
处(即在其 topleft
坐标处)blit 图像。
import pygame
import sys
import os
import math
def main():
pygame.init()
clock = pygame.time.Clock()
screen = pygame.display.set_mode([1000, 500])
# player = pygame.image.load(os.path.join('img', 'rect.png')).convert_alpha() #path to cube ./img/rect.png
player = pygame.Surface((50, 30), pygame.SRCALPHA)
pygame.draw.polygon(player, (100, 200, 255), [(0, 0), (50, 15), (0, 30)])
player_rect = player.get_rect(center=(500, 250)) # player rect (for center position)
font = pygame.font.get_default_font()
font_angle = pygame.font.SysFont(font, 44, True)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
clock.tick(60)
screen.fill((255, 255, 255))
mouse_x, mouse_y = pygame.mouse.get_pos()
dist_x = mouse_x - player_rect.centerx
dist_y = mouse_y - player_rect.centery
angle = -math.degrees(math.atan2(dist_y, dist_x))
newplayer = pygame.transform.rotate(player, angle)
# Create a new rect and pass the center of the old rect.
player_rect = newplayer.get_rect(center=player_rect.center)
screen.blit(newplayer, player_rect) # Blit it at the player_rect.
text = font_angle.render(str("%.2f" % angle), 1, (255, 0, 0))
screen.blit(text, ((mouse_x+20), mouse_y))
pygame.display.update()
main()