ARCADE MakeCode 之叠羊罗汉游戏代码解读
这是一个基于ARCADE MakeCode的"叠羊罗汉"平衡游戏,玩家需要控制山羊叠放在一起而不倒塌。解读代码如下:
1. 自定义精灵类型
python
- @namespace
-
- class SpriteKind:
-
- Mountain = SpriteKind.create() # 已经落下的山羊
-
- Goat = SpriteKind.create() # 正在移动的山羊
复制代码
2. 放下山羊函数
python
- def drop_goat():
-
- moving_goat.ay = 300 # 启用重力
-
- moving_goat.vx = 0 # 停止水平移动
-
- moving_goat.set_flag(SpriteFlag.BOUNCE_ON_WALL, False) # 关闭墙壁反弹
-
-
-
- def on_a_pressed():
-
- drop_goat() # A键按下时放下当前山羊
-
-
-
- controller.A.on_event(ControllerButtonEvent.PRESSED, on_a_pressed)
复制代码
3. 平衡检测函数
检查整个堆栈是否会倒塌
python
- def will_the_stack_fall_down_():
-
- global mountain_goats, center_of_gravity
-
- mountain_goats = sprites.all_of_kind(SpriteKind.Mountain) # 获取所有已落下的山羊
-
- center_of_gravity = 0
-
- for value in mountain_goats:
-
- center_of_gravity += value.x # 计算所有山羊的x坐标总和
-
-
-
- # 如果重心超出底部山羊的左右边界,则堆栈会倒塌
-
- if center_of_gravity / len(mountain_goats) < bottom_goat.left or center_of_gravity / len(mountain_goats) > bottom_goat.right:
-
- return True
-
- return False
复制代码
检查单个山羊是否会掉落
python
- def will_the_goat_fall_off(falling_goat: Sprite, mountain_goat: Sprite):
-
- if falling_goat.x > mountain_goat.right: # 山羊超出右侧边界
-
- falling_goat.set_velocity(50, -50) # 设置掉落速度和方向
-
- falling_goat.set_flag(SpriteFlag.GHOST, True) # 变为幽灵状态(可穿透)
-
- falling_goat.set_flag(SpriteFlag.AUTO_DESTROY, True) # 自动销毁
-
- info.change_life_by(-1) # 减少生命值
-
- return True
-
- elif falling_goat.x < mountain_goat.left: # 山羊超出左侧边界
-
- falling_goat.set_velocity(-50, 50) # 设置掉落速度和方向
-
- falling_goat.set_flag(SpriteFlag.GHOST, True)
-
- falling_goat.set_flag(SpriteFlag.AUTO_DESTROY, True)
-
- info.change_life_by(-1)
-
- return True
-
- else:
-
- return False # 山羊安全落在平台上
复制代码
4. 碰撞检测
python
- def on_hit_wall(sprite, location):
-
- if sprite.is_hitting_tile(CollisionDirection.BOTTOM): # 如果山羊碰到底部墙壁
-
- game.over(False) # 游戏结束
-
-
-
- scene.on_hit_wall(SpriteKind.Goat, on_hit_wall)
-
复制代码
5. 山羊堆栈**效果
python
- def explode_goats():
-
- global current_goat
-
- current_goat = bottom_goat # 从底部山羊开始
-
- while current_goat:
-
- current_goat.set_flag(SpriteFlag.GHOST, True) # 变为幽灵状态
-
- # 设置随机速度,产生**效果
-
- current_goat.set_velocity(randint(-200, 200), randint(-200, 200))
-
- # 获取堆叠在上面的山羊
-
- current_goat = sprites.read_data_sprite(current_goat, "goat on top of me")
-
- scene.camera_follow_sprite(None) # 取消相机跟随
-
复制代码
6. 山羊重叠事件处理(核心逻辑)
python
- def on_on_overlap(sprite2, otherSprite):
-
- global goat_fell_off, top_goat
-
- sprite2.vy = 0 # 停止垂直移动
-
- sprite2.ay = 0 # 取消重力
-
- sprite2.set_kind(SpriteKind.Mountain) # 变为已落下的山羊
-
-
-
- # 检查山羊是否会掉落
-
- goat_fell_off = will_the_goat_fall_off(sprite2, otherSprite)
-
- if goat_fell_off:
-
- sprite2.start_effect(effects.fire) # 播放火焰效果
-
- elif will_the_stack_fall_down_(): # 检查整个堆栈是否会倒塌
-
- # 记录山羊堆叠关系
-
- sprites.set_data_sprite(otherSprite, "goat on top of me", sprite2)
-
- explode_goats() # **效果
-
- pause(1000)
-
- game.over(False) # 游戏结束
-
- else:
-
- top_goat = sprite2 # 更新顶部山羊
-
- scene.camera_follow_sprite(sprite2) # 相机跟随新顶部山羊
-
- # 记录山羊堆叠关系
-
- sprites.set_data_sprite(otherSprite, "goat on top of me", sprite2)
-
-
-
- make_a_new_goat() # 创建新的山羊
-
-
-
- sprites.on_overlap(SpriteKind.Goat, SpriteKind.Mountain, on_on_overlap)
复制代码
7. 创建新山羊函数
python
- def make_a_new_goat():
-
- global moving_goat
-
- # 随机选择山羊种类
-
- moving_goat = sprites.create(goat_species[randint(0, len(goat_species) - 1)],
-
- SpriteKind.Goat)
-
- moving_goat.set_position(80, top_goat.y - 30) # 放在顶部山羊上方
-
- moving_goat.set_flag(SpriteFlag.BOUNCE_ON_WALL, True) # 开启墙壁反弹
-
- moving_goat.vx = 40 # 设置水平移动速度
复制代码
8. 山羊种类定义
代码中定义了6种不同样式的山羊图像,增加了游戏的多样性。
9. 游戏初始化
python
- scene.set_background_color(9) # 设置背景颜色
-
- tiles.set_tilemap(tilemap("级别1")) # 设置地图
-
-
-
- # 创建初始山羊
-
- goat = sprites.create(..., SpriteKind.Mountain)
-
- goat.ay = 300 # 启用重力
-
- goat.set_position(80, 600) # 设置位置
-
- scene.camera_follow_sprite(goat) # 相机跟随
-
- top_goat = goat # 设置顶部山羊
-
- make_a_new_goat() # 创建新山羊
-
-
-
- how_much_does_a_goat_weigh = 22 # 山羊重量(可能用于后续扩展)
-
- info.set_life(3) # 设置初始生命值
-
- bottom_goat = goat # 设置底部山羊
-
复制代码
游戏机制总结
控制方式:山羊左右移动,按A键放下
平衡系统:计算堆栈重心,如果超出底部山羊边界则倒塌
生命系统:山羊掉落减少生命值,生命值为0时游戏结束
堆叠关系:使用数据存储记录山羊之间的堆叠关系
视觉效果:掉落的山羊有火焰效果,倒塌时有**效果
相机跟随:相机始终跟随最顶部的山羊
这是一个有趣的物理平衡游戏,玩家需要精确控制放下山羊的时机和位置,以保持堆栈的平衡。游戏通过重心计算和物理效果实现了真实的堆叠体验。
|