鱼C论坛

 找回密码
 立即注册
查看: 1667|回复: 74

[作品展示] Pygame经典i wanna跑酷引擎

[复制链接]
发表于 2026-6-23 22:57:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 andy大宝 于 2026-9-26 20:17 编辑

统一回复【直接复制能跑吗】
这个引擎程序不能直接跑,需要下载附件后运行附件内的py文件

首先,感谢Pygame纯画笔弹幕游戏(复制即玩)中鱼油们的鼓励和支持,看到各位热情捧场,我真的成就感满满
在这之后呢,萌新信心爆棚,猛啃碰撞检测,计划写一个无爬墙跑酷引擎
刚思考完框架,准备动手
结果……紧接着就在论坛上发现了这个:用Python做一个跑酷游戏
兴致全无(本来想整一个震撼首发)
美好的想法搁置了近10个月

现在正好放超长暑假(我26年高考),待在家里实在无聊,然后就想到了这个计划。
毕竟,这个帖子里Twilight6的话触动了我:
很棒,论坛就需要这种学习良性竞争的氛围!!!

既然有人已经实现,那就超越

我把目光投向了我最喜欢的跑酷游戏之一 ——i wanna
要实现 i wanna 跑酷引擎,有几个额外的问题必须攻克:


1.i wanna 的地图刷新模式以单个角色(如block, killer, save)为单位,将不同单位放置在棋盘格上,这就需要用到二维数组。然而(据我所知)Python 并没有现成的二维数组
解决方式:在文本文档内模拟二维数组,既满足地图刷新模式,又提高了关卡编辑的自由度


2.i wanna 跑酷引擎中跳跃时按住跳跃键可以增大跳跃高度,但有一定限度
解决方式:用一个变量对按住跳跃键的帧数计数,达到一定值时取消高度增加


3.i wanna 跑酷引擎支持二段跳,但空中只能多跳一次
解决方式:分类讨论,结合 player 是否碰到 block,讨论过程较复杂,详见代码


好了,下面是代码预览,作品文件和作品介绍

  1. import pygame as pg
  2. import sys

  3. #pygame初始化
  4. pg.init()
  5. clock = pg.time.Clock()

  6. #加载角色图片
  7. player_image = pg.image.load('player.png')

  8. #设置窗口(长25×32=800,宽15×32=480)
  9. window = pg.display.set_mode((800,480))
  10. pg.display.set_caption("i wanna引擎")

  11. #与跑酷算法相关的变量初始化
  12. vy = 0                      #垂直方向移速
  13. jump_num = 2                #跳跃段数
  14. jump_hold = False           #是否按住跳跃键
  15. hold_time = 0               #跳跃键按住时间

  16. #与游戏控制相关的变量初始化
  17. change_level = True         #是否进入下一关
  18. level_num = 0               #关卡数

  19. #读取关卡(0代表空气,1代表墙,2代表岩浆)
  20. level = []
  21. level_code = ''
  22. with open('level.txt') as f:
  23.     for each_line in f:
  24.         if each_line == '=\n':
  25.             level.append(level_code)   
  26.             level_code = ''
  27.         else:
  28.             level_code = '{0}{1}'.format(level_code, each_line[:25])
  29.         
  30. #获得字体
  31. font = pg.font.Font(None,35)

  32. #定义方块类
  33. class Obj(pg.sprite.Sprite):
  34.     def __init__(self, sprite_num, position):
  35.         pg.sprite.Sprite.__init__(self)
  36.         self.num = sprite_num
  37.         if sprite_num == '1':
  38.             self.image = pg.image.load('block.png').convert_alpha()
  39.         elif sprite_num == '2':
  40.             self.image = pg.image.load('killer.png').convert_alpha()
  41.         self.rect = self.image.get_rect()
  42.         self.rect.left, self.rect.top = position

  43. #定义玩家类
  44. class Player(pg.sprite.Sprite):
  45.     def __init__(self, postiton, image):
  46.         pg.sprite.Sprite.__init__(self)
  47.         self.image = image
  48.         self.rect = self.image.get_rect()
  49.         self.rect.left, self.rect.top = position
  50.     def move(self,vx,vy):
  51.         self.rect = self.rect.move([vx,vy])

  52. while True:
  53.     #加载关卡
  54.     if change_level == True:
  55.         change_level = False
  56.         level_num += 1
  57.         objs = []
  58.         group_block = pg.sprite.Group()
  59.         group_killer = pg.sprite.Group()
  60.         w = -1
  61.         h = 0
  62.         for i in level[level_num - 1]:
  63.             w += 1
  64.             if w == 25:
  65.                 w = 0
  66.                 h += 1
  67.             if i != '0':
  68.                 position = w*32, h*32
  69.                 obj = Obj(i,position)
  70.                 objs.append(obj)
  71.                 if i == '1':
  72.                     group_block.add(obj)
  73.                 elif i == '2':
  74.                     group_killer.add(obj)
  75.         position = 50, 400
  76.         player = Player(position, player_image)   

  77.     #处理按键事件
  78.     for ev in pg.event.get():
  79.         if ev.type == pg.QUIT:
  80.             pg.quit()
  81.             sys.exit()
  82.         
  83.     keys = pg.key.get_pressed()
  84.     #跳跃
  85.     if keys[pg.K_w]:
  86.         hold_time += 1
  87.         if jump_num > 0:
  88.             if jump_hold == False:
  89.                 jump_hold = True
  90.                 vy = -4
  91.                 jump_num -= 1
  92.             elif hold_time <= 15:
  93.                 vy = -4
  94.         elif jump_hold == True and hold_time <= 12:
  95.             vy = -4
  96.     else:
  97.         hold_time = 0
  98.         jump_hold = False
  99.     #左右移动
  100.     if keys[pg.K_a]:
  101.         player.move(-3,0)
  102.         while pg.sprite.spritecollide(player, group_block, False):
  103.             player.move(1,0)
  104.     if keys[pg.K_d]:
  105.         player.move(3,0)
  106.         while pg.sprite.spritecollide(player, group_block, False):
  107.             player.move(-1,0)

  108.     #玩家运动处理(垂直方向)
  109.     player.move(0,vy)
  110.     if vy < 8:
  111.         vy += 0.5
  112.     if pg.sprite.spritecollide(player, group_block, False):
  113.         if vy >= 0:
  114.             while pg.sprite.spritecollide(player, group_block, False):
  115.                 player.move(0,-1)
  116.             jump_num = 2
  117.         else:
  118.             while pg.sprite.spritecollide(player, group_block, False):
  119.                 player.move(0,1)
  120.         vy = 0
  121.     #空中仅一段跳
  122.     if vy > 1 and jump_num == 2:
  123.         jump_num = 1

  124.     #死亡判定
  125.     if pg.sprite.spritecollide(player, group_killer, False) or player.rect.left < 0:
  126.         player = Player(position, player_image)

  127.     #通关判定
  128.     if player.rect.right > 800:
  129.         change_level = True
  130.   
  131.     #绘制窗口
  132.     window.fill("white")

  133.     #绘制角色
  134.     for each in objs:
  135.         window.blit(each.image, each.rect)
  136.     window.blit(player_image, player.rect)

  137.     #画面更新
  138.     pg.display.update()

  139.     #设置帧率
  140.     clock.tick(60)   
