如何在点击时添加碰撞矩形? (python& pygame)

时间:2014-04-27 10:34:36

标签: python pygame gravity

任何人都可以告诉我如何在任何地方添加一个矩形,然后让球从它上面反弹,例如当我点击屏幕上的某处时,它会在该坐标处放置一个矩形,当它们使球与它碰撞时会反弹。

另外,我是他们制作HD的方法吗?

import sys
import pygame
import os


image_file = os.path.expanduser("ball.png")

delta = {
    pygame.K_LEFT: (-20, 0),
    pygame.K_RIGHT: (+20, 0),
    pygame.K_UP: (0, -20),
    pygame.K_DOWN: (0, +20),  
    }

gravity = +1

class Ball(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self) 
        self.image = pygame.image.load(image_file)
        self.rect = self.image.get_rect()
        self.speed = [0, 0]
        area = pygame.display.get_surface().get_rect()
        self.width, self.height = area.width, area.height

    def update(self):
        self.rect = self.rect.move(self.speed)
        if self.rect.left < 0 or self.rect.right > self.width:
            self.speed[0] = -self.speed[0]
        if self.rect.top < 0 or self.rect.bottom > self.height:
            self.speed[1] = -self.speed[1]
        self.rect.left = clip(self.rect.left, 0, self.width)
        self.rect.right = clip(self.rect.right, 0, self.width)        
        self.rect.top = clip(self.rect.top, 0, self.height)
        self.rect.bottom = clip(self.rect.bottom, 0, self.height)                

def clip(val, minval, maxval):
    return min(max(val, minval), maxval)

class Main(object):
    def __init__(self):
        self.setup()
    def setup(self):
        pygame.init()
        size = (self.width, self.height) = (640,360)
        self.screen = pygame.display.set_mode((1000,1000),pygame.FULLSCREEN)
        self.ball = Ball()
        self.setup_background()
    def setup_background(self):
        self.background = pygame.Surface(self.screen.get_size())
        self.background = self.background.convert()
        self.background.fill((0, 0, 0))
        self.screen.blit(self.background, (0, 0))
        pygame.display.flip()
    def draw(self):
        self.screen.blit(self.background, (0, 0))
        self.screen.blit(self.ball.image, self.ball.rect)
        pygame.display.flip()
    def event_loop(self):
        ball = self.ball
        friction = 1
        while True:
            for event in pygame.event.get():
                if ((event.type == pygame.QUIT) or 
                    (event.type == pygame.KEYDOWN and 
                     event.key == pygame.K_ESCAPE)):
                    sys.exit()
                elif event.type == pygame.KEYDOWN:
                    deltax, deltay = delta.get(event.key, (0, 0))
                    ball.speed[0] += deltax
                    ball.speed[1] += deltay
                    friction = 1
                elif event.type == pygame.KEYUP:
                    friction = 0.99

            ball.speed = [friction*s for s in ball.speed]
            ball.speed[1] += gravity
            ball.update()
            self.draw()
            pygame.time.delay(10)

if __name__ == '__main__':
    app = Main()
    app.event_loop()

1 个答案:

答案 0 :(得分:0)

您必须能够执行以下几个步骤:

  1. 检测鼠标何时从未按下状态变为按下状态。

    如果发生这种情况:

  2. 将Rectange对象添加到列表中(由x,y,width和height组成)。

    在每个循环中:

  3. 对于列表中的每个Rectange:检查它是否与球相交。您可以将球建模为矩形,稍微容易一些,或者作为圆形。如果矩形的一角在其内部,或者如果中心位于矩形的下方/上方/下方并且小于其半径,则圆形接触矩形。 (用图片解释起来比较容易。)
  4. 如果球发生碰撞:改变速度,就像碰到屏幕一角一样。
  5. 关于其中一个步骤,您还有其他问题吗?

    &#34;另外,我是他们制作HD的方式吗?&#34;

    • 我能够将分辨率更改为 1600 x 900 。每张显卡只支持一定的全屏分辨率,1000x1000不适用于我的。