当前位置: 首页 > 知识库问答 >
问题:

为什么在调用更新时球不移动(pygame-Pong)?

沃念
2023-03-14

调用球时。update()我原以为球会移动,但它没有移动。

我在想,也许将bpos定义为rect对象并将其传递给椭圆以将球绘制到屏幕上有问题。

bpos=pyplay。Rect(screen_width/2-15,screen_height/2 - 15, 30, 30)

我将bpos设置为rect对象,然后将其传递为绘制椭圆的原因:

class Ball:
   def __init__(self):
    self.x = screen_width // 2
    self.y = screen_height // 2
    self.speed = 5
    self.vx = self.speed
    self.vy = self.speed


    def draw(self, screen):
        pygame.draw.ellipse(screen, light_grey, bpos)

    def update(self):
        self.x += self.vx
        self.y += self.vy

这是因为最终,如果可能的话,当需要将球保持在边界内时,我希望在更新方法中使用pygame Rect属性(上、下、左、右)。

 def update(self):
            self.x += self.vx
            self.y += self.vy
**if self.top <= 0 or self.bottom >= screen_height:
        self.vy *= -1
    if ball.left <= 0 or self.right >= screen_width:
        self.vx *= -1**

But the ball isnt moving.

在游戏逻辑中,你可以看到我在打电话:

ball.draw(屏幕)ball.update()

如果您能提供一些意见,我将不胜感激。谢谢下面是我的代码。

    import pygame, sys


    class Paddle:
        def __init__(self):
            self.rect = pygame.Rect(10, screen_height / 2 - 70, 10, 140)

        def draw(self, screen):
            pygame.draw.rect(screen, light_grey, self.rect)


    class Ball:
        def __init__(self):
            self.x = screen_width // 2
            self.y = screen_height // 2
            self.speed = 5
            self.vx = self.speed
            self.vy = self.speed


        def draw(self, screen):
            pygame.draw.ellipse(screen, light_grey, bpos)

        def update(self):
            self.x += self.vx
            self.y += self.vy


    # General setup
    pygame.init()
    clock = pygame.time.Clock()

    # Main Window
    screen_width = 1280
    screen_height = 960

    screen = pygame.display.set_mode((screen_width, screen_height))
    pygame.display.set_caption('Pong')

    # Colors
    light_grey = (200, 200, 200)
    bg_color = pygame.Color('grey12')

    # Game Rectangles
    ball = Ball()
    bpos = pygame.Rect(screen_width / 2 - 15, screen_height / 2 - 15, 30, 30)
    left_paddle = Paddle()
    right_paddle = Paddle()
    right_paddle.rect.x = screen_width - right_paddle.rect.width

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()

        # Game logic

        screen.fill(bg_color)
        ball.draw(screen)
        left_paddle.draw(screen)
        right_paddle.draw(screen)
        ball.update()

        pygame.display.flip()
        clock.tick(60)

共有1个答案

谭京
2023-03-14

问题不在于您正在使用rect forbposper say。问题是您没有更新bpos。

用于绘制椭圆的矩形需要在球中更新。更新()。你更新自我。x、 但不是你用来拉球的东西。

但是,您使用的rect应该是Ball实例的属性,而不是外部变量。您应该在init中初始化它并使用self。矩形。x和赛尔夫。矩形。y以更新和跟踪球的位置。不要将两个位置都保持在一个自我位置。矩形。x、 还有自我。矩形。在一个自我中是独立的。x、 自我。y、 这只会导致冗余和可能的不一致性和错误。

我建议这些改变。

更改此项:

# Game Rectangles
ball = Ball()
bpos = pygame.Rect(screen_width / 2 - 15, screen_height / 2 - 15, 30, 30)

对这样的事情:

# Game Rectangles
ball = Ball(screen_width / 2 - 15, screen_height / 2 - 15, 30, 30)

这是:

class Ball:
    def __init__(self):
        self.x = screen_width // 2
        self.y = screen_height // 2
        self.speed = 5
        self.vx = self.speed
        self.vy = self.speed


    def draw(self, screen):
        pygame.draw.ellipse(screen, light_grey, bpos)

    def update(self):
        self.x += self.vx
        self.y += self.vy

对这样的事情:

class Ball:
    def __init__(self, x, y, width, height):
        self.rect = pygame.Rect(x, y, width, height))
        self.speed = 5
        self.vx = self.speed
        self.vy = self.speed


    def draw(self, screen):
        pygame.draw.ellipse(screen, light_grey, self.rect)

    def update(self):
        self.rect.x += self.vx
        self.rect.y += self.vy
 类似资料:
  • 我试着玩pyplay,我可以在屏幕上画一个精灵的形象。我试图通过改变x和y变量来移动WASD中的精灵。 当我运行程序时,精灵会绘制,但当我按正确的键时不会移动。 编辑:我添加了一个更新方法,moveY参数说它不在那里,尽管它显然在那里,为什么? 这是代码:

  • 与其他包管理器(如)相比,我发现当更新与给定项目相关的包时,有一种奇怪的行为。 还根据留档,和选项 根据composer.json将依赖项升级到最新版本,并更新composer.lock文件。 事实上,正确地更新了新的包版本号。但是没有被修改,并且列出了旧的版本过低的包。 为什么会发生这种情况?是我做错了什么,还是这就是应该怎么做的?如果是这样的话,为什么两个文件中的一个是最新的,而另一个不是最新

  • 问题内容: 所以我运行代码,它就开始不正常了。我不熟悉pygame。 代码如下: 这张图片并不是我不能发布视频的那个,但它确实是我的代码的作用 问题答案: 问题是由多次调用 . 在应用程序循环结束时更新显示就足够了。 多次调用or原因 忽隐忽现。 删除对的所有呼叫从你的代码,但调用一次 在应用程序循环结束时: 如果在之后更新显示,将显示在短时间内填充了背景色。然后玩家被抽中 ()显示时,播放器位于

  • 我正在使用Hibernate Envers来审核我的日志表,它是使用Spring配置的。但是,在执行更新、修改或删除操作时,不会发生审核。以下是配置。 Spring配置 我已经将@Audited注释添加到实体类中。我使用的是Hibernate core 3.5.0-Final和envers的相同版本。 当我检查hibernate记录的SQL时,我可以看到更新查询已经执行,但没有任何将数据插入审计表

  • 我是java新手,所以请不要后悔java中的对象和东西正在传递引用的值,但下面是我试图传递对象的代码。当我通过传递到函数中更新值时,a的值没有改变。发生了什么请帮助我。。。

  • 我有一个问题的角色移动pyplay。我想做的是能够按住钥匙,让精灵移动。但是,我必须继续敲击键让精灵移动。任何帮助将不胜感激!这是我的代码: 谢谢