oop pygame player_x变量更改,但在显示中没有发生任何变化

发布于 2025-02-07 09:18:50 字数 1226 浏览 0 评论 0原文

嗨,整个编程非常陌生,所以这可能是一个非常愚蠢的问题。目前正在尝试通过制作游戏来了解有关OOP的更多信息。

虽然player_x的价值正在变化,但由于某些原因,它没有像我预期的那样移动。

main.py

import pygame, settings, obstacles, npc, player
from utils import *
pygame.init()

window = pygame.display.set_mode((settings.WIDTH, settings.HEIGHT))
FPS = pygame.time.Clock()

player = player.Player(window)

Loop

run = True

while run:
    FPS.tick(settings.FPS)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_w:
                settings.PLAYER_X -= 5
                print(settings.PLAYER_X)

    pygame.display.update()

player.py

import pygame, settings
pygame.init()

class Player():
    def __init__(self, window) -> None:
        pygame.draw.rect(window, settings.OLIVE, (settings.PLAYER_X, settings.PLAYER_Y, settings.PLAYER_WIDTH, settings.PLAYER_HEIGHT)) # (x, y, width, height)
    
    def player_control(self):
        pass

settings.py

WIDTH = 1440
HEIGHT = 720
FPS = 60

PLAYER_X = 100
PLAYER_Y = 200
PLAYER_WIDTH = 50 
PLAYER_HEIGHT = 50

OLIVE = (136, 196, 23)

Hi am pretty new to programming in general so this might be a pretty dumb problem. Am currently trying to learn more about OOP by making a game.

while the value of player_x is changing for some reasons its not moving as I expected.

main.py

import pygame, settings, obstacles, npc, player
from utils import *
pygame.init()

window = pygame.display.set_mode((settings.WIDTH, settings.HEIGHT))
FPS = pygame.time.Clock()

player = player.Player(window)

Loop

run = True

while run:
    FPS.tick(settings.FPS)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_w:
                settings.PLAYER_X -= 5
                print(settings.PLAYER_X)

    pygame.display.update()

player.py

import pygame, settings
pygame.init()

class Player():
    def __init__(self, window) -> None:
        pygame.draw.rect(window, settings.OLIVE, (settings.PLAYER_X, settings.PLAYER_Y, settings.PLAYER_WIDTH, settings.PLAYER_HEIGHT)) # (x, y, width, height)
    
    def player_control(self):
        pass

settings.py

WIDTH = 1440
HEIGHT = 720
FPS = 60

PLAYER_X = 100
PLAYER_Y = 200
PLAYER_WIDTH = 50 
PLAYER_HEIGHT = 50

OLIVE = (136, 196, 23)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

黑寡妇 2025-02-14 09:18:51

要移动player,您需要:

  • 在每个while-loop中渲染player
  • 使用更新的player,使用更新的player_x

,您需要在代码中进行一些修改:

  1. 创建一个函数以在player.py.py.py中渲染并在循环中调用,而不是渲染player__ INIT __中,只能称为一次。

  2. 参考settings.player_x__ INT __ INT __ in player.py.py中仅一次,然后更新player 按下键时对象。


  3. 在每个循环的末尾,渲染player对象。


player.py

import pygame, settings
pygame.init()

class Player():
    def __init__(self, window) -> None:
        self.window = window
        self.color = settings.OLIVE
        self.X = settings.PLAYER_X
        self.Y = settings.PLAYER_Y
        self.W = settings.PLAYER_WIDTH
        self.H = settings.PLAYER_HEIGHT
        self.render()
    
    def render(self):
        pygame.draw.rect(self.window, self.color, (self.X, self.Y, self.W, self.H)) 
        
    def player_control(self):
        pass

main.py

import pygame, settings, player
pygame.init()

window = pygame.display.set_mode((settings.WIDTH, settings.HEIGHT))
FPS = pygame.time.Clock()

player = player.Player(window)

run = True

while run:
    FPS.tick(settings.FPS)
    
    for event in pygame.event.get():
        
        if event.type == pygame.QUIT:
            run = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_w:
                player.X -= 5
                print(player.X)
    window.fill((0, 0, 0))
    player.render()
    pygame.display.update()

To move your player, you need to:

  • Render your player in every while-loop
  • Render your player with the updated PLAYER_X

And to achieve it, you need a few modification in your code:

  1. Create a function to render in your player.py and call it in the loop instead of render a player in __init__, which will only be called once.

  2. Reference settings.PLAYER_X only once in the __init__ in player.py and update the variable of the player object when key are pressed.

  3. At the end of every loop, render the player object.


player.py

import pygame, settings
pygame.init()

class Player():
    def __init__(self, window) -> None:
        self.window = window
        self.color = settings.OLIVE
        self.X = settings.PLAYER_X
        self.Y = settings.PLAYER_Y
        self.W = settings.PLAYER_WIDTH
        self.H = settings.PLAYER_HEIGHT
        self.render()
    
    def render(self):
        pygame.draw.rect(self.window, self.color, (self.X, self.Y, self.W, self.H)) 
        
    def player_control(self):
        pass

main.py

import pygame, settings, player
pygame.init()

window = pygame.display.set_mode((settings.WIDTH, settings.HEIGHT))
FPS = pygame.time.Clock()

player = player.Player(window)

run = True

while run:
    FPS.tick(settings.FPS)
    
    for event in pygame.event.get():
        
        if event.type == pygame.QUIT:
            run = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_w:
                player.X -= 5
                print(player.X)
    window.fill((0, 0, 0))
    player.render()
    pygame.display.update()
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文