亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在表面上繪制并使用 pygame 旋轉

在表面上繪制并使用 pygame 旋轉

慕無忌1623718 2021-07-28 06:52:13
我試圖在 Python 中使用命令 context.rotate(angle) 在 JS 中模擬一些可用的行為。我有以下代碼: import pygame import math import numpy as nppygame.init()CLOCK = pygame.time.Clock()RED = pygame.color.THECOLORS['red']WHITE = pygame.color.THECOLORS['white']screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)screen_width, screen_height = screen.get_size()surface = pygame.Surface((50, 50), pygame.SRCALPHA)surface.fill((0, 0, 0))rotated_surface = surfacerect = surface.get_rect()ax = int(screen_width / 2)ay = int(screen_height / 2)angle = 0print("Size of the screen ({}, {})".format(screen_width, screen_height))print("Center of the screen ({}, {})".format(ax, ay))myfont = pygame.font.SysFont("monospace", 12)pygame.display.set_caption("Test rotate")main_loop = Trueamplifier = 200def calculate_angle(mouse_position):    dx = mouse_position[0] - ax    dy = mouse_position[1] - ay    return np.arctan2(dy,dx)while main_loop:    for event in pygame.event.get():        keys = pygame.key.get_pressed()        if event.type == pygame.QUIT or keys[pygame.K_ESCAPE]:            main_loop = False    pos = pygame.mouse.get_pos()    angle = (calculate_angle(pos) * 180)/math.pi    screen.fill((255,255,255))    rotated_surface = pygame.transform.rotate(surface, -angle)    rect = rotated_surface.get_rect(center = (ax, ay))    screen.blit(rotated_surface, (rect.x, rect.y))    pygame.draw.line(rotated_surface, WHITE, (ax,ay), (ax+20, ay), 1)    pygame.draw.line(rotated_surface, WHITE, (ax+10,ay-10), (ax+20, ay), 1)    pygame.draw.line(rotated_surface, WHITE, (ax+10,ay+10), (ax+20, ay), 1)    pygame.display.update()    CLOCK.tick(30)pygame.quit()我正在繪制一個箭頭并希望根據鼠標在屏幕上的位置旋轉它。我當然可以在每次進行一些正弦、余弦計算時重新繪制線條,但這很痛苦。我認為表面可以在這里幫助我,事實上,它適用于完美旋轉的矩形。但是將我的線條畫到表面上是行不通的。所以,我想我誤解了表面的用途,或者我編碼錯誤,有更好的方法來做到這一點。請注意,如果我在我的 draw.line 指令中用 screen 替換了 Rodated_surface,箭頭確實會在屏幕上繪制,但永遠不會旋轉。有什么想法(除了使用圖像/精靈;))?
查看完整描述

1 回答

?
忽然笑

TA貢獻1806條經驗 獲得超5個贊

問題是您在表面積外繪制箭頭線。每個表面的左上角坐標為 (0, 0),因此它們都有自己的(本地)坐標系。由于您使用屏幕的中心坐標來繪制線條,因此不會在可見表面區域中繪制箭頭。


我會使用局部坐標在 while 循環之前的原始表面上繪制線條,然后旋轉它并在循環內獲得一個新的矩形。


import math

import pygame



pygame.init()


CLOCK = pygame.time.Clock()

GRAY = pygame.color.THECOLORS['gray50']

WHITE = pygame.color.THECOLORS['white']

screen = pygame.display.set_mode((800, 600))

screen_rect = screen.get_rect()  # A rect with the size of the screen.

surface = pygame.Surface((50, 50), pygame.SRCALPHA)

# surface.fill((0, 50, 150))  # Fill the surface to make it visible.

# Use the local coordinate system of the surface to draw the lines.

pygame.draw.line(surface, WHITE, (0, 0), (25, 0), 1)

pygame.draw.line(surface, WHITE, (0, 0), (25, 25), 1)

pygame.draw.line(surface, WHITE, (0, 0), (0, 25), 1)

# I rotate it so that the arrow is pointing to the right (0° is right).

surface = pygame.transform.rotate(surface, -135)

rect = surface.get_rect()

angle = 0

# If you're using Python 3.6+, you can use f-strings.

print(f"Size of the screen {screen.get_size()}")

print(f"Center of the screen {screen_rect.center}")


def calculate_angle(mouse_position):

    dx = mouse_position[0] - screen_rect.centerx

    dy = mouse_position[1] - screen_rect.centery

    return math.atan2(dy, dx)


main_loop = True

while main_loop:

    for event in pygame.event.get():

        # You shouldn't use `pygame.key.get_pressed` in the event loop.

        if (event.type == pygame.QUIT

            or event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE):

            main_loop = False


    pos = pygame.mouse.get_pos()

    angle = math.degrees(calculate_angle(pos))

    screen.fill(GRAY)

    # Now just rotate the original surface and get a new rect.

    rotated_surface = pygame.transform.rotate(surface, -angle)

    rect = rotated_surface.get_rect(center=(screen_rect.center))

    screen.blit(rotated_surface, rect)

    pygame.display.update()

    CLOCK.tick(30)



pygame.quit()

我還嘗試改進了一些其他內容(查看評論)。


查看完整回答
反對 回復 2021-08-03
  • 1 回答
  • 0 關注
  • 199 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號