目前为止,Player的站立、行走、跳跃都是动画了,只有跳板(即:Platform类)还是难看的矩形,这节我们把Platform也换成图片:

原来的Platform类长这个样子:

1 class Platform(pg.sprite.Sprite):
2     def __init__(self, x, y, w, h):
3         pg.sprite.Sprite.__init__(self)
4         self.image = pg.Surface((w, h))
5         self.image.fill(GREEN)
6         self.rect = self.image.get_rect()
7         self.rect.x = x
8         self.rect.y = y

View Code

如果用图片,就不再需要w,h这个参数了(因为图片自带尺寸大小),所以变成下面这样:

 1 class Platform(pg.sprite.Sprite):
 2     def __init__(self, game, x, y):
 3         pg.sprite.Sprite.__init__(self)
 4         self.game = game
 5         # 改成加载图片
 6         images = [self.game.spritesheet.get_image("ground_grass_broken.png"),
 7                   self.game.spritesheet.get_image("ground_grass_small_broken.png")]
 8         # 随机选一张
 9         self.image = random.choice(images)
10         self.rect = self.image.get_rect()
11         self.rect.x = x
12         self.rect.y = y

View Code

相应的,最开始初始化的5块platform信息(settings.py)

1 # starting platform
2 PLATFORM_LIST = [(0, HEIGHT - 30, WIDTH, 30),
3                  (WIDTH / 2 - 50, HEIGHT * 0.75, 100, 15),
4                  (WIDTH * 0.12, HEIGHT * 0.5, 60, 15),
5                  (WIDTH * 0.65, 200, 80, 10),
6                  (WIDTH * 0.5, 100, 50, 10)]

View Code

调整成:

1 # starting platform
2 PLATFORM_LIST = [(5, HEIGHT - 35),
3                  (WIDTH / 2 - 50, HEIGHT * 0.75),
4                  (WIDTH * 0.12, HEIGHT * 0.5),
5                  (WIDTH * 0.65, 200),
6                  (WIDTH * 0.5, 100)]

View Code

同时,调整下Player出场时的位置,让它站在最底面的第1块板上:

class Player(pg.sprite.Sprite):def __init__(self, game):pg.sprite.Sprite.__init__(self)self.game = game...self.rect = self.image.get_rect()# 初始化时,停在第一块platform上self.rect.center = (35, HEIGHT - 35)self.pos = self.rect.center...

View Code

main.py里的new函数,也做相应的调整:

    def new(self):self.score = 0...for plat in PLATFORM_LIST:# 这里相应调整p = Platform(self, *plat)...

View Code

main.py中的update函数里,最后再调整一下:

 1     def update(self):
 2         self.all_sprites.update()
 3         ...
 4
 5         while len(self.platforms) <= 5:
 6             width = random.randrange(50, 100)
 7             # 这里也做相应调整
 8             p = Platform(self, random.randint(0, WIDTH - width),
 9                          random.randint(-70, -30))
10             self.platforms.add(p)
11             ...

View Code

跑起来看看,基本效果出来了,难看的矩形终于没有了,但是仔细观察下,漏洞百出,比如下面这些:

问题1:跳板太靠右,边界跑到屏幕外了

修复方法:

检测下platform的right值,如果超出边界,向左挪一点

1     def new(self):
2        ...
3
4         for plat in PLATFORM_LIST:
5             p = Platform(self, *plat)
6             # 如果platform位置太靠右,跑出屏幕外,校正位置
7             if p.rect.right >= WIDTH:
8                 p.rect.centerx = p.rect.centerx - (p.rect.right - WIDTH) - 2
9             ...

View Code

问题二:platform把player实例给挡住了

类似photoshop的图层一样,pygame里也有layer的概念,最后绘制的对象,默认在最上层

修复方法:main.py的draw函数,在最后,强制再绘制一次player(tips: 其实有更好的办法,利用图层概念,可参考part17部分)

1     def draw(self):
2         self.screen.fill(LIGHT_BLUE)
3         self.all_sprites.draw(self.screen)
4         self.debug()
5         self.draw_text(str(self.score), 22, WHITE, WIDTH / 2, 15)
6         # 强制把player放在最上层
7         self.screen.blit(self.player.image, self.player.rect)
8         pg.display.update()

