【问题标题】:Is it possible (in pygame 1.9.6 / python 3.8.6) to move a character through a method? [duplicate]是否可以(在 pygame 1.9.6 / python 3.8.6 中)通过方法移动角色? [复制]
【发布时间】:2021-01-18 23:59:09
【问题描述】:

所以我目前正在开发一个简单的游戏,到目前为止只有游戏循环和一个用于创建玩家的类。我想保持我的游戏循环干净,所以我决定将用于移动角色的代码放入一个方法“move”中,该方法在游戏循环结束时在玩家被绘制之前被调用。目前,当我运行代码时,我的角色只是坐在原地,如果我发送垃圾邮件,有时会向左/向右移动,但它看起来很随机。这是整个代码,该方法是否没有正确/每次调用都被调用?希望大家帮帮我

import pygame

pygame.init()

screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)
screenWidth, screenHeight = pygame.display.get_surface().get_size()
fpsclock = pygame.time.Clock()

def screen_refresh():
    screen.fill((0, 0, 0))
    player.move()
    player.draw()
    pygame.display.update()
    fpsclock.tick(60)

class player:

    def __init__(self, vel):
        self.img = pygame.image.load('player.png')
        #self.walk = [pygame.image.load('player_1.png'), pygame.image.load('player_2.png')]
        self.width, self.height = self.img.get_size()       
        self.x = (screenWidth - self.width) * 0.5
        self.y = screenHeight - self.height

        self.vel = vel

        self.xchange = 0

    def move(self):

        for event in pygame.event.get():

            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_d:
                    self.xchange += self.vel
                if event.key == pygame.K_a:
                    self.xchange -= self.vel

            if event.type == pygame.KEYUP:
                if event.key == pygame.K_d:
                    self.xchange -= self.vel
                if event.key == pygame.K_a:
                    self.xchange += self.vel

        self.x += self.xchange

        if self.x < 0:
            self.x = 0

        elif self.x > (screenWidth - self.width):
            self.x = screenWidth - self.width

    def draw(self):

        screen.blit(self.img, (self.x, self.y))

player = player(5)

running = True
while running:

    for event in pygame.event.get():

        if event.type == pygame.QUIT:
            running = False

    screen_refresh()

【问题讨论】:

    标签: python methods pygame


    【解决方案1】:

    您的代码不起作用,因为您多次调用pygame.event.get()pygame.event.get() 获取所有事件消息并将它们从队列中删除。因此,只有一个循环将接收事件,另一个循环什么也得不到。这导致事件似乎被错过了。

    在主应用程序循环中获取事件列表一次,并将列表传递给处理它们的函数和方法:

    def screen_refresh(events):  # events: list of events 
        screen.fill((0, 0, 0))
        player.move(events)      # pass events to player.move
        player.draw()
        pygame.display.update()
        fpsclock.tick(60)
    
    class player:
        # [...]
    
        def move(self, events): # events: list of events 
    
            for event in events:
                # [...]
    
    running = True
    while running:
    
        events = pygame.event.get()  # get list of events
        for event in events:
    
            if event.type == pygame.QUIT:
                running = False
    
        screen_refresh(events)       # pass events to screen_refresh
    

    【讨论】:

      【解决方案2】:

      self.vel=vel 其他变量 vel 在哪里 而且我还想建议先绘制玩家然后移动它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-09-05
        • 2019-10-06
        • 2013-09-29
        • 2019-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多