# 儿童pygame启蒙 **Repository Path**: jangojing/child-pygame ## Basic Information - **Project Name**: 儿童pygame启蒙 - **Description**: 给我女儿6岁做游戏启蒙的一个项目,我会每周给我女儿讲课,并且更新这个项目。目标是做一个马里奥的小demo。 - **Primary Language**: Python - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 5 - **Forks**: 3 - **Created**: 2022-05-16 - **Last Updated**: 2025-02-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # child-pygame ## 介绍 给我女儿6岁做游戏启蒙的一个项目,我会每周给我女儿讲课,并且更新这个项目。目标是做一个马里奥的小demo,可以控制马里奥前后移动,可以跳跃。 ## 安装教程(事前准备家长帮忙准备环境) 1. 安装python 3.x 2. 在python中安装pygame ``` pip install pygame ``` 3. 安装vscode或其他python的编辑器 ## 第一课 HelloWorld,显示马里奥在屏幕上 由于是针对小孩子的,helloWorld就不适合用文字,要直接给孩子看到他能看懂的东西。所以选择了在屏幕上显示一个马里奥。 ### 目标 1. 理解画布概念 2. 理解在画布上贴一个马里奥的过程 3. 理解如何通过X,Y来控制马里奥所在位置,并能调整参数将马里奥放到画布底部 ### 画布概念 1. 就好比是在纸上画画 2. 我们可以定义这张纸有多大,他长多少宽多少 3. 自行设置纸张的大小看效果,最终我们设置一个800*800的正方形画布(因为我电脑显示屏小) 4. 画布也可以是彩色的纸,譬如小朋友在彩纸上画画 5. 通过色盘选取喜欢的颜色,复制RGB颜色到代码里,运行代码看效果 5 ### 怎么画一个马里奥 1. 其实并不是画一个马里奥,而是我们有一个马里奥贴纸 2. 把马里奥贴纸贴到纸上的动作,就是我们要告诉代码,先找到马里奥贴纸 3. 初次贴到屏幕上,贴纸特别大,怎么办呢,我们可以放大缩小贴纸来解决,我们可以设置马里奥贴纸的大小是150像素*150像素 4. 把贴纸贴到纸上,贴到纸上什么位置呢?通过下一节来解决 ### X,Y来控制马里奥贴纸的位置 1. 我们把画布的左上角定义为0,0 2. 如果要马里奥横向移动,就修改马里奥的位置的第一个值,变大就可以,他表示距离左边的距离多少个像素 3. 如果变的特别大,比画布还大会怎么样,小朋友们自己试一试 4. 如果要马里奥放到画布的下面,就应该修改第二个值,变大就可以,他表示距离顶部的距离多少个像素 5. 如何让马里奥正好在画布的最下面呢?让小朋友自己不断尝试调整数值,最终引出算式800-150,得到650的位置。 ## 第二课 让马里奥自己移动 ### 目标 1. 理解马里奥移动的原理 2. 提出循环的概念,让马里奥跑起来 3. 贴新贴纸之前去除之前的马里奥贴纸,解决马里奥移动拖影的问题 4. 提出判断的概念,解决马里奥移动跑出屏幕外的问题 ### 做个实验 1. 在纸上移动马里奥贴纸 2. 测量马里奥贴纸距离左边的距离和上边的距离 3. 观察并总结如果距离左边的距离越来越大,马里奥是向什么方向移动 4. 上边的距离同理 ### 循环,如何让马里奥自己动起来 1. 循环,就是一直做一件事 2. 打开计算器,做1+1+1+1+1的操作,就是循环,不停做同一个事情+1 3. 如果对马里奥贴纸的位置的第一个参数自动变大就可以让他向右移动 4. 引入变量,在循环中对其进行+1的操作 ### 马里奥移动拖影的问题 1. 其实我们每次都是贴了一个新的贴纸在画布里 2. 那如何清除之前的马里奥贴纸呢? 橡皮擦,可是在这个代码中我们没有橡皮擦 3. 是不是可以从新填充一下画布的背景色,然后贴一个新的贴纸 ### 马里奥跑出去了,如果到边上就回去 1. 发现马里奥会跑出去,再也不会跑回来了 2. 用自己的话表达,就是不要跑出去,再明确一点,就是当马里奥跑到边上时,就停止 3. 用代码表达,就是if(马里奥到边上) 就停止 4. 马里奥到边上,我们如何用一个数学公式去表达? 观察横轴的移动,有一个数字会越来越大,最后超过了我们画布的大小(800) 5. 引入判断,写出if语句,x>800,不是很完美,再次引导计算得出650 6. 停止该如何表达?x不要加1,那用代码如何去表达呢? x=650,x=x-1,x=0 根据小朋友们的想象,让他们去实验 ## 第三课 根据键盘的输入控制马里奥左右移动 ### 目标 1. 理解键盘输入 2. 理解键盘输入左右,对横轴的x应该做什么运算 3. 当我们一直按右,马里奥会跑出去 ### 键盘输入 1. 我们在键盘上按下的每一个按键,电脑都会接收到一个对应的数值,举个例子,我们按空格就是32 2. 我们在代码里如何获取当前是否按下了左右 ### 输入左右后,应该对横轴X做什么运算 1. 在纸上放马里奥贴纸,测量贴纸跟左边的距离 2. 模拟按键盘右后,贴纸应该往什么方向移动 3. 移动后,测量贴纸距离左边的距离,比较2个距离之间的关系 4. 当我们按下键盘右后,应该对X做加法的操作,加多少就是移动多少个像素点 5. 进一步同理,按下键盘左后,应该对X做什么操作 ### 当我们一直按右,马里奥会跑出去 1. 当一直按右,马里奥会跑出去哎 2. 上一节课马里奥自动跑的时候,他也会跑出去 3. 继续强化判断的使用,如果马里奥的X超过650,那么他就不能再往外跑了。 ## 第四课 空格键控制马里奥跳跃 ### 目标 1. 跳跃的键盘响应,以及纵轴的y如何计算 2. 函数是什么 3. 跳跃是一个持续动作 4. 跳跃后的下落 ### 跳跃的键盘响应,以及纵轴的y如何计算 1. 在之前控制左右的代码下面追加一个空格的监听 2. 在纸上放马里奥贴纸,测量贴纸跟顶部的距离 3. 模拟按键盘空格后,贴纸应该往上面方向移动 4. 移动后,测量贴纸距离顶部的距离,比较2个距离之间的关系 5. 想要马里奥向上跳就要对Y进行减法,想要马里奥落下来,就要对Y进行加法 ### 函数是什么 1. 当我们要做一个复杂的事情时,我们把它拆分成几个小的简单的事情去做 2. 跳跃分2个阶段上升跳跃阶段,下落阶段,拆成2个小的简单的阶段去做 3. 当键盘输入空格后,我们设置跳跃中状态 4. 上升阶段我们对y进行减法,跳到指定高度后,我们清除跳跃中状态,让他下落 5. 下落阶段我们对y进行加法,一直到落到底部为止 ### 跳跃是一个持续动作 1. 假设我们按一下空格,马里奥可以跳200个像素点高度,直接y=y-200,实验一下效果 2. 如何将这个持续动作体现出来,我们将一次性跳200个像素高度,改成每次跳10个像素高度,y=y-10 3. 人类语言说跳200个像素点高度,用程序如何表达 ### 跳跃后的下落 1. 当不在跳跃中的话,我们就是在下落的过程中 2. 人类语言说一直下落到底部为止,用程序如何表达 ## 第五课 实现马里奥走路的动作 ### 目标 1. 翻书动画演示,理解帧的概念 2. 传统的实现方式讲解 3. 利用精灵类如何快速实现 ### 翻书动画演示,理解帧的概念 1. 演示翻书动画 2. 书页上每一张图画就是一帧 3. 1秒内连续切换24幅图画以上,即24帧,眼睛就会看到一段连续的动画 ### 传统实现方式讲解 1. 我们准备3张图片,作为马里奥跑步的动作 2. 在移动的同时,除了设置马里奥的x,y坐标外,同时不断的切换3张图片,让眼睛看起来马里奥是在走路 3. 通过设置一个变量i来计数,为了小朋友不理解求余的概念,所以再次使用函数来进行123的数数 ## 第六课 利用精灵类重写马里奥走路动作 ### 目标 1. 理解什么是精灵类,他可以用来干什么 2. 精灵类提供的常用方法 3. 如何利用精灵实现上一讲的马里奥走路动作 ### 什么是精灵类 1. 精灵类就是一个精灵,马里奥是一个精灵,蘑菇是一个精灵,一个砖块都是一个精灵 2. 精灵类的好处类似函数,我们可以只专注于某一个精灵的状态、位置、帧的控制,不必将所有的代码都放在一个文件里 3. 精灵类里面提供了一些所有精灵都会用到的方法,有的方法已经写好了直接可以用,有的方法只是一个空架子,我们要自己来实现 ### 精灵类提供的常用方法 1. update(self,keys)方法,是一个空架子,我们要自己来实现 2. rect属性,是控制精灵位置的一个属性,在update方法中去修改他就可以了 3. 碰撞检测,是已经写好的方法,我们可以方便的判断马里奥是否碰到蘑菇,可以吃掉他,可以踩扁他 4. 加速度和重力加速度等物理相关效果,已经实现好了,我们只需要改变对应方向加速度就可以实现精灵的物理效果 ### 如何利用精灵类实现上一讲的马里奥走路动作 1. 精灵类初始化,定义朝向、跑步帧、当前的状态 2. 加载图片,提前把站立、跑步、跳跃姿态的图片读取到数组中 3. 实现update方法,在update里进行输入判断 4. 在update里实现帧的更新 5. 左右转向的实现 ## 第七课 将原有的马里奥跳跃利用精灵类进行改写 ### 目标 1. 实现跳跃的效果和帧的切换 2. 有限状态机 3. 有限状态机实现跳跃至少100高度 ### 实现跳跃的效果 1. 在update里判断是否按了空格,调用了jump方法在jump方法里做操作,改变current_state为jumping 2. 在update_jump_frame方法里写切换跳跃帧的图片 3. 现在我们碰到一个问题,跳跃的时候,如果输入方向,current_state会立刻变成为running,就不上升了 4. 在下落的时候,也是同样的问题 ### 有限状态机 1. 有限状态机是一个解决状态之间转移和动作行为之间关系的模型 2. 如下图所示,将状态转移和动作行为之间画出图 ![有限状态机](img/change_state.jpg) 3. 用代码实现就是用if判断 ### 有限状态机实现跳跃至少100高度 1. 马里奥原版游戏中,轻按跳跃,马里奥的小跳至少会跳跃到一个高度,长按跳跃最多可以跳到一个高度 2. 当我们需要增加至少跳跃100高度的方案时,我们只需要考虑跳跃状态->下落状态的条件 3. 现在的条件是跳到顶部或者松开空格,在此之上增加一个必选的条件跳跃高度达到100 ## 第八课 引入一个蘑菇敌人 ## 第九课 蘑菇敌人的自动行为 ## 第十课 踩蘑菇碰撞检测 ## 第十一课 回顾(可能没有) # 感谢: 趣派编程 ```【Python趣味教学】99%相似度!手把手教你用Python制作超级玛丽游戏``` https://www.bilibili.com/video/BV1G54y197C2?p=1