View Code

问题三:跳板叠在一起

解决方法:

思路:随机生成的新跳板,先不急着加入self.platforms,而是运用碰撞检测原理,与现有跳板做碰撞检测(叠在一起,肯定就碰撞上了),如果碰撞了,就扔掉(pygame下一帧会重新生成,如此循环,直到满足条件的跳板加入)

 1     def update(self):
 2         self.all_sprites.update()
 3         ...
 4         # 跳板数<5,且player未跌落到屏幕外(否则player跌到屏幕外,仍在不停做碰撞检测,性能开销极大,会把程序卡死)
 5         while len(self.platforms) <= 5 and self.player.rect.bottom < HEIGHT:
 6             width = random.randrange(50, 100)
 7             # 这里也做相应调整
 8             p = Platform(self, random.randint(0, WIDTH - width),
 9                          random.randint(-70, -30))
10             if p.rect.right >= WIDTH:
11                 p.rect.centerx = p.rect.centerx - (p.rect.right - WIDTH) - 2
12             self.all_sprites.add(p)
13             # 防止二个plat平台叠在一起(原理:用待加入的plat与其它platform实例做碰撞检测,如果碰撞了,则扔掉)
14             hits = pg.sprite.spritecollideany(p, self.platforms)
15             if hits:
16                 p.kill()
17             else:
18                 self.platforms.add(p)

View Code

问题四: player已经超过了屏幕顶端,但是屏幕并没有向上滚动,这样玩家就无法看到头顶的新跳板。

解决办法:

先来分析下main.py中update函数中的滚动处理

        if self.player.rect.top < HEIGHT / 4:self.player.pos.y += abs(self.player.vel.y)for plat in self.platforms:plat.rect.top += abs(self.player.vel.y)if plat.rect.top > HEIGHT:...

如果player的y轴速度为0,abs函数算出来的值为0,所以跳板与兔子的y坐标值并不会动(也就是屏幕无法滚动),改进为下面这样:

 1     def update(self):
 2         self.all_sprites.update()
 3         ...
 4         if self.player.rect.top < HEIGHT / 4:
 5             # 防止垂直方向速度为0时,无法滚动屏幕
 6             self.player.pos.y += max(abs(self.player.vel.y), 2)
 7             for plat in self.platforms:
 8                 plat.rect.top += max(abs(self.player.vel.y), 2)
 9                 if plat.rect.top > HEIGHT:
10                     ...

View Code

修复了上面这一堆bug后,再来运行下:

源码: https://github.com/yjmyzz/kids-can-code/tree/master/part_12

转载于:https://www.cnblogs.com/yjmyzz/p/pygame-kidscancode-part12-platform-graphic.html

