簡體   English   中英

當我運行應該讓玩家看着鼠標的代碼時,他會發瘋

[英]When i run my code which should make the player look at the mouse he goes crazy

我的播放器有以下代碼

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

當我運行它時,播放器失去控制並沿對角線向屏幕邊緣移動。 當我玩 rect 的中心時會發生這種情況。 我無法讓玩家輪換,並希望得到幫助,提前感謝您。

如果我保持原始圖像的center ,代碼對我有用

self.pos = pygame.math.Vector2(self.rect.centerx, self.rect.centery)

用於測試的代碼:

我把原始圖像中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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM