文章目录

  • 效果图
  • 代码
  • 知识点
    • 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学习相关推荐

  1. Pygame学习笔记 4 —— 时间与运动

        还记得我们在之前的程序中如何让兔子动起来的吗,没错,使用event模块检测键盘事件,改变绘图的坐标,画面刷新后兔子就移动了.接下来我们细说如何精确控制时间和运动. 主要内容: pygame的时 ...

  2. Pygame学习笔记 6 —— 3D游戏

        pygame是是上世纪的产品,虽然不适合最3D游戏,但我可以使用pygame来绘制简单的3D图形,就像在白纸上画立体图形一样. 主要内容: 视觉上的远近.3D空间.绘制一个空间图形 一.视觉上 ...

  3. Python第三方库pygame学习笔记(一)

    Pygame Python最经典的2D游戏开发第三方库,也支持3D游戏开发 Pygame适合用于游戏逻辑验证.游戏入门及系统演示验证 Pygame是一种游戏开发引擎,基本逻辑具有参考价值 pygame ...

  4. 【Pygame 学习笔记】8.精灵

    术语"精灵"是旧计算机和游戏机的保留.这些较旧的盒子无法以足够快的速度绘制和擦除普通图形,使其无法用作游戏.这些机器有特殊的硬件来处理需要快速动画的游戏对象.这些对象被称为&quo ...

  5. Python可视化物理随机过程---pygame学习笔记2

    Python可视化物理随机过程-pygame学习笔记2 文章目录 Python可视化物理随机过程---pygame学习笔记2 一.扩散现象的简单的介绍 二.代码实现 三.运行代码的效果展示 四.总结 ...

  6. 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 ...

  7. 步步为营 .NET 代码重构学习笔记 九

    步步为营 .NET 代码重构学习笔记系列 步步为营 .NET 代码重构学习笔记 一.为何要代码重构 步步为营 .NET 代码重构学习笔记 二.提炼方法(Extract Method) 步步为营 .NE ...

  8. 步步为营 .NET 代码重构学习笔记 十一

    步步为营 .NET 代码重构学习笔记系列 步步为营 .NET 代码重构学习笔记 一.为何要代码重构 步步为营 .NET 代码重构学习笔记 二.提炼方法(Extract Method) 步步为营 .NE ...

  9. 【面向代码】学习 Deep Learning Convolution Neural Network(CNN)

    转载自: [面向代码]学习 Deep Learning(三)Convolution Neural Network(CNN) - DarkScope从这里开始 - 博客频道 - CSDN.NET htt ...

  10. 步步为营 .NET 代码重构学习笔记 十

    步步为营 .NET 代码重构学习笔记系列 步步为营 .NET 代码重构学习笔记 一.为何要代码重构 步步为营 .NET 代码重构学习笔记 二.提炼方法(Extract Method) 步步为营 .NE ...

最新文章

  1. centos7安装tomcat_手把手教你,使用 Nginx 搭配 Tomcat 实现负载均衡!
  2. 在大数据里:Hadoop可能是你的救命稻草
  3. idea中构造器和toString方法覆写的快捷键
  4. js怎么实现对html代码加密解密,javascript脚本加密解密及HTML转JS
  5. iOS Hacker Xcode7免登录开发者账号打包ipa
  6. Linux下安装并破解StarUML
  7. BZOJ4314 倍数?倍数!
  8. Entity Framework Core生成的存储过程在MySQL中需要进行处理及PMC中的常用命令
  9. Servlet API
  10. c# 多线程单例模式_单例模式,多线程单例,双重锁定单例,工场单例创建上下文...
  11. centos7时间同步_基于 Canal 和 Kafka 实现 MySQL 的 Binlog 近实时同步
  12. Function Maps: A Flexible Representation of Maps Between Shapes
  13. [sublime] sublime 实现Markdown编辑器
  14. java interface 传值_前后端分离传值方案-RestfulAPI
  15. java基础教程:集合概述(27)
  16. java分页查询代码实现
  17. ad中按钮开关的符号_收藏:电路图形符号大全
  18. bat文件建文件夹时乱码及失败问题
  19. 统计|两个总体方差比的区间估计(用公式计算)
  20. 基于Java的亚马逊“手机”评论爬虫的情感分类分析

热门文章

  1. JAVA类与对象(三)----类定义关键字详解
  2. 从千奇百怪的相变现象说起
  3. 华为p40手机是不是android,华为P40Pro有哪些优缺点?华为P40Pro优缺点详细介绍
  4. VHDL VGA 时钟处理 转盘形式 源代码
  5. 酷睿i7 10700什么水平 i7 10700参数 i7 10700核显相当于什么显卡
  6. 电力系统:节点导纳矩阵的稀疏存储(稀疏矩阵)——C语言十字链表实现
  7. matlab实验报告井字棋,一字棋实验报告
  8. php应用开发课后题答案,《PHP和MySQL Web应用开发》练习题参考答案
  9. OpenGL学习笔记(十)-几何着色器-实例化
  10. linux多个sh 同时执行命令,sh, 批量执行Linux命令