Python 代码超级玛丽实现

游戏 游戏 1702 人阅读 | 0 人回复

<
很多人正在问M一个劲是甚么,固然是我名字,当前我便用CSDN上的名字吧。
好了,行回正传,费时3个月,终究做出了超级玛丽。
先道缺陷,出有level 2,level 3,level 4闭。
绿衣服人出做好,期望有人能帮我更新一下。
其他的就能够道是如出一辙了。
没有懂python的看过去,_pycache_是主动天生的。
我会把screenshot.png,data文件夹,resources文件夹正在末端收回去,剩下的,main.py, mario_level_1.py文中有代码。
看截图:

212616daih00izn2onw282.jpg

文件格局:
 
212616j647t9b4a6bs0aab.png


 data:
212616zwrfdwrcd0j0cgdf.jpg

data----components:
212616ezzi2iqgg11puqr5.jpg

data----states:
212617riq2me0zln2ei2s7.png

 resources我会正在末端收素材。
上代码:
main.py
  1. """
  2. 事情室:凌天
  3. 做者:凌天_总管
  4. 日期:2021年8月30日
  5. 工夫:20:52:35
  6. """
  7. import zipfile
  8. import os
  9. print("""← → ↓ 操控 A腾跃,S进犯,回车键开端
  10. 注:助跑小段间隔跳的更下
  11. """)
  12. file_list = os.listdir(r&#39;.&#39;)
  13. for file_name in file_list:
  14.     if os.path.splitext(file_name)[1] == &#39;.zip&#39;:
  15.         file_zip = zipfile.ZipFile(file_name, &#39;r&#39;)
  16.         for file in file_zip.namelist():
  17.             file_zip.extract(file, r&#39;.&#39;)
  18.         file_zip.close()
  19.         os.remove(file_name)
  20.         
  21. import sys
  22. import pygame as py
  23. from data.main import main
  24. import cProfile
  25. if __name__==&#39;__main__&#39;:
  26.     main()
  27.     py.quit()
  28.     sys.exit()
复造代码
mario_level_1.py
  1. #!/usr/bin/env python
  2. __author__ = &#39;凌天_总管&#39;
  3. """
  4. This is an attempt to recreate the first level of
  5. Super Mario Bros for the NES.
  6. """
  7. import sys
  8. import pygame as pg
  9. from data.main import main
  10. import cProfile
  11. if __name__==&#39;__main__&#39;:
  12.     main()
  13.     pg.quit()
  14.     sys.exit()
复造代码
data中要用到的几面:
1. 绘里战脚色的导进

创立屏幕、从图片中导进Mario
2. 脚色的降天、腾跃战挪动

正在那之前要处理一下Mario怎样才气站正在我们界说的空中上关于脚色的腾跃,必然要对其形态减以限定,让其必需正在 "降天" 的形态下才气开端腾跃,否则便会发生上面的状况
212617phm3cvqh8hmhxqx2.gif


3. 脚色的行动图片的切换

那里的图片正在素材包里,resources我会同一收给各人
图片的切换,一开端我是接纳一帧换一张图片的标的目的
但厥后正在运转的时分我发明了一个让人无语的结果:
图片展现没有出去,那个结果那是因为我的图片是每帧一换,快的让人反响不外去,发生了这类让人苦笑没有得的结果(请自止脑补)。
处理办法便是引进的一些常量系数工夫戳,经由过程Mario的挪动速率去掌握图片切换,让其愈加天然光滑。
4. 布景图片的转动

原来布景的挪动仍是比力简朴的,一如飞机年夜战战flappy bird游戏,只需求当脚色的地位超出屏幕参数的某个值(如2/3)时,脚色的地位没有再相对的挪动,而是将脚色是位移反背的减到布景上,经由过程布景的撤退退却就能够完成脚色的相对挪动。
当正在超级玛丽中很较着是没有合用的,由于全部闭卡上定位了很多砖块,管讲战门路,布景的撤退退却只能改动Mario相对的坐标,但尽对的坐标是没有发作任何变革的,那便很洪水仄上影响了Mario战一些物体的地位的碰碰的判定。
正在那里便需求用到一种临时称为镜头挪动的妙技,也便是对surface类的blit办法的参数的调解
看结果:
212617l9j6nc4cstlojtj4.png

很较着布景也挪动了,Mario也挪动了,但看上来仿佛是布景挪动的太缓了逃没有上Mario。但正在调解了Mario的速率后发明成绩底子没有是出正在那里。
成绩的泉源正在于: 我们将布景画造正在屏幕上,再将Mario画造正在屏幕上,如许Mario便是相对屏幕的速率,那末他是必定会永久超出屏幕的。那里我们需求做的是将Mario画造到布景上,再将布景画造到屏幕上,那也是我找了良久的法子。但刚快乐出多暂便成了如许:
212618j29n335onvw51o63.gif

成绩呈现的泉源便是我们每帧皆将Mario的形态画造到布景上,每帧皆被我们布景保存了下去。不外那考证了我们之前的设法,最少我们的屏幕转动跟上了
即然是如许,那我们便每次皆弄一个新布景没有就行了!一开端我是接纳每次皆导进布景,新建并放年夜到屏幕大小,但如许事情量太年夜便会发生我们游戏中一个很厌恶的情形:失落帧。那末我们就能够用pygame.Surface.copy()那个办法,只正在减载游戏的时分减载布景,每帧只需求对布景停止拷贝一份就能够了。
5. 项目标重构

正在完成了年夜部门的根底的事情以后,便不能不需求思索一下全部项目标从头架构了,究竟结果那个项目正在我们开端动手以后才发明他的逻辑仍是比力冗杂的,从头的构架能够帮我们更好的模块解耦,便利阅览可增长新的板块。
本项目标代码估量得有三四千止吧,他的项目构建能够道是很详尽,大致分别了十几个文件。我那边也给代码大致分了一下类,理一下全部游戏的思绪。
6. 空中、管讲战台阶

固然正在全部布景中存正在那三样工具,但我们并出有他们的数据,也便不克不及停止碰碰检测等操纵
那里我们界说了一个类去创立那三个真例工具,得到他们的矩形边框参数。
7. 碰碰的检测战处置

那里的处置历程是比力庞大的,以是分为两个标的目的别离处置。碰碰的处置是非常讲求细节的,那里便不外多的赘述,假如出有处置好便会发生很多奇异的的工具,好比:
212618ezxyx7e6jeov90jj.gif

8. 最初

到了那里信赖各人曾经拆建好了全部游戏的框架战根本逻辑,关于砖块、金币、蘑菇战黑龟,另有变年夜变小战水球结果那边便没有赘述了,接着挖进框架里就好了。
接下去便是代码了:
链接: https://pan.百度.com/s/1__Bxmi9GGR6GlI385FAB9w
提与码: 扫描下圆两维码进群支付
212618gcru644gn5uq1ydk.jpg

 

免责声明:假如进犯了您的权益,请联络站少,我们会实时删除侵权内乱容,感谢协作!
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,按照目前互联网开放的原则,我们将在不通知作者的情况下,转载文章;如果原文明确注明“禁止转载”,我们一定不会转载。如果我们转载的文章不符合作者的版权声明或者作者不想让我们转载您的文章的话,请您发送邮箱:Cdnjson@163.com提供相关证明,我们将积极配合您!
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并自负版权等法律责任。
回复 关闭延时

使用道具 举报

 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则