pygame-KidsCanCode系列jumpy-part12-platform图片相关推荐

  1. python画的图怎么保存_python通过PyGame绘制图像并保存为图片文件的代码

    把开发过程中常用的一些内容片段记录起来,下边内容是关于python通过PyGame绘制图像并保存为图片文件的内容,希望对大伙有较大好处. ''' pg_draw_circle_save101.py d ...

  2. Android APK系列3-------使用platform密钥来给apk文件签名

    Android APK系列3-------使用platform密钥来给apk文件签名 1.使用platform密钥对apk进行签名 1.1.进入<Android_Source_Path>\ ...

  3. pygame鼠标进行拖拽移动图片、缩放、以及按钮响应 案例

    pygame鼠标进行拖拽移动图片.缩放.以及按钮响应 案例 # -*- coding: UTF-8 -*- #!/usr/bin/env python3 # @Time : 2021.12 # @Au ...

  4. Android图片系列-2.Android App图片压缩、裁剪分析整理

    移动端常用的图片格式有PNG和JPEG,目前ios手机和大部分安卓手机拍照生成的图片默认格式都是JPEG.我们开发APP的时候通常使用的是PNG,这可能是考虑到图片质量效果.PNG图片是无损压缩格式, ...

  5. WebRTC实时通信系列教程9 数据通道图片传输

    [转载请注明出处: http://blog.csdn.net/leytton/article/details/76838194]  PS:如果本文对您有帮助,请点个赞让我知道哦~ <WebRTC ...

  6. 在Ubuntu 16.04.1 LTS上安装XnView Multi Platform图片浏览器0.83

    XnView Multi Platform是一个全平台(Windows, Linux, Mac)下的全能图片工具,类似Windows平台的美图看看,阿香婆图片浏览器等等,效果非常赞,是我在Ubuntu ...

  7. Android批量图片载入经典系列——afinal框架实现图片的异步缓存载入

    一.问题描写叙述 在之前的系列文章中,我们使用了Volley和Xutil框架实现图片的缓存载入,接下来我们再介绍一下afinal 框架的使用. Afinal 是一个android的http框架.sql ...

  8. iOS开发系列--无限循环的图片浏览器

    概述 UIKit框架中有大量的控件供开发者使用,在iOS开发中不仅可以直接使用这些控件还可以在这些控件的基础上进行扩展打造自己的控件.在这个系列中如果每个控件都介绍一遍确实没有必要,所谓授人以鱼不如授 ...

  9. android 涂鸦之图片叠加,android图像处理系列之七--图片涂鸦,水印-图片叠加...

    图片涂鸦和水印其实是一个功能,实现的方式是一样的,就是一张大图片和一张小点图片叠加即可.前面在android图像处理系列之六--给图片添加边框(下)-图片叠加中也讲到了图片叠加,里面实现的原理是直接操 ...

  10. 解决方案:macOS Mojave下Pycharm运行pygame无法加载外星人游戏图片以及无法修改颜色

    关于macOS Mojave下,Pycharm 运行pygame,加载不出外星人游戏图片以及无法修改颜色,解决方案如下:  1.官网升级Python3.7.2,Python Releases for ...

最新文章

  1. aidl使用_借助 AIDL 理解 Android Binder 机制——Binder 来龙去脉
  2. Spring的依赖注入和管理Bean
  3. CSDN转载博客的方法
  4. C/C++—— int main(int argc,char* argv[])讲解
  5. python中的ch表示什么_材料符号里面的 CH表示什么意思 : ( )
  6. 一波情人节海报温暖来袭,注定与众不同
  7. linux hook 任意内核函数,【求助】Kernel 4.8下编译编写的Netfilter Hook函数失败
  8. 清华大学中国人工智能学会:2019人工智能发展报告
  9. 语音识别系统原理介绍---从gmm-hmm到dnn-hmm
  10. 基于SSM的个人博客系统(数据库+源码)
  11. javascript 设为首页 | 加入收藏夹 JS代码
  12. python图片添加文字
  13. R语言使用strsplit函数按照指定的分隔符号进行数据拆分、分裂(split)、分割后的数据类型为列表
  14. 淘宝宠物用品找代理方法步骤 淘宝宠物用品店怎么开
  15. win10怎么更新显卡驱动_如何禁止win10自动更新显卡驱动
  16. 计算机上机日志如何查找,如何查看金蝶KIS记账王上机日志
  17. win32画窗体背景
  18. cocos2dx入门2:安装及基本介绍
  19. java中的instance_Java基础之Class类与instance关键字
  20. 视网膜数据集(3)STARE

热门文章

  1. 安装redis时被意外攻击 newinit
  2. 如何将u盘两个分区合并?u盘怎么合并一个区
  3. python3*1**3 表达式输出结果为_22 % 3 表达式输出结果为________
  4. 中国口罩市场现状调研及投资前景预测报告2022-2028年
  5. Event-Triggering Sampling Based Leader-FollowingConsensus in Second-Order Multi-Agent Systems
  6. 织梦微信小程序一键生成插件(资讯案例模板),整合织梦CMS一切数据信息
  7. s鼠标在计算机哪部分里,罗技g602和g700s哪个好_罗技g602鼠标怎么样【详细介绍】-太平洋IT百科...
  8. mysql中的临时表怎么用的?
  9. 双击打开.bat文件闪退
  10. VTA(Versatile Tensor Accelerator)阅读笔记