pygame反彈小球事件USEREVENT練習.py,作者:李興球
"""pygame小球事件練習.py, 新建Ball類,給它加image屬性,rect屬性,設它的透明色為黑色,新建xspeed和yspeed屬性,值為隨機數。新建反彈bounce方法,到了邊緣就會反向移動。新建update方法,讓球移動後重畫。主程式中新建兩個事件USEREVENT,讓它們自動定時發生,一個是定時生成事件,一個是定時消除事件。小球生成後加入到group,以便同時操作它們。作者:李興球,風火輪少兒程式設計
import pygame
from pygame.locals import *
from random import randint,choice
class Ball(pygame.sprite.Sprite):
def __init__(self,radius,x,y,screen):
pygame.sprite.Sprite.__init__(self)
self.radius = radius
self.screen_width = screen.get_width()
self.screen_height = screen.get_height()
self.image = pygame.Surface((radius * 2,radius * 2 ))
self.rect = self.image.get_rect()
self.rect.centerx = x
self.rect.centery = y
pygame.draw.circle(self.image,(255,0,0),(radius,radius),radius)
self.image.set_colorkey((0,0,0))
self.xspeed = randint(-5,5)
self.yspeed = randint(-5,5)
def bounce(self):
if self.rect.right >= self.screen_width or self.rect.left<=0:self.xspeed = -self.xspeed
if self.rect.bottom >= self.screen_height or self.rect.top<=0:self.yspeed = -self.yspeed
def update(self):
self.rect.move_ip(self.xspeed,self.yspeed) #移動
self.bounce() #碰到邊緣就反彈
screen.blit(self.image,self.rect) #重畫
if __name__ == "__main__":
width,height = 800,600
screen = pygame.display.set_mode((width,height))
pygame.display.set_caption("測試練習")
group = pygame.sprite.Group()
ball1 = Ball(20,width//2,height//2,screen)
ball2 = Ball(20,width//2,height//2,screen)
group.add(ball1)
group.add(ball2)
produceball = USEREVENT + 1
deleteball = USEREVENT + 2
pygame.time.set_timer(produceball,1000)
pygame.time.set_timer(deleteball,1000)
clock = pygame.time.Clock()
running = True
while running:
clock.tick(60)
for event in pygame.event.get():
if event.type == QUIT : running = False
if event.type == produceball : group.add( Ball(20,width//2,height//2,screen))
if event.type == deleteball : choice(list(group)).remove(group) #從group中隨機選擇一個球,移除它.
screen.fill((0,255,255))
group.update()
pygame.display.update()
pygame.quit()