Python游戏编程入门3
用户输入:Bomb Catcher游戏
本章介绍使用键盘和鼠标获得用户输入。包括如下主题:
学习pygame事件
学习实时循环
学习键盘和鼠标事件
学习轮询键盘和鼠标的状态
编写Bomb Catcher游戏
1本章所涉及pygame事件
QUIT
KEYDOWN
KEYUP
MOUSEMOTION
MOUSEBUTTONUP
MOUSEBUTTONDOWN
1.1实时事件循环
while True:
for event in pygame.event.get():
if event.type==QUIT:
sys.exit()
在循环中不断地对事件队列中的特定事件进行相应的处理。
1.2键盘事件
KEYUP KEYDOWN
1.3鼠标事件
MOUSEBUTTONDOWN MOUSEBUTTONUP MOUSEMOTION
具体属性见《pygame几个重要模块》
2设备轮询
pygame中的事件系统并非我们可以用来检测用户输入的唯一方法。我们可以轮询输入设备,看看用户是否与我们的
程序交互。
2.1轮询键盘
在pygame中,使用pygame.key.get_pressed()来轮询键盘接口。该方法返回布尔值的一个列表,对应于键盘
上的按键,每个键一个标志。使用相同的键常量值来索引布尔值数组。一次轮询所有的键的好处是不必遍历事件
系统就可以检测多个键的按下。
以下示例检测escape键。
keys=pygame.key.get_pressed()
if keys[K_ESCAPE]:
sys.exit()
2.2轮询鼠标
pygame.mouse.get_pos()
pygame.mouse.get_rel()
pygame.mouse.get_pressed()
具体使用参考《pygame几个重要模块》
import sys,pygame
from pygame.locals import *
pygame.init()
def print_text(font,x,y,text,color=(255,255,255)):
imgtext=font.render(text,True,color)
screen.blit(imgtext,(x,y))
#main program begins
screen=pygame.display.set_mode((600,500))
pygame.display.set_caption("Mouse Demo")
font1=pygame.font.Font(None,24)
white=255,255,255
mouse_x=mouse_y=0
move_x=move_y=0
mouse_down=mouse_up=0
mouse_down_x=mouse_down_y=0
mouse_up_x=mouse_up_y=0
#repeating loop
while True:
for event in pygame.event.get():
if event.type==QUIT:
sys.exit()
elif event.type==MOUSEMOTION:
mouse_x,mouse_y=event.pos
move_x,move_y=event.rel
elif event.type==MOUSEBUTTONDOWN:
mouse_down=event.button
mouse_down_x,mouse_down_y=event.pos
elif event.type==MOUSEBUTTONUP:
mouse_up=event.button
mouse_up_x,mouse_up_y=event.pos
keys=pygame.key.get_pressed()
if keys[K_ESCAPE]:
sys.exit()
screen.fill((0,100,0))
print_text(font1,0,0,"Mouse Events")
print_text(font1,0,20,"Mouse position: "+str(mouse_x)+","+str(mouse_y))
print_text(font1,0,40,"Mouse relative: "+str(move_x)+","+str(move_y))
print_text(font1,0,60,"Mouse button down: "+str(mouse_down)+" at "+str(mouse_down_x)+","+str(mouse_down_y))
print_text(font1,0,80,"Mouse button up: "+str(mouse_up)+" at "+str(mouse_up_x)+","+str(mouse_up_y))
print_text(font1,0,160,"Mouse Polling")
x,y=pygame.mouse.get_pos()
print_text(font1,0,180,"Mouse Position: "+str(x)+str(y))
b1,b2,b3=pygame.mouse.get_pressed()
print_text(font1,0,200,"Mouse buttons: "+str(b1)+","+str(b2)+","+str(b3))
pygame.display.update()
3游戏简介
bomb Catcher游戏综合了鼠标输入、一些基本图形绘制和少量冲突检测逻辑。
炸弹是不断重复地从屏幕顶端落下的黄色圆圈。
当炸弹到达屏幕底部的时候,玩家未接住炸弹就会丢掉一条生命。
当炸弹撞击到挡板,算作玩家接住炸弹,另一个炸弹还会继续落下。
import sys,random,time,pygame
from pygame.locals import *
pygame.init()
def print_text(font,x,y,text,color=(255,255,255)):
imgtext=font.render(text,True,color)
screen.blit(imgtext,(x,y))
screen=pygame.display.set_mode((600,500))
pygame.display.set_caption("Bomb Catching Game")
font1=pygame.font.Font(None,24)
pygame.mouse.set_visible(False)
white=255,255,255
red=220,50,50
yellow=230,230,50
black=0,0,0
lives=3
score=0
game_over=True
mouse_x=mouse_y=0
pos_x=300
pos_y=460
bomb_x=random.randint(0,500)
bomb_y=-50
vel_y=3
#repeating loop
while True:
for event in pygame.event.get():
if event.type==QUIT:
sys.exit()
elif event.type==MOUSEMOTION:
mouse_x,mouse_y=event.pos
move_x,move_y=event.rel
elif event.type==MOUSEBUTTONUP:
if game_over:
game_over=False
lives=3
score=0
keys=pygame.key.get_pressed()
if keys[K_ESCAPE]:
sys.exit()
screen.fill((0,0,100))
if game_over:
print_text(font1,100,200,"<CLICK TO PLAY>")
else:
#move the bomb
bomb_y+=vel_y
#has player missed the bomb?
if bomb_y>500:
bomb_x=random.randint(0,500)
bomb_y=-50
lives-=1
if lives==0:
game_over=True
#see if player has caught the bomb
elif bomb_y>pos_y:
if bomb_x>pos_x and bomb_x<pos_x+120:
score+=10
bomb_x=random.randint(0,500)
bomb_y=-50
#draw the bomb
pygame.draw.circle(screen,black,(bomb_x-4,int(bomb_y)-4),30,0)
pygame.draw.circle(screen,yellow,(bomb_x,int(bomb_y)),30,0)
#set basket position
pos_x=mouse_x
if pos_x<0:
pos_x=0
elif pos_x>480:
pos_x=500
#draw basket
pygame.draw.rect(screen,black,(pos_x-4,pos_y-4,120,40),0)
pygame.draw.rect(screen,red,(pos_x,pos_y,120,40),0)
#print # of lives
print_text(font1,0,0,"Lives: "+str(lives))
#print score
print_text(font1,500,0,"Score: "+str(score))
pygame.display.update()
可以改进的地方很多,比如说难度的提升,炸弹的显示效果等等。
现在我会改进这个程序,但是并不能独立写出这个程序来。
Python游戏编程入门3的更多相关文章
- Python游戏编程入门
<Python游戏编程入门>这些文章负责整理在这本书中的知识点.注意事项和课后习题的尝试实现.并且对每一个章节给出的最终实例进行分析和注释. 初识pygame:pie游戏pygame游戏库 ...
- Python游戏编程入门 中文pdf扫描版|网盘下载内附地址提取码|
Python是一种解释型.面向对象.动态数据类型的程序设计语言,在游戏开发领域,Python也得到越来越广泛的应用,并由此受到重视. 本书教授用Python开发精彩游戏所需的[]为重要的该你那.本书不 ...
- Python游戏编程入门2
I/O.数据和字体:Trivia游戏 本章包括如下内容:Python数据类型获取用户输入处理异常Mad Lib游戏操作文本文件操作二进制文件Trivia游戏 其他的不说,我先去自己学习文件类型和字符串 ...
- python编程学习--Pygame - Python游戏编程入门(0)---转载
原文地址:https://www.cnblogs.com/wuzhanpeng/p/4261015.html 引言 博客刚开,想把最近学习的东西记录下来,算是一种笔记.最近打算开始学习Python,因 ...
- Pygame - Python游戏编程入门(0) 转
博客刚开,想把最近学习的东西记录下来,算是一种笔记.最近打算开始学习Python,因为我感觉Python是一门很有意思的语言,很早以前就想学了(碍于懒),它的功能很强大,你可以用它来做科学运算,或者数 ...
- Pygame - Python游戏编程入门
>>> import pygame>>> print(pygame.ver)1.9.2a0 如果没有报错,应该是安装好了~ 如果报错找不到模块,很可能是安装版本的问 ...
- Python游戏编程入门4
Math和Graphics:Analog Clock示例程序本章介绍Python的math模块,该模块可以执行计算,如常见的三角正弦函数.余弦函数.正切函数等. 使用正弦和余弦函数绘制圆创建Anlog ...
- PC游戏编程(入门篇)(前言写的很不错)
PC游戏编程(入门篇) 第一章 基石 1. 1 BOSS登场--GAF简介 第二章 2D图形程式初体验 2.l 饮水思源--第一个"游戏"程式 2.2 知其所以然一一2D图形学基础 ...
- 分享《Python 游戏编程快速上手(第3版)》高清中文版PDF+高清英文版PDF+源代码
通过编写一个个小巧.有趣的游戏来学习Python,通过实例来解释编程的原理的方式.14个游戏程序和示例,介绍了Python基础知识.数据类型.函数.流程控制.程序调试.流程图设计.字符串操作.列表和字 ...
随机推荐
- chrome通过devtools来查看Devtools Extension与浏览器内核实际通信的数据情况
1.chrome通过devtools来查看Devtools Extension与浏览器内核实际通信的数据情况,步骤如下: (1)开启开发者工具实验模式 ---浏览器进入chrome://flags - ...
- TCP/IP协议 数据链路层
以太网 1.以太网(Ethernet)是一种计算机局域网技术,由Xerox.Intel公司在1982年联合开发的技术规范. 2.IEEE组织的IEEE 802.3标准制定了以太网的技术标准,它规定了包 ...
- 小程序:scroll-view组件滑动多次触发scroll事件的bug解决
在项目开发过程中,组件是微信小程序提供给我们的一个分页器,一般滑动到底部时会触发scroll事件,scroll事件中往往包含对后端数据的请求:若是还未滑动到底部时频繁触发事件,则会频繁发请求,达不到想 ...
- 增长中的时间序列存储(Scaling Time Series Data Storage) - Part I
本文摘译自 Netflix TechBlog : Scaling Time Series Data Storage - Part I 重点:扩容.缓存.冷热分区.分块. 时序数据 - 会员观看历史 N ...
- 18. C# 转换
1.重载转换运算符 到目前为止,我们使用的类型转换,包括隐式类型转换和显示类型转换都是在两个相关的类中进行的,这几个类要么是简单类型之间的转换,比如int 隐式转换成double,要么是有继承关系,或 ...
- 用php实现斐波那契数列,如: 1, 1, 2, 3, 5, 8, 13, 21, 34。求出第20个数的值。
<?php function Fibonacci($n){ if ($n <= 0) { return 0; } elseif ($n == 1) { return 1; } else { ...
- python数据类型之列表类型
一.列表 作用:多个装备,多个爱好,多门课程,多个女朋友等 定义:[]内可以有多个任意类型的值,逗号分隔 以下是列表的常用操作方法: append(), count(), insert(),rever ...
- 【Python学习】iterator 迭代器小练习
http://anandology.com/python-practice-book/iterators.html Problem 1: Write an iterator class revers ...
- Django中上传图片---避免因图片重名导致被覆盖
上一篇文章中(https://www.cnblogs.com/lutt/p/10640412.html),我们以图片文件夹+图片名字的方式来储存图片,这样的做法会导致有重名的图片会导致之前的图片被覆盖 ...
- Spring Boot:简介
一.概述 Spring Boot 是Java一个开源框架,主要用途是用来创建微服务:可以用来创建独立的.生产的基于Spring的应用程序. Spring Boot 采用默认配置观点,多数Spring ...