为什么我的精灵无法在pygame中正确移动?

时间:2020-06-01 10:22:04

标签: python pygame

我的第二场比赛是平台游戏。我画了所有的痕迹,画了背景和平台,但是我不能以一种方式将角色移动超过45个像素,即使应该移动5个像素也是如此。我还从这里到那里复制了一些代码,所以我不能只搜索它。这很令人困惑,请帮忙。 这是代码:

import sys
import pygame

screen = pygame.display.set_mode((1300, 700), pygame.RESIZABLE)
global bg
bg = pygame.image.load('Pictures/badground.png')
w = (0, 0, 0)
screen.fill(w)
screen.blit(bg, (0, 0))
level = 0
walking_l = (pygame.image.load('Pictures/walk_l.png'))
walking_r = (pygame.image.load('Pictures/walk_r.png'))
walking_l_2 = (pygame.image.load('Pictures/_stand.png'))
walking_r_2 = (pygame.image.load('Pictures/stand.png'))
stand = (pygame.image.load('Pictures/rstand.png'))
pf = (pygame.image.load('Pictures/platform.png'))
pygame.display.set_caption('Platformed')


class player(object):
    def __init__(self, speed, width, height):
        self.speed = speed
        self.x = 650
        self.y = 350
        self.width = width
        self.height = height
        self.walk_l = False
        self.walk_r = False
        self.stand = True
        self.jump = False
        self.walk_count = 0

    def reprint_win(self):
        screen.fill(w)
        screen.blit(bg, (0, 0))

    def walk(self):
        k = pygame.key.get_pressed()
        if k[pygame.K_a]:
            self.x -= self.speed
            self.stand = False
            self.walk_l = True
            self.walk_r = False
            self.jump = False
            print(self.x)
            screen.fill(w)
            screen.blit(bg, (0, 0))
        elif k[pygame.K_d]:
            self.x += self.speed
            self.stand = False
            self.walk_r = True
            self.walk_l = False
            self.jump = False
            print(self.y)
            screen.fill(w)
            screen.blit(bg, (0, 0))
        elif k[pygame.K_w] and self.walk_r and not self.jump:
            self.stand = False
            self.walk_r = True
            self.walk_l = False
            self.jump = True
            screen.fill(w)
            screen.blit(bg, (0, 0))
        else:
            self.stand = True
            self.walk_r = False
            self.walk_l = False
            self.jump = False
            screen.fill(w)
            screen.blit(bg, (0, 0))


while True:
    for e in pygame.event.get():
        man = player(5, 64, 64)
        if e.type == pygame.QUIT:
            sys.exit()
        if e.type == pygame.KEYDOWN:
            man.walk()
            screen.blit(stand, (man.x, man.y))
            pygame.display.update()
        elif e.type == pygame.KEYDOWN:
            man.walk()
            screen.blit(stand, (man.x, man.y))
            pygame.display.update()

1 个答案:

答案 0 :(得分:0)

walk()的方法player更改了实例属性,但id不会绘制任何内容。
添加方法draw,该方法根据实例属性吸引玩家:

class player(object):
    # [...]

    def walk(self):
        self.stand, self.walk_l, self.walk_r, self.jump = False, False, False, False 
        k = pygame.key.get_pressed()
        if k[pygame.K_a]:
            self.x -= self.speed
            self.walk_l = True
        elif k[pygame.K_d]:
            self.x += self.speed
            self.walk_r = True
        elif k[pygame.K_w] and self.walk_r and not self.jump:
            self.jump = True
        else:
            self.stand = True

    def draw(self, surf):
        if self.walk_l:
            surf.blit(walking_l, (self.x, self.y))
        elif self.walk_r:
            surf.blit(walking_r, (self.x, self.y))
        else:
            surf.blit(stand, (self.x, self.y))

您必须在每一帧中绘制整个场景。将绘图绘制到应用程序循环而不是事件循环。
此外,必须在应用程序循环之前创建palyer的实例,并在每个帧中调用man.mvoe()
使用pygame.time.Clock() .tick()来控制每秒的帧数:

man = player(5, 64, 64)

clock = pygame.time.Clock()
FPS = 60
while True:
    clock.tick(FPS)

    for e in pygame.event.get():
        if e.type == pygame.QUIT:
            sys.exit()

    man.walk()      

    screen.blit(bg, (0, 0))  
    man.draw(screen)
    pygame.display.update()