终于要到弹跳环节了,向上弹跳其实很简单,按下空格触发时,只要把y轴速度给一个向上的速度即可。Player类,新加一个jump()方法:def jump(self): self.vel.y = -25调用该方法,会使方块具有向上25px的速度,然后由于重力依然在起作用,所以二者结合,就会形成向上弹跳的效果。然后在main.py中按空格键时,调用jump方法,为了更有趣味性,我
转载
2019-01-20 21:54:00
93阅读
2评论
这节研究下跳跃如何做得更自然,先看看之前的跳跃有什么问题,我们把settings.py里的初始化参数调整下:
1 # starting platform
2 # PLATFORM_LIST = [(5, HEIGHT - 35),
3 # (WIDTH / 2 - 50, HEIGHT * 0.75),
4 # (
转载
2019-02-24 22:38:00
155阅读
2评论
接上回继续,之前的游戏背景过于单调,今天加几朵白云的背景效果。要点:1. 白云要有大有小,尽量模拟出远近层次的效果。2. 兔子向上跳时,(背景)白云也要相应的滚动,但是为了视觉效果,速度要低于档板的速度(比如:1/2 or 1/3)。3. 白云要放在最下层(即:Layer值最低),否则就会把其它物体挡住。 先定义白云:# 白云背景class Cloud(pg.sprite.Sprite)
转载
2019-04-14 09:52:00
69阅读
点赞
2评论
做过前端的兄弟应该都知道css sprite(也称css精灵),这是一种常用的减少http请求次数的优化手段。把很多小图拼成一张大图,只加载1次,然后用css定位到不区的区域,从而展示不同的图片。游戏中也是类似的道理,如下图:每一个小图片,都有自己的x,y,width,height信息,通常会放在一个xml中,类似:1 <TextureAtlas imagePath="sp
转载
2019-02-17 16:01:00
71阅读
接上回继续,方块不断向上跳动的过程中,从视觉上看,整个背景屏幕应该不断向下滚动,而且上方要不断出现新档板(否则就没办法继续向上跳了),这节我们将来实现这种效果,感觉好象很复杂,但实现起来其实很简单,只要对main.py略做调整:Game类的update方法改成下面这样def update(self): self.all_sprites.update() if
转载
2019-01-20 22:31:00
40阅读
2评论
油管(youtube)上有一个号称"史上最好的pygame教程",作者思路很清晰,循序渐进,很适合大人学会了,然后指导孩子入门。作者还有一个专门的网站,鉴于国内~翻*墙不方便,把主要内容记录在此备忘。本篇主要是sprite的入门使用:pygame开发,有一个所谓的最小框架(或称为模板),大概长下面这个样子:import pygameimport time# 游戏中的一些常量定义SIZE
转载
2019-01-20 00:00:00
68阅读
点赞
3评论
接上回继续,这次我们要给游戏加点难度,增加几个随机出现的敌人,玩家碰到敌人后Game Over。
最终效果如下,头上顶个"电风扇"的家伙,就是敌人。
一、先定义敌人类
1 # 敌人类
2 class Mob(pg.sprite.Sprite):
3 def __init__(self, game):
4 pg.sprite.Sprite.__init__(
转载
2019-03-24 19:47:00
139阅读
2评论
目前为止,Player的站立、行走、跳跃都是动画了,只有跳板(即:Platform类)还是难看的矩形,这节我们把Platform也换成图片:
原来的Platform类长这个样子:
1 class Platform(pg.sprite.Sprite):
2 def __init__(self, x, y, w, h):
3 pg.sprite.Sprite.__ini
转载
2019-02-17 19:12:00
84阅读
2评论
接上节继续,上节并没有处理向左走、向右走的动画效果,这节补上,看似很简单,但是有一些细节还是要注意:def jump(self): hits = pg.sprite.spritecollide(self, self.game.platforms, False) if hits: self.vel.y = -PLAYER_JUMP
转载
2019-02-17 17:50:00
35阅读
2评论
上一节学习如何利用spritesheet加载图片,但是player仍然是一张静态的图片,比较枯燥,我们要让它动起来!Player类,先把各种状态的图片加载起来:1 # 加载各种状态的图片序列 2 def load_images(self): 3 # 站立状态的图片 4 self.standing_frames = [self.game.sp
转载
2019-02-17 17:08:00
69阅读
2评论
这一节我们给游戏增加点额外的奖励,大多数游戏中都会有金币、装备啥的来激励玩家,在jumpy这个游戏中,我们也可以增加类似的道具:加速器。效果图如下:
档板上会随机出现一些加速器(power up),小兔子碰到它后,会获取额外的跳跃速度,跳得更高,得分自然也更高。实现原理如下:
首先得有一个PowerUp类:
1 # PowerUp 加速器
2 class PowerUp(pg.spr
转载
2019-03-17 14:18:00
131阅读
2评论
通常一个游戏启动(start)或结束(game over)时,都会显示一个画面,来引导用户。这节,我们学习如何处理这块逻辑。其实之前,我们已经预留了2个函数,只要把它实现即可:def show_start_screen(self): self.screen.fill(BG_COLOR) self.draw_text(TITLE, 48, WHITE, WIDT
转载
2019-01-27 23:28:00
75阅读
2评论
这节我们研究下pygame的几种碰撞检测模式:如上图,左侧是默认的检测模式:基于矩形的检测(这也是性能最好的模式), 右侧是基于圆形的检测(性能略差于矩形检测)。矩形检测法虽然性能好,但是缺点也很明显:检测不准确,上图中"飞机与目标"从视觉上看,根本没碰到。 为了改进,pygame给这二种模式,新增了xxx_ratio的方法,允许指定检测时,指定二个目标的叠加程度,只有达到指定的叠加值,
转载
2019-03-24 20:59:00
121阅读
2评论
没有音乐和音效的游戏是没有灵魂的,这回讲解如何处理背景音乐及跳跃音效。加载music及sound的方法,之前已经写过,见:pygame 笔记-8 背景音乐&子弹音效 。
先介绍一个很棒的生成各种音效的网站:https://www.bfxr.net/,该网站提供了一个音效生成器,界面如下:
利用该工具,可以生成各种跳跃、爆炸之类的音效wav文件。
然后就是背景音乐了,pygame支持
转载
2019-03-17 12:46:00
108阅读
2评论
通常在多玩家的游戏中,每个玩家都会有自己的得分,最高分数会成为该游戏的最佳记录。这一篇,学习下如何记录最高得分:(为了简化代码,本文采用文件方式,仅记录本机得分,明白原理后,可以将得分保存在云端或数据库中,就可能支持多玩家了)。首先要在settings.py中新建一个常量:HIGH_SCORE_FILE = "../data/high_score.txt"目录结构参考下图:然后main.
转载
2019-02-17 12:13:00
245阅读
2评论
这个游戏叫jumpy,大致玩法就是模拟超级玛丽一样,可以不停在各个档板上跳动,同时受到重力的作用,会向下掉,如果落下时,没有站在档板上,就挂了。这节,我们加入重力因素,继续改造sprites.pyfrom part_03.settings import *import pygame as pgvec = pg.math.Vector2class Player(pg.sprite.Spri
转载
2019-01-20 21:23:00
68阅读
2评论
武侠小说中,高手过招讲究起手式,所谓"行家一伸手,便知有没有"。程序开发、软件架构中,也是类似的道理,当业务逻辑越来越复杂,代码越来越多时,一个好的项目结构,从目录命名、模块分层这些,从一开始就决定了后面的代码是否易于维护。所以这节主要讨论下,游戏中如何组织自己的代码,回忆上节学到的最小开发框架(即:模板),一个游戏大致可以分为以下几个标准处理过程:__init__() 初始化new()
转载
2019-01-20 20:18:00
43阅读
2评论
上一节,我们整理了一个游戏开发的新框架(即:Game类),本节将运用这个框架,实现基本的加速度及摩托力效果。先定义游戏的精灵(下面代码命名为sprites.py)from part_02.settings import *import pygame as pg# Vector可以看成(x,y)的封装vec = pg.math.Vector2class Player(pg.sprite.S
转载
2019-01-20 20:55:00
91阅读
2评论