一些2维游戏,角色不动,背景连续移动。例如驾驶汽车2维游戏,汽车固定在某位置,只能沿x轴左右移动避开障碍物,道路沿y轴汽车行进相反方向连续移动,感觉汽车在前进。这里道路实际上是背景。传统方法把做背景的道路图像分割为2部分,称为道路1和道路2,1前1后移进游戏窗体,然后顺序移出游戏窗体,当道路1移出游戏窗体,道路2还在游戏窗体中,道路1将被放到道路2后边,当道路2移出游戏窗体,道路1还在游戏窗体中,道路2将被放到道路1后边,依此无限循环使用道路1和道路2,实现背景连续移动。
这里介绍的方法不分割图像做背景来完成背景连续移动。先看pygame.surface.blit方法,其将一个图像(Surface实例)绘制到另一个图像(Surface实例)上。如screen是一个Surface实例,方法blit具体使用方法如下:

rect=screen.blit(source,dest,area=None,special_flags=0)

如screen是游戏窗口,source是一个很宽的背景图像,area是一个Rect对象,表示从背景图像(source)的area区域取出图像绘制到游戏窗口上。见下面代码,将背景一部分显示到游戏窗口。不能运行,只是说明问题。

size = width, height = 400,300                      #指定游戏窗口宽和高
screen=pygame.display.set_mode(size)#创建指定宽和高游戏窗口(Surface实例)
bg_img = pygame.image.load("长背景.png").convert()   #背景图像高=height
rect = pygame.Rect(x,y,width,height) #可修改(x,y),从bg_img不同位置取图像
screen.blit(bg_img,(0,0),rect)

