【代码】pygame学习
文章目录
- 效果图
- 代码
- 知识点
- Blit 和 Flip
- 用户输入
- Sprites
- Groups
- 自定义事件
- 冲突
- 图片
- 参考链接:
效果图
代码
import pygame
import random
from pygame.locals import *# Pygame 提供一个叫做 Sprites 的基础类,为了画图。Surface 看作一张白纸,Rects 是 Surface 中矩形区域的表示。
class Player(pygame.sprite.Sprite):def __init__(self):super(Player, self).__init__()self.image = pygame.image.load('jet.png').convert()self.image.set_colorkey((255, 255, 255), RLEACCEL)self.rect = self.image.get_rect()# 定义按键def update(self, pressed_keys):if pressed_keys[K_UP]:self.rect.move_ip(0, -2)if pressed_keys[K_DOWN]:self.rect.move_ip(0, 2)if pressed_keys[K_LEFT]:self.rect.move_ip(-2, 0)if pressed_keys[K_RIGHT]:self.rect.move_ip(2, 0)# 超出屏幕范围的进行纠正if self.rect.left < 0:self.rect.left = 0elif self.rect.right > 800:self.rect.right = 800if self.rect.top <= 0:self.rect.top = 0elif self.rect.bottom >= 600:self.rect.bottom = 600# 定义敌人类
class Enemy(pygame.sprite.Sprite):def __init__(self):super(Enemy, self).__init__()self.image = pygame.image.load('missile.png').convert()self.image.set_colorkey((255, 255, 255), RLEACCEL)self.rect = self.image.get_rect(center=(random.randint(820, 900), random.randint(0, 600)))self.speed = random.randint(1, 2)def update(self):self.rect.move_ip(-self.speed, 0)# 如果超出边框,就删除,不会再被渲染出来if self.rect.right < 0:self.kill()# 定义背景类
class Cloud(pygame.sprite.Sprite):def __init__(self):super(Cloud, self).__init__()self.image = pygame.image.load('cloud.png').convert()self.image.set_colorkey((0, 0, 0), RLEACCEL)self.rect = self.image.get_rect(center=(random.randint(820, 900), random.randint(0, 600)))def update(self):self.rect.move_ip(-2, 0)if self.rect.right < 0:self.kill()# 初始化 pygame
pygame.init()# 创造一个画布,并传递宽度和高度
screen = pygame.display.set_mode((800, 600))# 创建自定义事件
ADDENEMY = pygame.USEREVENT + 1
pygame.time.set_timer(ADDENEMY, 1000)
ADDCLOUD = pygame.USEREVENT + 2
pygame.time.set_timer(ADDCLOUD, 1000)# 创建一个类
player = Player()background = pygame.Surface(screen.get_size())
background.fill((135, 206, 250))# Group 是 Sprite 的集合
enemies = pygame.sprite.Group()
clouds = pygame.sprite.Group()
all_sprites = pygame.sprite.Group()
all_sprites.add(player)# 游戏主循环
running = Truewhile running:# 遍历事件队列for event in pygame.event.get():# 检测 KEYDOWN 事件: KEYDOWN 是 pygame.locals 中定义的常量,pygame.locals文件开始已经导入if event.type == KEYDOWN:# 如果按下 Esc 那么主循环终止if event.key == K_ESCAPE:running = False# 检测 QUIT : 如果 QUIT, 终止主循环elif event.type == QUIT:running = Falseelif event.type == ADDENEMY:new_enemy = Enemy()enemies.add(new_enemy)all_sprites.add(new_enemy)elif event.type == ADDCLOUD:new_cloud = Cloud()all_sprites.add(new_cloud)clouds.add(new_cloud)screen.blit(background, (0, 0))pressed_keys = pygame.key.get_pressed()player.update(pressed_keys)enemies.update()clouds.update()for entity in all_sprites:screen.blit(entity.image, entity.rect)if pygame.sprite.spritecollideany(player, enemies):player.kill()pygame.display.flip()
知识点
只在这里简述,自己明白就行。具体的或者不明白的参考最后的链接
Blit 和 Flip
将创建的 Surface 绘制(Blit)到另一个 Surface 上,blit()有两个参数:要画的 Surface 和 在源 Surface 上的坐标。注意在 blit 之后的 pygame.display.filp() 的调用。Flip将会更新自上次 flip 后的整个屏幕,两次 flip 之间发生的修改都将在屏幕上显示,没有调用flip()那就什么也不会出现。
用户输入
pygame 的一个事件方法,pygame.event.get_pressed()。get_pressed()方法返回一个队列,其中包含了所有按键事件组成的字典,我们将把它放在主循环中,这样我们将获得每一帧上的按键。
Sprites
Sprites 是屏幕上事物的二维表达。本质上来讲,Sprite 就是一个图片,Pygame 提供一个叫做 Sprites 的基础类,它就是用来扩展的,可以包含想要在屏幕上呈现的对象一个或多个图形表示。
Groups
Groups 是 Sprite 的集合,sprite.Group 有一些内建的方法,有助于解决冲突和更新问题,所以建议采用这种方法。使用add()向里面添加Sprites
自定义事件
我们创建一个自定义事件,它隔几秒钟就会触发创建一批敌人。我们要监听该事件,方式和监听按键或退出事件一样
冲突
pygame.sprite 提供一个函数 spritecollideany() ,它接受一个 Sprite 对象和一个 Sprite.Group ,检测 Sprite 对象是否和 Sprite Group 中的其他 Sprites 冲突。
if pygame.sprite.spritecollideany(player,enemies):player.kill()
图片
我们想用一张图片替代 Surface 对象。我们将使用 pygame.image.load() 导入图片的路径。load() 方法将会返回一个 Surface 对象。我们然后在这个 Surface 对象上调用 convert() 创建副本,这样可以更快地将它画在屏幕上。
接下来,我们在图片上调用 set_colorkey() 方法。set_colorkey用于设置图片的颜色,如果不设置 Pygame 会将图片设置为透明。这里我选用白色,因为和飞机的背景色一致。RLEACCEL 是一个可选参数,它有助于 PyGame 在非加速显示器上更快地渲染。
class Player(pygame.sprite.Sprite):def __init__(self):super(Player,self).__init__()self.image = pygame.image.load('jet.png').convert()self.image.set_colorkey((255,255,255),RLEACCEL)self.rect = self.image.get_rect()
参考链接:
从零开发一个小游戏:PyGame 入门
PyGame – A Primer
【代码】pygame学习相关推荐
- Pygame学习笔记 4 —— 时间与运动
还记得我们在之前的程序中如何让兔子动起来的吗,没错,使用event模块检测键盘事件,改变绘图的坐标,画面刷新后兔子就移动了.接下来我们细说如何精确控制时间和运动. 主要内容: pygame的时 ...
- Pygame学习笔记 6 —— 3D游戏
pygame是是上世纪的产品,虽然不适合最3D游戏,但我可以使用pygame来绘制简单的3D图形,就像在白纸上画立体图形一样. 主要内容: 视觉上的远近.3D空间.绘制一个空间图形 一.视觉上 ...
- Python第三方库pygame学习笔记(一)
Pygame Python最经典的2D游戏开发第三方库,也支持3D游戏开发 Pygame适合用于游戏逻辑验证.游戏入门及系统演示验证 Pygame是一种游戏开发引擎,基本逻辑具有参考价值 pygame ...
- 【Pygame 学习笔记】8.精灵
术语"精灵"是旧计算机和游戏机的保留.这些较旧的盒子无法以足够快的速度绘制和擦除普通图形,使其无法用作游戏.这些机器有特殊的硬件来处理需要快速动画的游戏对象.这些对象被称为&quo ...
- Python可视化物理随机过程---pygame学习笔记2
Python可视化物理随机过程-pygame学习笔记2 文章目录 Python可视化物理随机过程---pygame学习笔记2 一.扩散现象的简单的介绍 二.代码实现 三.运行代码的效果展示 四.总结 ...
- Unity 3D游戏代码编程学习教程 Full Guide To Unity 3D C#: Learn To Code Making 3D Games
Unity 3D游戏代码编程学习教程 Full Guide To Unity 3D & C#: Learn To Code Making 3D Games Full Guide To Unit ...
- 步步为营 .NET 代码重构学习笔记 九
步步为营 .NET 代码重构学习笔记系列 步步为营 .NET 代码重构学习笔记 一.为何要代码重构 步步为营 .NET 代码重构学习笔记 二.提炼方法(Extract Method) 步步为营 .NE ...
- 步步为营 .NET 代码重构学习笔记 十一
步步为营 .NET 代码重构学习笔记系列 步步为营 .NET 代码重构学习笔记 一.为何要代码重构 步步为营 .NET 代码重构学习笔记 二.提炼方法(Extract Method) 步步为营 .NE ...
- 【面向代码】学习 Deep Learning Convolution Neural Network(CNN)
转载自: [面向代码]学习 Deep Learning(三)Convolution Neural Network(CNN) - DarkScope从这里开始 - 博客频道 - CSDN.NET htt ...
- 步步为营 .NET 代码重构学习笔记 十
步步为营 .NET 代码重构学习笔记系列 步步为营 .NET 代码重构学习笔记 一.为何要代码重构 步步为营 .NET 代码重构学习笔记 二.提炼方法(Extract Method) 步步为营 .NE ...
最新文章
- centos7安装tomcat_手把手教你,使用 Nginx 搭配 Tomcat 实现负载均衡!
- 在大数据里:Hadoop可能是你的救命稻草
- idea中构造器和toString方法覆写的快捷键
- js怎么实现对html代码加密解密,javascript脚本加密解密及HTML转JS
- iOS Hacker Xcode7免登录开发者账号打包ipa
- Linux下安装并破解StarUML
- BZOJ4314 倍数?倍数!
- Entity Framework Core生成的存储过程在MySQL中需要进行处理及PMC中的常用命令
- Servlet API
- c# 多线程单例模式_单例模式,多线程单例,双重锁定单例,工场单例创建上下文...
- centos7时间同步_基于 Canal 和 Kafka 实现 MySQL 的 Binlog 近实时同步
- Function Maps: A Flexible Representation of Maps Between Shapes
- [sublime] sublime 实现Markdown编辑器
- java interface 传值_前后端分离传值方案-RestfulAPI
- java基础教程:集合概述(27)
- java分页查询代码实现
- ad中按钮开关的符号_收藏:电路图形符号大全
- bat文件建文件夹时乱码及失败问题
- 统计|两个总体方差比的区间估计(用公式计算)
- 基于Java的亚马逊“手机”评论爬虫的情感分类分析
热门文章
- JAVA类与对象(三)----类定义关键字详解
- 从千奇百怪的相变现象说起
- 华为p40手机是不是android,华为P40Pro有哪些优缺点?华为P40Pro优缺点详细介绍
- VHDL VGA 时钟处理 转盘形式 源代码
- 酷睿i7 10700什么水平 i7 10700参数 i7 10700核显相当于什么显卡
- 电力系统:节点导纳矩阵的稀疏存储(稀疏矩阵)——C语言十字链表实现
- matlab实验报告井字棋,一字棋实验报告
- php应用开发课后题答案,《PHP和MySQL Web应用开发》练习题参考答案
- OpenGL学习笔记(十)-几何着色器-实例化
- linux多个sh 同时执行命令,sh, 批量执行Linux命令