[英]When i run my code which should make the player look at the mouse he goes crazy
I have the following code for my player我的播放器有以下代码
class Player(pygame.sprite.Sprite):
def __init__(self, game):
self.game = game
self.path = os.path.dirname(__file__)
self.imageFolder = os.path.join(self.path, "images")
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load(os.path.join(self.imageFolder, "player.png")).convert_alpha()
self.rect = self.image.get_rect()
self.rect.center = (600, 500)
self.pos = (600,500)
def update(self):
self.pos = pygame.math.Vector2(self.rect.x, self.rect.y)
if self.rect.y >= 940:
self.rect.y = 940
if self.rect.y <= 10:
self.rect.y = 10
if self.rect.x >= 1140:
self.rect.x = 1140
if self.rect.x <= 10:
self.rect.x = 10
keyPressed = pygame.key.get_pressed()
if keyPressed[pygame.K_w]:
self.rect.y -= 5
if keyPressed[pygame.K_s]:
self.rect.y += 5
if keyPressed[pygame.K_d]:
self.rect.x += 5
if keyPressed[pygame.K_a]:
self.rect.x -= 5
self.lookAtMouse()
def lookAtMouse(self):
relX, relY = self.game.mouseX - self.rect.x, self.game.mouseY - self.rect.y
angle = (180 / math.pi) * -math.atan2(relY, relX)
self.newImage = pygame.transform.rotate(self.image, int(angle))
self.rect = self.newImage.get_rect()
self.rect.center = self.pos
and when i run it the player goes out of control and moves in a diagonal line towards the edge of the screen.当我运行它时,播放器失去控制并沿对角线向屏幕边缘移动。 this happens when i play with the rect's center.当我玩 rect 的中心时会发生这种情况。 i can't get the player to rotate and would like help thank you in advance.我无法让玩家轮换,并希望得到帮助,提前感谢您。
Code works for me if I keep center
of original image如果我保持原始图像的center
,代码对我有用
self.pos = pygame.math.Vector2(self.rect.centerx, self.rect.centery)
Code used for testing:用于测试的代码:
I keep original image in self.original_image
and create rotated image in self.image
我把原始图像中self.original_image
和创建旋转的图像self.image
import pygame
import random
import os
import math
# --- constants --- (UPPER_CASE_NAMES)
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
FPS = 25 # for more than 220 it has no time to update screen
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
# --- classes --- (CamelCaseNames)
class Player(pygame.sprite.Sprite):
def __init__(self, game):
self.game = game
self.path = os.path.dirname(__file__)
self.imageFolder = os.path.join(self.path, "images")
pygame.sprite.Sprite.__init__(self)
self.original_image = pygame.image.load(os.path.join(self.imageFolder, "player.png")).convert_alpha()
#self.original_image = pygame.image.load("image.png")).convert_alpha()
self.image = self.original_image.copy()
self.rect = self.image.get_rect()
self.rect.center = (600, 500)
self.pos = (600,500)
def update(self):
if self.rect.y >= 940:
self.rect.y = 940
if self.rect.y <= 10:
self.rect.y = 10
if self.rect.x >= 1140:
self.rect.x = 1140
if self.rect.x <= 10:
self.rect.x = 10
keyPressed = pygame.key.get_pressed()
if keyPressed[pygame.K_w]:
self.rect.y -= 5
if keyPressed[pygame.K_s]:
self.rect.y += 5
if keyPressed[pygame.K_d]:
self.rect.x += 5
if keyPressed[pygame.K_a]:
self.rect.x -= 5
self.pos = pygame.math.Vector2(self.rect.centerx, self.rect.centery)
self.lookAtMouse()
def lookAtMouse(self):
mouseX, mouseY = pygame.mouse.get_pos()
relX, relY = mouseX - self.rect.x, mouseY - self.rect.y
angle = (180 / math.pi) * -math.atan2(relY, relX)
self.image = pygame.transform.rotate(self.original_image, int(angle))
self.rect = self.image.get_rect()
self.rect.center = self.pos
# --- functions --- (lower_case_names)
# --- main ---
pygame.init()
screen = pygame.display.set_mode( (SCREEN_WIDTH, SCREEN_HEIGHT) )
player = Player(None)
# --- mainloop ---
clock = pygame.time.Clock()
running = True
while running:
# --- events ---
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYUP:
if event.key == pygame.K_ESCAPE:
running = False
# --- changes/moves/updates ---
if not pygame.key.get_pressed()[pygame.K_SPACE]:
player.update()
# --- draws ---
screen.fill(BLACK)
screen.blit(player.image, player.rect)
pygame.display.flip()
# --- FPS ---
ms = clock.tick(FPS)
#pygame.display.set_caption('{}ms'.format(ms)) # 40ms for 25FPS, 16ms for 60FPS
fps = clock.get_fps()
pygame.display.set_caption('FPS: {}'.format(fps))
# --- end ---
pygame.quit()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.