注意rect的宽和高和游戏窗口宽和高相同,blit()方法将从长背景图像(bg_img)从坐标(x,y)处取出和游戏窗口宽和高相同的部分背景在游戏窗口坐标(0,0)处显示作为背景。修改rect的x,y值,可从背景不同位置取出不同部分背景图像。如每帧自动增加rect的x值,y值不变,将看到背景自动沿x轴移动,同理也可使背景自动沿y轴移动。
下边是完整背景自动移动程序。拷贝源程序后,从网上找一个背景图像,景物沿x轴排列(如下边两个图像),其宽要大于2倍游戏窗口宽,保险取3倍,高等于游戏窗口高,修改名称为(“长背景.png”,保存到该源程序所在文件夹中,即可运行。很容易改为沿y轴移动。

import pygame
pygame.init()
size = width, height = 400,300                      #创建游戏窗口大小
screen = pygame.display.set_mode(size)
pygame.display.set_caption("pygame游戏使用无分割大背景")  #设置窗口标题
bg_img = pygame.image.load("长背景1.png").convert()   #背景图像
bg_width=bg_img.get_rect().width
p=pygame.image.load("b.png").convert_alpha()
fclock = pygame.time.Clock()                        #创建控制频率的clock
fps = 4                                             #定义刷新频率
running = True                                      #程序是否结束,初始运行rect = pygame.Rect(0,0,400,300) #blit方法第3个参数
while running:for event in pygame.event.get():if event.type == pygame.QUIT:               #处理退出事件running = False                         #程序结束screen.blit(bg_img,(0,0),rect)                  #绘制背景rect.x+=5                                       if bg_width-rect.x<width:      #如果长背景右侧沿x轴所剩宽度小于游戏窗口宽度rect.x=0screen.blit(p, (200, 270))                          #在屏幕指定位置绘制图形    pygame.display.flip()                           #刷新游戏场景fclock.tick(fps) #fps是每秒多少帧,减去程序运行时间,为实现fps,还需延迟时间
pygame.quit()

本例使用的2个长背景见下面图像。当使用第一个图形作为背景时,当长背景右侧沿x轴所剩宽度小于游戏窗口宽度(程序第21句),重新从长背景最左侧开始取背景(即从retc.x=0开始),这时将会使背景产生一个突变,不是平滑移动。为克服这点,可采用第二个图像,和第一个图像区别是,该图像前边400点(400是游戏窗口宽度)和最后的400点图像完全相同,再试一下,整个过程背景都能平滑移动。


2维躲避障碍物的小游戏,沿x轴前进或后退,遇到障碍物要跳起躲避,通过后又会遇到新障碍物,一直往前,将遇到很多障碍物。这类游戏也可用上边方法通过背景沿x轴某方向移动,使角色看起来向相反方向移动。一般是通过键盘左右键使背景沿x轴前进或后退,达到角色沿相反方向移动效果。下边是实现的完整演示程序。

import pygame
pygame.init()
size = width, height = 400,300                      #创建游戏窗口大小
screen = pygame.display.set_mode(size)
pygame.display.set_caption("pygame游戏使用无分割大背景")  #设置窗口标题
bg_img = pygame.image.load("长背景.png").convert()   #背景图像
bg_width=bg_img.get_rect().width
p=pygame.image.load("b.png").convert_alpha()
fclock = pygame.time.Clock()                    #创建控制频率的clock
fps = 10                                        #使用键盘,刷新频率为4使计算机反应慢
running = True                                  #程序是否结束,初始运行rect = pygame.Rect(0,0,width,height)            #blit方法第3个参数
while running:for event in pygame.event.get():if event.type == pygame.QUIT:               #处理退出事件running = False                         #程序结束if event.type == pygame.KEYDOWN:            #按键后按下事件,避免长按键不抬起if event.key==pygame.K_RIGHT:           #使球向右,背景向左rect.x+=5if bg_width-rect.x<width:rect.x=5                        #等于0,有抖动elif event.key==pygame.K_LEFT:          #使球向左,背景向右rect.x-=5if rect.x<0:rect.x=bg_width-width-5         #不减5,有抖动screen.blit(bg_img,(0,0),rect)                  #绘制背景    screen.blit(p, (200, 270))                          #在屏幕指定位置绘制图形    pygame.display.flip()                           #刷新游戏场景fclock.tick(fps) #fps是每秒多少帧,减去程序运行时间,为实现fps,还需延迟时间
pygame.quit()

还有些2维游戏,单纯地扩大背景,使游戏具有更好的观赏性。例如,小蝌蚪吃蚊子幼虫,大鱼吃小鱼等。下边的例子,背景是4个游戏窗口大,即背景的宽和高都是游戏窗口的宽和高的两倍,用鼠标控制小球使其能移到背景的任意位置,即小球移到游戏窗口左(或右、上和下)边界,同时也移到大背景左(或右、上和下)边界。下边是实现该设想的完整程序。注意程序中,用键盘控制小球移动,背景也要反向移动,两者速度相同。

import pygame
pygame.init()
size = width, height = 480,360                      #创建游戏窗口大小
screen = pygame.display.set_mode(size)
pygame.display.set_caption("pygame游戏使用无分割大背景")  #设置窗口标题
bg_img = pygame.image.load("背景.jpeg").convert()   #背景图像
p=pygame.image.load("b.png").convert_alpha()
fclock = pygame.time.Clock()                        #创建控制频率的clock
fps = 10                                             #刷新频率
running = True                                      #程序是否结束,初始运行
x,y=240,180
rect = pygame.Rect(240,180,480,360)                 #blit方法第3个参数
while running:for event in pygame.event.get():if event.type == pygame.QUIT:               #处理退出事件running = False                         #程序结束if event.type == pygame.KEYDOWN:            if event.key==pygame.K_LEFT:x-=10rect.x-=10if x<0:x=0rect.x=0elif event.key==pygame.K_RIGHT:x+=10rect.x+=10if x>445:x=445rect.x=445elif event.key==pygame.K_UP:y-=10rect.y-=10if y<0:y=0rect.y=0elif event.key==pygame.K_DOWN:y+=10rect.y+=10if y>325:y=325rect.y=325screen.blit(bg_img,(0,0),rect)                  #绘制背景    screen.blit(p, (x, y))                          #在屏幕指定位置绘制图形    pygame.display.flip()                           #刷新游戏场景fclock.tick(fps) #fps是每秒多少帧,减去程序运行时间,为实现fps,还需延迟时间
pygame.quit()

如果背景是9个游戏窗口大,即背景的宽和高都是游戏窗口的宽和高的3倍,则背景移动速度是小球的2倍。下面用两个图形说明具体原因,图中黑框是游戏窗口,多个红框是背景,1处是小球位置,其移到游戏窗口左边界(2号位置)距离,两图相同,为游戏窗口宽的1半,在小球移到游戏窗口左边界同时,背景左边界要必须(从3到2)右移,要同时移到游戏窗口左边界,但背景左边界移到游戏窗口左边界距离,是不同的,图1是游戏窗口宽的1半,图2是游戏窗口宽,所以速度应是小球速度的2倍。由此可推断,背景的宽和高是游戏窗口的宽和高的n倍,背景移动速度是小球的n-1倍。

效果图如下:

pygame游戏使用不分割大图像做背景的方法相关推荐

  1. pygame游戏_小蝌蚪吃蚊子幼虫成长

    网上有许多小蝌蚪的游戏.其中有一游戏,小蝌蚪开始很小,其四处游动吃蚊虫(蚊子幼虫),吃一个蚊虫后其身体长大一点,长大到某尺寸变为青蛙.本例实现其部分功能.游戏有3个角色:小蝌蚪.蚊虫和背景角色.小蝌蚪 ...

  2. python按内容分割txt文件_Python实现逐行分割大txt文件示例详解

    Python实现逐行分割大txt文件的方法介绍 本文通过代码给大家介绍了Python 逐行分割大txt文件的方法,在文中给大家提到了Python从txt文件中逐行读取数据的方法,需要的朋友参考下吧 代 ...

  3. Unity开发《一起来捉妖》教程 | 2.用摄像头图像做背景

    洪流学堂,让你快人几步.你好,我是郑洪智. 洪流学堂公众号回复捉妖,可以获取本教程的源码工程. 小新:"我们接下来是不是需要将显示融合到屏幕上,才能称得上是AR呢?" 大智:&qu ...

  4. Python的Pygame游戏框架(汇总)

    Python的Pygame游戏框架 一.前言 二.初识pygame 1.安装pygame 2.pygame 常用模块 二.Pygame 的基础使用 三.手写小游戏源码下载 一.前言 个人主页: ζ小菜 ...

  5. python和pygame游戏开发指南_学习记录

    <python和pygame游戏开发指南> Making Games With Python and Palme [美]Ai Sweigart 著,李强 译,2015.12第一版 文章目录 ...

  6. 《Python和Pygame游戏开发指南》——2.16 pygame.display.update()函数

    本节书摘来自异步社区<Python和Pygame游戏开发指南>一书中的第2章,第2.16节,作者[美]Al Sweigart(斯维加特), 李强 译,更多章节内容可以访问云栖社区" ...

  7. 根据大小分割大文本_基于深度学习的图像分割在高德地图的实践

    一.前言 图像分割(Image Segmentation)是计算机视觉领域中的一项重要基础技术,是图像理解中的重要一环.图像分割是将数字图像细分为多个图像子区域的过程,通过简化或改变图像的表示形式,让 ...

  8. matlab 图像语义分割,笔记︱图像语义分割(FCN、CRF、MRF)、论文延伸(Pixel Objectness、)...

    图像语义分割的意思就是机器自动分割并识别出图像中的内容,我的理解是抠图- 之前在Faster R-CNN中借用了RPN(region proposal network)选择候选框,但是仅仅是候选框,那 ...

  9. fcm脑图像分割matlab,MATLAB程序:用FCM分割脑图像

    MATLAB程序:用FCM分割脑图像 1. MATLAB程序 FCM_image_main.m function [accuracy,iter_FCM,run_time]=FCM_image_main ...

最新文章

  1. 美妆视频小红唇如何打开大数据之门
  2. 6.Java集成开发环境
  3. 编程语言python特点-常用编程语言介绍及各特点
  4. python财务-财务方面的学生如何学习python?
  5. maven java 目录结构_java – 为maven目录结构生成的源文件的位置
  6. Confluence 6 管理协同编辑 - 最大编辑者的限制
  7. php怎么求阶乘_如何实现一个PHP类来计算整数的阶乘?(代码详解)
  8. 【Elasticsearch】Elasticsearch如何实现 SQL语句中 Group By 和 Limit 的功能
  9. 命名集 —— 绰号昵称篇
  10. 《Java并发编程实战》【第四部分 高级主题】
  11. amos调节变量怎么画_结构方程模型建模思路及Amos操作--调节变量效果确定(二)...
  12. CGI和FastCgi
  13. mysql左表有右表没有_查询左表存在而右表不存在的记录
  14. Android PopupWindow 的方法 弹出窗口方法
  15. Windows下如何对声卡音频输出进行录音
  16. 美国交通模型发展前沿一览——Caliper年度通讯
  17. npm 安装出现 UNMET DEPENDENCY 的解决方案
  18. C++中string类函数常用函数大全
  19. 大数据中心系统集成资质
  20. JAVA简易控制台选择题答题,改自书上代码

热门文章

  1. 基于Arduino mega2560单片机控制的红外激光传感器测距控制系统
  2. 无人驾驶感知篇之传感器标定(一)
  3. 被窦唯夸奖“音乐好”的刺猬乐队成员竟然是程序员
  4. 推荐一个在线听全网歌曲的插件
  5. android scaleanimation动画,Android 的ScaleAnimation 缩放动画基本运用
  6. IDEA里配置Bootstrap
  7. BCPNet:用于实时语义分割的双向上下文传播网络
  8. 访问局域网电脑时需要输入用户名和密码怎么解决
  9. 《计算机视觉:模型、学习和推理》自学笔记(一)-绪论
  10. 中国矿业大学计科算法导论菜鸟笔记