《父与子的编程之旅-与小卡特一起学python》第18章
2015-08-05 11:25
513 查看
第18章:一种新的输入-事件
18.1事件
18.2键盘事件
18-01
18-02 按键事件
加入重复按键
18.3 鼠标事件
定时器事件
最终的PyPong代码:
18.1事件
18.2键盘事件
18-01
[code]# -*- coding:utf-8 -*- #__author__ = 'Janvn' # 2015/08/04 ''' 反弹球程序,加入动画精灵和Clock.tick() ''' import pygame,sys pygame.init() screen=pygame.display.set_mode([640,480]) background=pygame.Surface(screen.get_size()) background.fill([255,255,255]) clock=pygame.time.Clock() #定义一个时间对象 #Ball类,包括move()方法 class Ball(pygame.sprite.Sprite): def __init__(self,image_file,speed,location): pygame.sprite.Sprite.__init__(self) self.image=pygame.image.load(image_file) self.rect=self.image.get_rect() #得到图像边界的矩阵 self.rect.left,self.rect.top=location self.speed=speed def move(self): if self.rect.left<=screen.get_rect().left or \ self.rect.right>=screen.get_rect().right: self.speed[0]=-self.speed[0] newpos=self.rect.move(self.speed) self.rect=newpos my_ball=Ball('beach_ball.png',[10,0],[20,20]) #横向速度10,纵向速度0 running=True while running: for event in pygame.event.get(): if event.type==pygame.QUIT: running=False clock.tick(30) #计算时间(ms),参数30为最大帧率 screen.blit(background,(0,0)) my_ball.move() screen.blit(my_ball.image,my_ball.rect) pygame.display.flip() pygame.quit()
18-02 按键事件
[code]# -*- coding:utf-8 -*- #__author__ = 'Janvn' # 2015/08/04 ''' 反弹球程序,加入动画精灵和Clock.tick,增加按键事件 ''' import pygame,sys pygame.init() screen=pygame.display.set_mode([640,480]) background=pygame.Surface(screen.get_size()) background.fill([255,255,255]) clock=pygame.time.Clock() #定义一个时间对象 #Ball类,包括move()方法 class Ball(pygame.sprite.Sprite): def __init__(self,image_file,speed,location): pygame.sprite.Sprite.__init__(self) self.image=pygame.image.load(image_file) self.rect=self.image.get_rect() #得到图像边界的矩阵 self.rect.left,self.rect.top=location self.speed=speed def move(self): if self.rect.left<=screen.get_rect().left or \ self.rect.right>=screen.get_rect().right: self.speed[0]=-self.speed[0] newpos=self.rect.move(self.speed) self.rect=newpos my_ball=Ball('beach_ball.png',[10,0],[20,20]) #横向速度10,纵向速度0 running=True while running: for event in pygame.event.get(): if event.type==pygame.QUIT: running=False elif event.type==pygame.KEYDOWN: if event.key==pygame.K_UP: #按下向上键 my_ball.rect.top=my_ball.rect.top-10 #让球上移10个像素 elif event.key==pygame.K_DOWN: #按下向下键 my_ball.rect.top=my_ball.rect.top+10 clock.tick(30) #计算时间(ms),参数30为最大帧率 screen.blit(background,(0,0)) my_ball.move() screen.blit(my_ball.image,my_ball.rect) pygame.display.flip() pygame.quit()
加入重复按键
[code]# -*- coding:utf-8 -*- #__author__ = 'Janvn' # 2015/08/04 ''' 反弹球程序,加入动画精灵和Clock.tick,增加按键事件 ''' import pygame,sys pygame.init() screen=pygame.display.set_mode([640,480]) background=pygame.Surface(screen.get_size()) background.fill([255,255,255]) clock=pygame.time.Clock() #定义一个时间对象 #重复按键 delay=100 #开始重复之前等待多长时间 interval=50 #按键要以多快的速度重复 pygame.key.set_repeat(delay,interval) #Ball类,包括move()方法 class Ball(pygame.sprite.Sprite): def __init__(self,image_file,speed,location): pygame.sprite.Sprite.__init__(self) self.image=pygame.image.load(image_file) self.rect=self.image.get_rect() #得到图像边界的矩阵 self.rect.left,self.rect.top=location self.speed=speed def move(self): if self.rect.left<=screen.get_rect().left or \ self.rect.right>=screen.get_rect().right: self.speed[0]=-self.speed[0] newpos=self.rect.move(self.speed) self.rect=newpos my_ball=Ball('beach_ball.png',[10,0],[20,20]) #横向速度10,纵向速度0 running=True while running: for event in pygame.event.get(): if event.type==pygame.QUIT: running=False elif event.type==pygame.KEYDOWN: if event.key==pygame.K_UP: #按下向上键 my_ball.rect.top=my_ball.rect.top-10 #让球上移10个像素 elif event.key==pygame.K_DOWN: #按下向下键 my_ball.rect.top=my_ball.rect.top+10 clock.tick(30) #计算时间(ms),参数30为最大帧率 screen.blit(background,(0,0)) my_ball.move() screen.blit(my_ball.image,my_ball.rect) pygame.display.flip() pygame.quit()
18.3 鼠标事件
[code]# -*- coding:utf-8 -*- #__author__ = 'Janvn' # 2015/08/04 ''' 反弹球程序,加入动画精灵和Clock.tick,增加键盘事件 ''' import pygame,sys pygame.init() screen=pygame.display.set_mode([640,480]) background=pygame.Surface(screen.get_size()) background.fill([255,255,255]) clock=pygame.time.Clock() #定义一个时间对象 #重复按键 delay=100 #开始重复之前等待多长时间 interval=50 #按键要以多快的速度重复 pygame.key.set_repeat(delay,interval) held_down=False #Ball类,包括move()方法 class Ball(pygame.sprite.Sprite): def __init__(self,image_file,speed,location): pygame.sprite.Sprite.__init__(self) self.image=pygame.image.load(image_file) self.rect=self.image.get_rect() #得到图像边界的矩阵 self.rect.left,self.rect.top=location self.speed=speed def move(self): if self.rect.left<=screen.get_rect().left or \ self.rect.right>=screen.get_rect().right: self.speed[0]=-self.speed[0] newpos=self.rect.move(self.speed) self.rect=newpos my_ball=Ball('beach_ball.png',[10,0],[20,20]) #横向速度10,纵向速度0 running=True while running: for event in pygame.event.get(): if event.type==pygame.QUIT: running=False elif event.type==pygame.MOUSEBUTTONDOWN: held_down=True elif event.type==pygame.MOUSEBUTTONUP: held_down=False elif event.type==pygame.MOUSEMOTION: if held_down: my_ball.rect.center=event.pos #event.pos获取鼠标的位置(x,y) clock.tick(30) #计算时间(ms),参数30为最大帧率 screen.blit(background,(0,0)) my_ball.move() screen.blit(my_ball.image,my_ball.rect) pygame.display.flip() pygame.quit()
定时器事件
[code]# -*- coding:utf-8 -*- #__author__ = 'Janvn' # 2015/08/04 ''' 使用一个定时器事件让球上移和下移 ''' import pygame,sys pygame.init() screen=pygame.display.set_mode([640,480]) background=pygame.Surface(screen.get_size()) background.fill([255,255,255]) clock=pygame.time.Clock() #定义一个时间对象 #Ball类,包括move()方法 class Ball(pygame.sprite.Sprite): def __init__(self,image_file,speed,location): pygame.sprite.Sprite.__init__(self) self.image=pygame.image.load(image_file) self.rect=self.image.get_rect() #得到图像边界的矩阵 self.rect.left,self.rect.top=location self.speed=speed def move(self): if self.rect.left<=screen.get_rect().left or \ self.rect.right>=screen.get_rect().right: self.speed[0]=-self.speed[0] newpos=self.rect.move(self.speed) self.rect=newpos my_ball=Ball('beach_ball.png',[10,0],[20,20]) #横向速度10,纵向速度0 #创建一个定时器1000ms=1秒 pygame.time.set_timer(pygame.USEREVENT,1000) direction=1 running=True while running: for event in pygame.event.get(): if event.type==pygame.QUIT: running=False elif event.type==pygame.USEREVENT: my_ball.rect.centery=my_ball.rect.centery+(30*direction) if my_ball.rect.top<=0 or \ my_ball.rect.bottom>=screen.get_rect().bottom: direction=-direction clock.tick(30) #计算时间(ms),参数30为最大帧率 screen.blit(background,(0,0)) my_ball.move() screen.blit(my_ball.image,my_ball.rect) pygame.display.flip() pygame.quit()
最终的PyPong代码:
[code]# -*- coding:utf-8 -*- # Author:Janvn # 2015/08/04 ''' PyPong的第一个版本 ''' import pygame, sys from pygame.locals import * # Class defintion for the ball class MyBallClass(pygame.sprite.Sprite): def __init__(self, image_file, speed, location): pygame.sprite.Sprite.__init__(self) self.image = pygame.image.load(image_file) self.rect = self.image.get_rect() self.rect.left, self.rect.top = location self.speed = speed def move(self): global score,score_font,score_surf self.rect = self.rect.move(self.speed) # bounce off the sides of the window if self.rect.left < 0 or self.rect.right > screen.get_width(): self.speed[0] = -self.speed[0] # bounce off the top of the window if self.rect.top <= 0 : self.speed[1] = -self.speed[1] score=score+1 score_surf=score_font.render(str(score),1,(0,0,0)) # Class definition for the paddle class MyPaddleClass(pygame.sprite.Sprite): def __init__(self, location): pygame.sprite.Sprite.__init__(self) image_surface = pygame.surface.Surface([100, 20]) image_surface.fill([0,0,0]) self.image = image_surface.convert() self.rect = self.image.get_rect() self.rect.left, self.rect.top = location pygame.init() screen = pygame.display.set_mode([640,480]) clock = pygame.time.Clock() myBall = MyBallClass('wackyball.bmp', [10,5], [50, 50]) # make an instance of the ball ballGroup = pygame.sprite.Group(myBall) # add the ball to a sprite group paddle = MyPaddleClass([270, 400]) # make an instance of the paddle score=0 score_font=pygame.font.Font(None,50) score_surf=score_font.render(str(score),1,(0,0,0)) score_pos=[10,10] lives=3 done=False running = True #主程序 while running: clock.tick(30) screen.fill([255, 255, 255]) screen.blit(score_surf,score_pos) for i in range(lives): width=screen.get_rect().width screen.blit(myBall.image,[width-40*i,20]) for event in pygame.event.get(): if event.type == QUIT: running = False elif event.type == pygame.MOUSEMOTION: # move the paddle if the paddle.rect.centerx = event.pos[0] # mouse moves if pygame.sprite.spritecollide(paddle, ballGroup, False): # bounce the ball if it myBall.speed[1] = -myBall.speed[1] # hits the paddle myBall.move() if not done: screen.blit(myBall.image, myBall.rect) screen.blit(paddle.image, paddle.rect) screen.blit(score_surf,score_pos) for i in range(lives): width=screen.get_width() screen.blit(myBall.image,[width-40*i,20]) pygame.display.flip() if myBall.rect.top>=screen.get_rect().bottom: lives=lives-1 if lives == 0: final_text1 = "Game Over" final_text2 = "Your final score is: " + str(score) ft1_font = pygame.font.Font(None, 70) ft1_surf = ft1_font.render(final_text1, 1, (0, 0, 0)) ft2_font = pygame.font.Font(None, 50) ft2_surf = ft2_font.render(final_text2, 1, (0, 0, 0)) screen.blit(ft1_surf, [screen.get_width()/2 - \ ft1_surf.get_width()/2, 100]) screen.blit(ft2_surf, [screen.get_width()/2 - \ ft2_surf.get_width()/2, 200]) pygame.display.flip() done = True else: #wait 2 seconds, then start the next ball pygame.time.delay(2000) myBall.rect.topleft = [50, 50] pygame.quit()
相关文章推荐
- 从零开始学Python
- python中range和xrnage的区别
- 从零开始学Python
- 从零开始学Python
- 从零开始学Python
- python多线程编程(3): 使用互斥锁同步线程
- 从零开始学Python
- python socket的代码实例
- 怎样将utf-8格式的文件转换成gbk格式的文件
- Ubuntu系统下,Python的使用和idle的安装使用
- python 学习笔记 函数和类
- python小技巧之——in判断
- PYTHON开发入门与实战14-基于EXTJS的界面
- Python 使用requests时的编码问题
- python--参数列表的分拆
- Python开发入门与实战14-基于Extjs的界面
- python多线程编程(2): 线程的创建、启动、挂起和退出
- python 内置函数 : compile()
- python多线程编程(1): python对多线程的支持
- 浅谈Python web框架