问题描述
我对编程和 pygame 都很陌生,这是我第一次尝试制作平台游戏。我遵循了关于如何制作滚动背景的 youtube 教程,并尝试将其实现到我自己的代码中。但它几乎没有运行,大多数时候字符会随机卡住,我不知道如何以及为什么。
这是错误的视频:https://youtu.be/sQK-Yeil4GE
这是全部代码
import pygame,os
#from pygame import Vector2
#Images
BG = pygame.image.load(os.path.join("assets\Background.png"))
BG2 = pygame.image.load(os.path.join("assets\F38196.jpg"))
idle_mario = pygame.image.load(os.path.join('assets\player_animations\Bigidle\Bigidle_0.png'))
mario_run_0 = pygame.image.load(os.path.join('assets\player_animations\Bigrun\Bigrun_0.png'))
mario_run_1 = pygame.image.load(os.path.join('assets\player_animations\Bigrun\Bigrun_1.png'))
mario_run_2 = pygame.image.load(os.path.join('assets\player_animations\Bigrun\Bigrun_2.png'))
mario_jump = pygame.image.load(os.path.join('assets\player_animations\Bigjump\Bigjump_0.png'))
bgWidth,bgHeight = BG2.get_rect().size
#Classes
class Character:
def __init__(self):
self.x = 200
self.x2 = 960
self.y = 810
self.ground = 810
self.vel = 0
#Idle image
self.mario_idle = pygame.transform.scale(idle_mario,(70,140))
#Running animation:
self.mario_run_0 = pygame.transform.scale(mario_run_0,140))
self.mario_run_1 = pygame.transform.scale(mario_run_1,140))
self.mario_run_2 = pygame.transform.scale(mario_run_2,140))
self.mario_run_set = [self.mario_run_0,self.mario_run_0,self.mario_run_1,self.mario_run_2,self.mario_run_2]
self.i = 0
#Jumping image:
self.mario_jump = pygame.transform.scale(mario_jump,140))
def draw_character(self,idle,moving_right,moving_left,jumping):
if jumping and moving_left is False:
screen.blit(self.mario_jump,(self.x2,self.y))
elif jumping and moving_left:
screen.blit(pygame.transform.flip(self.mario_jump,True,False),self.y))
elif idle:
screen.blit(self.mario_idle,self.y))
elif moving_right:
screen.blit(self.mario_run_set[self.i],self.y))
self.i += 1
if self.i == 6:
self.i = 0
elif moving_left:
screen.blit(pygame.transform.flip(self.mario_run_set[self.i],self.y))
self.i += 1
if self.i == 6:
self.i = 0
class Stage:
def __init__(self):
self.width = bgWidth
self.x = 0
self.start_scroll = W / 2
self.stop_scroll = self.width - self.start_scroll
class Main:
def __init__(self):
self.player = Character()
self.stage = Stage()
self.background = BG
self.background2 = BG2
self.bg_width = self.background2.get_rect().width
self.ground = pygame.Rect(0,990,1920,20)
self.move_right = False
self.move_left = False
self.idle = True
self.is_jumping = False
self.i = 1
def draw(self):
#pygame.draw.rect(screen,broWN,self.ground)
self.player.draw_character(self.idle,self.move_right,self.move_left,self.is_jumping)
#Config
W = 1920
H = 1020
pygame.init()
screen = pygame.display.set_mode((W,H))
pygame.display.set_caption("Lidl Adventures")
clock = pygame.time.Clock()
#Constants
BLACK = (0,0)
WHITE = (255,255,255)
broWN = (137,94,39)
FPS = 60
#Functions
def main():
true = True
main = Main()
while true:
for event in pygame.event.get():
if event.type == pygame.QUIT:
true = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_d:
main.move_right = True
main.move_left = False
main.idle = False
main.player.vel = 12
if event.key == pygame.K_a:
main.move_left = True
main.move_right = False
main.idle = False
main.player.vel = -12
if event.key == pygame.K_w or event.key == pygame.K_SPACE: #https://stackoverflow.com/questions/20940852/calculate-gravity-jump-in-pygame
main.is_jumping = True
elif event.type == pygame.KEYUP:
if event.key == pygame.K_d:
main.move_right = False
main.player.vel = 0
if event.key == pygame.K_a:
main.move_left = False
main.player.vel = 0
if main.move_left is False and main.move_right is False:
main.idle = True
if main.is_jumping:
v = 40-4*main.i
main.player.y -= v
main.i += 1
if main.player.y == main.player.ground: #or main.player.y = main.player.object:
main.is_jumping = False
main.i = 1
main.player.x += main.player.vel
print(main.player.x)
if main.player.x > main.stage.width - 70: main.player.x = main.stage.width - 70
if main.player.x < 10: main.player.x = 10
if main.player.x < main.stage.start_scroll: main.player.x2 = main.player.x
elif main.player.x > main.stage.stop_scroll: main.stage.x2 = main.player.x - main.stage.width + W
else:
main.player.x2 = main.stage.start_scroll
main.stage.x += -main.player.vel
rel_x = main.stage.x % main.bg_width
screen.blit(main.background2,(rel_x - main.bg_width,0))
if rel_x < W:
screen.blit(main.background2,(rel_x,0))
main.draw()
pygame.display.update()
clock.tick(FPS)
if __name__ == "__main__":
main()
这是滚动背景的部分
if main.player.x > main.stage.width - 70: main.player.x = main.stage.width - 70
if main.player.x < 10: main.player.x = 10
if main.player.x < main.stage.start_scroll: main.player.x2 = main.player.x
elif main.player.x > main.stage.stop_scroll: main.stage.x2 = main.player.x - main.stage.width + W
else:
main.player.x2 = main.stage.start_scroll
main.stage.x += -main.player.vel
rel_x = main.stage.x % main.bg_width
screen.blit(main.background2,0))
我的问题: 什么可能导致角色随机卡住? 还要澄清一下:当角色卡住时,通常是暂时的。
提前致谢!
解决方法
我自己弄明白了:我在 elif 语句中放置了 main.stage.x2 而不是 main.player.x2,以及在移动处理部分中缺少一些 if 语句。
这与前面的代码一起作为主函数:
def main():
true = True
main = Main()
while true:
for event in pygame.event.get():
if event.type == pygame.QUIT:
true = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_d:
main.move_right = True
main.move_left = False
main.idle = False
main.player.vel = 12
if event.key == pygame.K_a:
main.move_left = True
main.move_right = False
main.idle = False
main.player.vel = -12
if event.key == pygame.K_w or event.key == pygame.K_SPACE: # https://stackoverflow.com/questions/20940852/calculate-gravity-jump-in-pygame
main.is_jumping = True
elif event.type == pygame.KEYUP:
if event.key == pygame.K_d:
main.move_right = False
if main.move_left:
pass
else:
main.player.vel = 0
if event.key == pygame.K_a:
main.move_left = False
if main.move_right:
pass
else:
main.player.vel = 0
if main.move_left is False and main.move_right is False:
main.idle = True
main.player.vel = 0
if main.is_jumping:
v = 40 - 4 * main.i
main.player.y -= v
main.i += 1
print(v)
if main.player.y == main.player.ground: # or main.player.y = main.player.object:
main.is_jumping = False
main.i = 1
if main.move_right or main.move_left:
main.player.x += main.player.vel
print(main.player.x)
if main.player.x > main.stage.width - 70: main.player.x = main.stage.width - 70
if main.player.x < 10: main.player.x = 10
if main.player.x < main.stage.start_scroll: main.player.x2 = main.player.x
elif main.player.x > main.stage.stop_scroll: main.player.x2 = main.player.x - main.stage.width + W
else:
main.player.x2 = main.stage.start_scroll
main.stage.x += -main.player.vel
rel_x = main.stage.x % main.bg_width
screen.blit(main.background,(rel_x - main.bg_width,0))
if rel_x < W:
screen.blit(main.background,(rel_x,0))
main.draw()
pygame.display.update()
clock.tick(FPS)
if __name__ == "__main__":
main()