以下是一个 Flappy Bird 风格游戏 的 Kivy 示例。这个游戏与之前的示例不同,展示了如何使用 Kivy 实现一个简单的 2D 游戏,包括玩家控制、障碍物生成和碰撞检测。
游戏简介
- 游戏目标:控制小鸟飞行,穿过障碍物之间的空隙,避免撞到障碍物或地面。
- 游戏规则:
- 点击屏幕或按下空格键使小鸟上升。
- 小鸟会不断下落,玩家需要通过点击屏幕或按下空格键来保持飞行。
- 每穿过一对障碍物,得分加 1。
- 如果小鸟撞到障碍物或地面,游戏结束。
代码实现
以下是完整的 Kivy Flappy Bird 风格游戏代码:
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.properties import NumericProperty, ReferenceListProperty, ObjectProperty
from kivy.vector import Vector
from kivy.clock import Clock
from kivy.core.window import Window
from random import randint
class Bird(Widget):
velocity_y = NumericProperty(0) # 小鸟的垂直速度
gravity = NumericProperty(-0.5) # 重力
def move(self):
self.velocity_y += self.gravity # 应用重力
self.y += self.velocity_y # 更新小鸟的位置
def jump(self):
self.velocity_y = 5 # 点击屏幕时小鸟上升
class Pipe(Widget):
gap = 200 # 障碍物之间的空隙
velocity_x = NumericProperty(-3) # 障碍物的水平速度
def move(self):
self.x += self.velocity_x # 更新障碍物的位置
class FlappyGame(Widget):
bird = ObjectProperty(None) # 小鸟
pipes = [] # 障碍物列表
score = NumericProperty(0) # 得分
game_over = False # 游戏是否结束
def __init__(self, **kwargs):
super(FlappyGame, self).__init__(**kwargs)
self._keyboard = Window.request_keyboard(self._keyboard_closed, self)
self._keyboard.bind(on_key_down=self._on_keyboard_down)
Clock.schedule_interval(self.update, 1.0 / 60.0) # 游戏循环
def update(self, dt):
if not self.game_over:
self.bird.move()
# 生成障碍物
if len(self.pipes) == 0 or self.pipes[-1].x < self.width - 300:
self.generate_pipes()
# 移动障碍物
for pipe in self.pipes[:]:
pipe.move()
if pipe.x < -pipe.width: # 移除屏幕外的障碍物
self.remove_widget(pipe)
self.pipes.remove(pipe)
# 检测碰撞
if self.check_collision():
self.game_over = True
def generate_pipes(self):
# 生成一对障碍物
gap_y = randint(100, self.height - 300)
pipe_top = Pipe(pos=(self.width, self.height - gap_y))
pipe_bottom = Pipe(pos=(self.width, 0), size=(50, gap_y - self.bird.gap))
self.pipes.extend([pipe_top, pipe_bottom])
self.add_widget(pipe_top)
self.add_widget(pipe_bottom)
def check_collision(self):
# 检测小鸟是否撞到地面或障碍物
if self.bird.y < 0 or self.bird.y > self.height - self.bird.height:
return True
for pipe in self.pipes:
if self.bird.collide_widget(pipe):
return True
return False
def on_touch_down(self, touch):
if not self.game_over:
self.bird.jump()
def _keyboard_closed(self):
self._keyboard.unbind(on_key_down=self._on_keyboard_down)
self._keyboard = None
def _on_keyboard_down(self, keyboard, keycode, text, modifiers):
if keycode[1] == 'space' and not self.game_over:
self.bird.jump()
return True
class FlappyApp(App):
def build(self):
game = FlappyGame()
return game
if __name__ == '__main__':
FlappyApp().run()
代码说明
- Bird:表示小鸟,具有垂直速度和重力属性。
- Pipe:表示障碍物,具有水平速度和空隙属性。
- FlappyGame:游戏主逻辑,包括小鸟的移动、障碍物的生成和碰撞检测。
- FlappyApp:Kivy 应用的主类,负责启动游戏。
运行游戏
- 将代码保存为
flappy_game.py
。 - 在终端中运行:
python flappy_game.py
- 点击屏幕或按下空格键使小鸟上升,穿过障碍物之间的空隙。
游戏截图
- 初始界面:小鸟在屏幕中央,障碍物从右侧生成。
- 游戏进行中:小鸟穿过障碍物,得分增加。
- 游戏结束:小鸟撞到障碍物或地面,游戏停止。
扩展功能
- 增加难度:随着得分增加,障碍物的移动速度加快或空隙变小。
- 添加音效:小鸟跳跃或碰撞时播放音效。
- 移动端适配:优化触摸事件,方便移动端玩家操作。
- 高分记录:保存玩家的最高分数。
打包为 APK
如果需要将游戏打包为 APK,可以参考之前的步骤,使用 Buildozer 进行打包。
通过这个示例,你可以学习如何使用 Kivy 开发 Flappy Bird 风格的游戏,并在此基础上扩展更多功能!