第18章:一种新的输入-事件

18.1事件
18.2键盘事件
18-01

# -*- 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=locationself.speed=speeddef 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=newposmy_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=Falseclock.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 按键事件

# -*- 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=locationself.speed=speeddef 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=newposmy_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=Falseelif 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+10clock.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()

加入重复按键

# -*- 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=locationself.speed=speeddef 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=newposmy_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=Falseelif 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+10clock.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 鼠标事件

# -*- 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=locationself.speed=speeddef 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=newposmy_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=Falseelif event.type==pygame.MOUSEBUTTONDOWN:held_down=Trueelif event.type==pygame.MOUSEBUTTONUP:held_down=Falseelif 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()

定时器事件

# -*- 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=locationself.speed=speeddef 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=newposmy_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=Falseelif 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=-directionclock.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代码:

# -*- 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 = locationself.speed = speeddef move(self):global score,score_font,score_surfself.rect = self.rect.move(self.speed)# bounce off the sides of the windowif self.rect.left < 0 or self.rect.right > screen.get_width():self.speed[0] = -self.speed[0]# bounce off the top of the windowif self.rect.top <= 0 :self.speed[1] = -self.speed[1]score=score+1score_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 = locationpygame.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().widthscreen.blit(myBall.image,[width-40*i,20])for event in pygame.event.get():if event.type == QUIT:running = Falseelif event.type == pygame.MOUSEMOTION:     # move the paddle if thepaddle.rect.centerx = event.pos[0]     #   mouse movesif pygame.sprite.spritecollide(paddle, ballGroup, False):   # bounce the ball if itmyBall.speed[1] = -myBall.speed[1]                      #  hits the paddlemyBall.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-1if 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 = Trueelse:  #wait 2 seconds, then start the next ballpygame.time.delay(2000)myBall.rect.topleft = [50, 50]
pygame.quit()

《父与子的编程之旅-与小卡特一起学python》第18章相关推荐

  1. 父与子一起学python3,父与子的编程之旅 与小卡特一起学Python 第3版(全彩印刷)...

    章 出发吧 1 1.1 安装Python 1 1.2 从IDLE启动Python 2 1.3 来点指令吧 3 1.4 与Python交互 5 1.5 该编程了 7 1.6 运行你的个程序 9 1.7 ...

  2. python面对对象建立自己的电子宠物的编码_父与子的编程之旅:与小卡特一起学Python(第3版)(全彩印刷)...

    Python青少年编程启蒙畅销书全新升级! 上一版豆瓣评分8.5分,被众多老师.家长推荐! 左耳朵耗子.爱编程的魏校长.周自恒倾力推荐! 1.第3版的示例使用Python 3 而不是Python 2, ...

  3. #父与子的编程之旅#第八章

    新年第一篇,新年快乐!不废话,直接入正题! <父与子的编程之旅与小卡特一起学python>这本书真的比较通俗易懂好上手,是编程小白的最佳选择!(编者看到记得给我广告费) 第八章主要讲循环. ...

  4. 父与子的编程之旅 python 3 pdf_《父与子的编程之旅》嵌套循环例题解析

    <父与子的编程之旅>,11.4可变嵌套循环的问题解答. numBlocks 书里是Python2.X,我的是Python3.X,原理没有差别. 分析如下: 0.手动输入input 当 in ...

  5. 父与子的编程之旅--easygui无法使用

    阅读<父与子的编程之旅>根据书中内容在www.helloworldbook2.com中下载了Python2.7,书中说使用本书的安装程序便安装上了Easygui,但是在IDLE中执行imp ...

  6. 父与子的编程之旅:与小卡特一起学Python.pdf

    下载地址:网盘下载 编辑推荐 编程是一项充满乐趣的挑战,想要上手也非常容易!这本<父与子的编程之旅:与小卡特一起学Python>中,Warren和Carter父子以亲切的笔调.通俗的语言, ...

  7. 与小卡特一起学python 豆瓣_《父与子的编程之旅:与小卡特一起学Python》

    原标题:<父与子的编程之旅:与小卡特一起学Python> 内容简介 本书是一本家长与孩子共同学习编程的入门书.作者是一对父子,他们以Python语言为例,详尽细致地介绍了Python如何安 ...

  8. 父与子python 百度云_《父与子的编程之旅:与小卡特一起学Python第2版》pdf电子书百度网盘下载地址...

    内容简介: 本书是一本家长与孩子共同学习编程的入门书.作者是一对父子,他们以Python语言为例,详尽细致地介绍了Python如何安装.字符串和操作符等程序设计的基本概念,介绍了条件语句.函数.模块等 ...

  9. 与小卡特一起学python 豆瓣_父与子的编程之旅:与小卡特一起学Python

    第1章 出发吧 1.1 安装Python 1.2 从IDLE启动Python 1.3 来点指令吧 1.4 与Python交互 1.5 该编程了 1.6 运行你的第一个程序 1.7 如果出问题 1.8 ...

最新文章

  1. 散列表(也叫哈希表),
  2. ubuntu etc目录下配置文件profile和profile.d的区别?(文件解析)
  3. php创建分页类,一个最强的PHP通用分页类
  4. linux驱动层获取当前的系统时间
  5. Keil(MDK-ARM-STM32)系列教程(三)工程目标选项配置(Ⅰ)
  6. java判断线段是否相交函数_判断线段是否相交… | 学步园
  7. c+调用java编写mq_C语言实现mq收发数据的函数
  8. [渝粤教育] 西南科技大学 现代汉语 在线考试复习资料
  9. 全触摸模式,让你尽享ipad 开发出的精品
  10. android 免root自动滑动,无需root自动点击屏幕软件
  11. PostgreSQL 数据库跨版本升级常用方案
  12. 五年级春期计算机教案,五年级下册信息技术教案
  13. CSFB和SRVCC
  14. 程序员的app软件开发经验
  15. BZOJ1135: [POI2009]Lyz
  16. 【论文翻译】DANN的改进ADDA Multimodal Vigilance Estimation with Adversarial Domain Adaptation Networks
  17. 局域网和广域网的WOL设置心得,共享给大家-组装NAS及黑群晖-奇珀网
  18. win10关闭快速启动_win10系统快速启动的坏处
  19. 40原一脸嫌弃C96画册_柳岩去相亲,男嘉宾却让郑爽嫌弃摇头,耿直言行有点不礼貌...
  20. MongoDB安装过程中出现service MongoDB failed to start,verify that you have sufficient privileges to start...

热门文章

  1. u-boot-2012.04.01移植到TQ2440(八):支持烧写yaffs文件系统
  2. java程序员自我简介及简历
  3. Android SDK (介绍)
  4. H5托盘通知(带声音提醒)
  5. bootstarp页脚代码
  6. [收藏]一些电平转换方法
  7. JAVA中JVM的重排序详细介绍(写得很明白)
  8. 认知决定你的格局和财富差距
  9. 工业4.0:换热站最酷设计—— Web SCADA 工业组态软件界面
  10. SSL证书概述与配置