首页 > 解决方案 > Pygame 移动问题

问题描述

当我在 python pygame 中使用移动代码时,它不会在我运行时加载代码。

#right to repestic creatovrs



import pygame, random, time, sys, pyscroll, pytmx
from Bruh import *
from pygame.locals import *
from pytmx.util_pygame import load_pygame

pygame.init()
width, height = 800, 600
backgroundColor = 255,  0,  0
screen = pygame.display.set_mode((width, height))

blue = (0, 0, 255)
darkblue = (20, 20, 70)
white = (255, 255, 255)
lightwhite = (170, 170, 170)
skin = (236, 188, 180)
floorcolor = (229,164,14)
sun = (250,255,63) 


#the four numbers go x axis, y axis, width, and then height
def drawLevel1(window):
  img = pygame.image.load("Overlay.png")
  window.blit(img, (0, 0))
def drawLevel2(window):
  img2 = pygame.image.load("Overlay2.png")
  window.blit(img, (0, 0))     

pygame.key.set_repeat(100,100)

Character = Bruh(35, 367)

Bruh.draw(Character, screen)

drawLevel1(screen)
'''
while True:
      for event in pygame.event.get():
          if event.type==QUIT or (event.type==KEYUP and event.key==K_ESCAPE):
            pygame.quit()
            sys.exit()
          elif event.type==KEYDOWN:

            if event.key==K_DOWN: 
                Character.moveUp()

            elif event.key==K_UP:
                Character.moveDown()

            elif event.key==K_LEFT:
                Character.moveLeft()

            elif event.key==K_RIGHT:
                Character.moveRight()

for event in pygame.event.get():
  if event.type==QUIT or (event.type==KEYUP and event.key==K_ESCAPE):
    pygame.quit()
    sys.exit()
  if event.key==K_DOWN:
    Character.moveUp()
  if event.key==K_UP:
    Character.moveDown()
  if event.key==K_LEFT:
    Character.moveLeft()
  if event.key==K_RIGHT:
    Character.moveRight
either of these won't work for some reason. it just wont load the game once these are placed in the code
'''
pygame.display.update()

while (True):
    for event in pygame.event.get() :
         if ( event.type == pygame.QUIT or (event.type==pygame.KEYDOWN and event.key==pygame.K_ESCAPE)):
              pygame.quit(); 
              sys.exit();

以及来自 bruh.py 的代码:

import pygame
from pygame.locals import *

class Bruh:
    def __init__(self, newX, newY):
        self.x = newX
        self.y = newY
        self.img = pygame.image.load("Bruh.png")
    def draw(self, window):
        window.blit(self.img, (self.x,self.y))
    def moveLeft(self):
        self.x = self.x - 5
    def moveRight(self):
      self.x = self.x + 5
    def moveUp(self):
        self.y = self.y + 5
    def moveDown(self):
        self.y = self.y - 5
    def getRec(self):
        myRec = self.img.get_rect()
        return (self.x, self.y, myRec[2], myRec[3])      

这些都是 .py 文件,它们一定会引起一些问题。我没有收到任何错误消息,只是在我按运行时不会加载。我不知道为什么。如果有人有帮助那就太好了

标签: pythonpygame

解决方案


我认为 pygame 没有你想象的那么聪明。在您的while循环中,您正在移动您的角色,但是当您“移动”该角色时您所做的只是更新该对象上的数字。您没有告诉 pygame 有任何变化,也没有重新绘制屏幕。知道自己做这件事还不够聪明。有些框架会跟踪您的值并尝试更新显示以与它们保持同步(主要用于 Web 开发),但这不是 pygame 的工作方式。

相反,实时视频游戏通常遵循以下模式:

while running:
    handle_events()  # check which keys have been pressed
    loop()           # handle, physics, AI, logic, etc
    render()         # re-draw a new version of the screen based on the new state of the world

有关更多信息,请参阅本教程

在您的情况下,这可能看起来像:

pygame.key.set_repeat(100, 100)
character = Bruh(35, 367)

while True:
    for event in pygame.event.get():
        if event.type == QUIT or (event.type == KEYUP and event.key == K_ESCAPE):
            pygame.quit()
            sys.exit()
        elif event.type == KEYDOWN:
            if event.key == K_DOWN:
                character.moveUp()
            elif event.key == K_UP:
                character.moveDown()
            elif event.key == K_LEFT:
                character.moveLeft()
            elif event.key == K_RIGHT:
                character.moveRight()

    screen.fill((0, 0, 0))
    drawLevel1(screen)
    character.draw(screen)

    pygame.display.update()

但实际上,这并不是做事的好方法。该行意味着您每 100 毫秒(10 次/秒)pygame.key.set_repeat(100, 100)只会收到一个事件。KEYDOWN但是,while循环将运行更多次。这意味着您的角色移动只会以 10FPS 发生,但您将消耗资源以更快地运行游戏。

相反,我会做这样的事情:

# make a clock to help us run at a consistent framerate
clock = pygame.time.Clock()

# a dictionary to help us keep track of which keys are currently held down
keys_down = {
    K_DOWN: False,
    K_UP: False,
    K_LEFT: False,
    K_RIGHT: False,
}

while True:
    for event in pygame.event.get():
        if event.type == QUIT or (event.type == KEYUP and event.key == K_ESCAPE):
            pygame.quit()
            sys.exit()
        elif event.type == KEYDOWN:
            # when the user presses a key, we keep track of the fact
            # that that key is down until they release it
            if event.key in keys_down:
                keys_down[event.key] = True
        elif event.type == KEYUP:
            # when the user releases a key, it's not down anymore
            if event.key in keys_down:
                keys_down[event.key] = False

    # This code will run *every loop*, regardless of
    # whether the user has pressed or released a key recently
    if keys_down[K_DOWN]:
        character.moveDown()
    if keys_down[K_UP]:
        character.moveUp()
    if keys_down[K_LEFT]:
        character.moveLeft()
    if keys_down[K_RIGHT]:
        character.moveRight()

    # Then, clear the screen and re-draw everything in the scene
    screen.fill((0, 0, 0))
    # drawLevel1(screen)
    character.draw(screen)
    pygame.display.update()

    # clock.tick gets the number of `ticks` (milliseconds) since the
    # last time it was called. If you specify a number like tick(30),
    # then it will also wait an amount of time equal to 30 minus that
    # number. Effectively it will limit you to 30fps.
    clock.tick(30)

实际上,即使这样也不理想。确实,您应该尽可能快地运行并更新游戏逻辑以考虑帧速率(即,如果您获得较少的 fps,则每帧移动得更远)这样即使您的帧速率下降,您的角色也始终以一致的速度移动. 更好的是,让你的逻辑和渲染异步运行。不过,这涉及到一些高级的东西。


编辑:

正如@Kingsley 指出的那样,pygame 内置了这个功能。上面的例子可以简化如下:

import pygame
from pygame.locals import *

clock = pygame.time.Clock()

while True:
    for event in pygame.event.get():
        if event.type == QUIT or (event.type == KEYUP and event.key == K_ESCAPE):
            pygame.quit()
            sys.exit()

    # This line handles all the KEYUP and KEYDOWN events
    # instead of doing it manually
    keys_down =  pygame.key.get_pressed()

    if keys_down[K_DOWN]:
        character.moveDown()
    if keys_down[K_UP]:
        character.moveUp()
    if keys_down[K_LEFT]:
        character.moveLeft()
    if keys_down[K_RIGHT]:
        character.moveRight()

    screen.fill((0, 0, 0))
    drawLevel1(screen)
    character.draw(screen)
    pygame.display.update()

    clock.tick(30)

推荐阅读