复制代码
文件: iwanna跑酷引擎.rar (2.87 KB, 下载次数: 6)
规则:
AD移动,W跳跃(跳跃高度与按住时长有关),可二段跳,碰到红色或玩家出左边界时死亡,玩家出右边界时进入下一关
作为一个跑酷引擎,游戏内没有提供完整的关卡包,仅对游戏机制作介绍用
游戏截图:

第一关

第一关

第二关

第二关

you win

you win

关于bug与可玩性:
在我电脑上运行的时候,游戏一开始总是会出现轻微卡顿,随后就好了,不知道是什么原因
附件里面有一个文本文档,打开后可以自己编辑关卡,编辑方式很简单,你读完代码秒懂(不懂的话也欢迎来问)


顺便说,代码的37行有一个设置字体,这是我调试变量时留下的,你可以用下面这行代码将变量实时显示在屏幕上:
  1. window.blit(font.render("变量名:%s" % 变量名,True,"black"),(20,20))
复制代码
之后时间我的作品可能会更新(如建立严谨的关卡包),感兴趣的鱼油可以时常关注一下







评分

参与人数 3荣誉 +9 鱼币 +11 贡献 +9 收起 理由
cjjJasonchen + 5 + 5 + 3 鱼C有你更精彩^_^
smallwh + 2 + 3 + 3 感谢楼主无私奉献!
小甲鱼的二师兄 + 2 + 3 + 3 鱼C有你更精彩^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2026-6-23 23:04:08 | 显示全部楼层
有人能提供关卡包吗,我突然有点想玩自己写的游戏了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-6-26 19:02:27 | 显示全部楼层

回帖奖励 +2 鱼币

嘿嘿,就喜欢这种有点抽象的游戏~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-6-26 19:09:59 From FishC Mobile | 显示全部楼层
学到了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-6-26 19:10:16 From FishC Mobile | 显示全部楼层
复制直接跑吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-6-26 19:10:36 From FishC Mobile | 显示全部楼层
强
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2026-6-26 19:10:55 From FishC Mobile | 显示全部楼层

回帖奖励 +2 鱼币

我来打卡学习啦
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-6-26 19:11:05 | 显示全部楼层
啊?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2026-6-26 19:11:15 From FishC Mobile | 显示全部楼层
能复制直接跑吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-6-26 19:11:16 From FishC Mobile | 显示全部楼层
学到了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-6-26 19:11:32 From FishC Mobile | 显示全部楼层
有时间玩一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-6-26 19:11:35 From FishC Mobile | 显示全部楼层

回帖奖励 +2 鱼币

学习学习
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-6-26 19:11:45 From FishC Mobile | 显示全部楼层
有点抽象
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-6-26 19:11:53 From FishC Mobile | 显示全部楼层
强得可怕,我什么时候能这么强啊!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-6-26 19:13:17 From FishC Mobile | 显示全部楼层
这个是不是画面改一下,就更高大上了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-6-26 19:13:21 From FishC Mobile | 显示全部楼层

回帖奖励 +2 鱼币

学到了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-6-26 19:13:33 | 显示全部楼层
好强啊!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-6-26 19:14:15 From FishC Mobile | 显示全部楼层

回帖奖励 +2 鱼币

完蛋了,每次分享的都是看不懂,要加紧学习了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-6-26 19:14:16 From FishC Mobile | 显示全部楼层
加油,好好干,万丈高楼平地起
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-6-26 19:14:50 From FishC Mobile | 显示全部楼层

回帖奖励 +2 鱼币

还有这种引擎
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-10-11 07:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表