2014-04-27 50 views
0

任何人都可以告訴我如何添加一個矩形無論我點擊某處,並使球反彈,例如當我點擊屏幕上的某個地方時,它會在該座標處放置一個矩形,並且當它們使球碰撞時球會反彈。如何在點擊時添加碰撞矩形? (python&pygame)

我也是他們製作高清的方法嗎?

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() 
+0

Eh? _「是他們製作HD的一種方式」_? –

回答

0

你必須要能夠執行以下幾個步驟:

  1. 檢測當鼠標改變從未按到按下狀態。

    如果出現這種情況:

  2. 添加Rectange對象的列表(由X,Y,寬度和高度的)。

    在每一個循環:

  3. 對於每個Rectange在列表中:檢查是否有球相交。您可以將球模型化爲矩形,稍微簡單一點,或者作爲一個圓圈。如果矩形的一個角在其內部,或者如果中心在矩形的下方/上方/下方並且小於其半徑,則圓會觸及矩形。 (更容易用圖片來解釋。)
  4. 如果球碰撞:改變速度,就好像它碰到了屏幕的角落。

對於其中某個步驟,您是否還有其他問題?

「我也是他們製作HD的方法嗎?」

  • 我能夠將分辨率更改爲1600 x 900。每個圖形卡只支持一定的全屏分辨率,而1000x1000不適用於我的。