【问题标题】:OOP Pygame platform game: controlling and moving a square on a screenOOP Pygame 平台游戏:控制和移动屏幕上的方块
【发布时间】:2020-07-11 14:20:11
【问题描述】:
import pygame
import random
import math
import sys

screenWidth = 1200
screenHeight = 600

class Hero:
    def __init__(self, pos):
        self.pos = pos
        self.width = 30
        self.height = 30
        self.color = (0, 0, 0)
        self.dirX = 0
        self.dirY = 0

    def move(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()

            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_RIGHT:
                    self.dirX = 1
                elif event.key == pygame.K_LEFT:
                    self.dirX = -1

    def draw(self, display):
        x = self.pos[0]
        y = self.pos[1]
        pygame.draw.rect(display, self.color, (x + self.dirX, y + self.dirY, self.width, self.height))
        print(self.pos, self.dirX, self.dirY)
    
    def jump(self):
        pass


    def die(self):
        pass


class Enemy:
    pass

class Background:
    pass

class Obstacles:
    pass

class Camera:
    pass

def score():
    pass

def create(w, h):
    display = pygame.display.set_mode((w, h))
    display.fill((255, 255, 255))
    #create background
    #create Obstacles
    #create Hero
    heroOne = Hero([150, 450])
    heroOne.move()
    heroOne.draw(display)
    #create Enemy
    pygame.display.update()

def main():
    pygame.init()

    clock = pygame.time.Clock()

    running = True
    while running:

        clock.tick(300)

        create(screenWidth, screenHeight)

main()

您好,我正在使用 Pygame 制作一个 OOP 游戏,其中一个方块将由用户控制并沿着地板移动,跳过障碍物和其他敌方方块。

我希望它的工作方式: 当我按下 K_LEFT 时,dirX = 1 将添加到pos 的 x 坐标,因此正方形的 x 位置将被更新,正方形将开始向右滑动。当我按下dir = -1时,方块会向左移动。

它的工作方式: 没有

我认为问题在于主立方体的pos 似乎没有更新,而dirX0 更新到1 并返回到0

我猜想改变__init__()函数下的变量值是我正在做的,或者可能是完全错误的。

这是让我的代码按照我尝试的方式工作的任何方式,还是完全错误的方式,还有其他方式?

我正在学习 OOP 和 python,任何关于最佳实践的额外建议或链接,与此代码相关,将不胜感激。

谢谢。

【问题讨论】:

    标签: python python-3.x oop pygame


    【解决方案1】:

    在您的 create 函数中,每次调用它时,您都会创建 Hero 的新实例。

    相反,在main 中初始化 heroOne,并将其作为参数传递,以便您可以使用它:

    def main():
        pygame.init()
        heroOne = Hero([150, 450])
        clock = pygame.time.Clock()
    
        running = True
        while running:
    
            clock.tick(30)
    
            create(screenWidth, screenHeight, heroOne)
    

    还在move方法中添加增量:

    self.dirX += 1
    

    和:

    self.dirX -= 1
    

    现在对象将在每次按键时移动by one

    如果你想要连续移动,你应该输入一些flag,例如如果是True +=1 和“假”-=1 并且按键将改变flag 状态。

    【讨论】:

      【解决方案2】:

      首先,您必须在主应用程序循环中调用 move

      def main():
          pygame.init()
          display = pygame.display.set_mode((screenWidth, screenHeight))
          clock = pygame.time.Clock()
      
          heroOne = Hero([150, 450])
          running = True
          while running:
              clock.tick(300)
      
              display.fill((255, 255, 255))
              heroOne.move()
              heroOne.draw(display)
              pygame.display.update()        
      

      您必须在每一帧中通过self.dirXself.dirY 更改播放器的位置:

      class Hero:
          # [...]
      
          def move(self):
              for event in pygame.event.get():
                  if event.type == pygame.QUIT:
                      pygame.quit()
                      sys.exit()
      
                  elif event.type == pygame.KEYDOWN:
                      if event.key == pygame.K_RIGHT:
                          self.dirX = 1
                      elif event.key == pygame.K_LEFT:
                          self.dirX = -1
      
              new_x = self.pos[0] + self.dirX
              new_y = self.pos[1] + self.dirY
              self.pos = [new_x , new_y]
      
          def draw(self, display):
              pygame.draw.rect(display, self.color, (*self.pos, self.width, self.height))
      

      如果你想移动矩形,只要按下一个键,那么我建议使用pygame.key.get_pressed而不是KEYDOWN事件:

      class Hero:
          # [...]
      
          def move(self):
              for event in pygame.event.get():
                  if event.type == pygame.QUIT:
                      pygame.quit()
                      sys.exit()
      
              keys = pygame.key.get_pressed()
              if keys[pygame.K_LEFT]:
                  self.pos[0] -= 1 
              if keys[pygame.K_RIGHT]:
                  self.pos[0] += 1
              if keys[pygame.K_UP]:
                  self.pos[1] -= 1 
              if keys[pygame.K_DOWN]:
                  self.pos[1] += 1
      

      完整代码:

      import pygame
      import random
      import math
      import sys
      
      screenWidth = 1200
      screenHeight = 600
      
      class Hero:
          def __init__(self, pos):
              self.pos = pos
              self.width = 30
              self.height = 30
              self.color = (0, 0, 0)
              self.dirX = 0
              self.dirY = 0
      
          def move(self, events):
              keys = pygame.key.get_pressed()
              if keys[pygame.K_LEFT]:
                  self.pos[0] -= 1 
              if keys[pygame.K_RIGHT]:
                  self.pos[0] += 1
              if keys[pygame.K_UP]:
                  self.pos[1] -= 1 
              if keys[pygame.K_DOWN]:
                  self.pos[1] += 1
      
          def draw(self, display):
              pygame.draw.rect(display, self.color, (*self.pos, self.width, self.height))
          
          def jump(self):
              pass
      
      
          def die(self):
              pass
      
      
      class Enemy:
          pass
      
      class Background:
          pass
      
      class Obstacles:
          pass
      
      class Camera:
          pass
      
      def score():
          pass
      
      
      def main():
          pygame.init()
          display = pygame.display.set_mode((screenWidth, screenHeight))
          clock = pygame.time.Clock()
      
          heroOne = Hero([150, 450])
          running = True
          while running:
              clock.tick(300)
              events = pygame.event.get()
              for event in events:
                  if event.type == pygame.QUIT:
                      pygame.quit()
                      sys.exit()
      
              heroOne.move(events)
      
              display.fill((255, 255, 255))
              heroOne.draw(display)
              pygame.display.update()   
      
      main()
      

      【讨论】:

      • 效果惊人!非常感谢!
      • @Mhf 谢谢。不客气。
      猜你喜欢
      • 1970-01-01
      • 2017-11-15
      • 1970-01-01
      • 2015-06-01
      • 1970-01-01
      • 2013-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多