鸿蒙(HarmonyOS5)实现跳一跳小游戏

news2025/6/10 18:43:21

下面我将介绍如何使用鸿蒙的ArkUI框架,实现一个简单的跳一跳小游戏。

1. 项目结构

src/main/ets/
├── MainAbility
│   ├── pages
│   │   ├── Index.ets          // 主页面
│   │   └── GamePage.ets       // 游戏页面
│   └── model
│       └── GameModel.ets      // 游戏逻辑
└── resources                  // 资源文件

2. 游戏实现代码

GameModel.ets - 游戏逻辑模型

export class GameModel {
  // 游戏状态
  score: number = 0;
  isJumping: boolean = false;
  currentPosition: number = 0;
  nextPosition: number = 0;
  jumpDistance: number = 0;
  
  // 初始化游戏
  initGame() {
    this.score = 0;
    this.currentPosition = 0;
    this.generateNextPosition();
  }
  
  // 生成下一个平台位置
  generateNextPosition() {
    this.nextPosition = this.currentPosition + 100 + Math.random() * 150;
  }
  
  // 跳跃逻辑
  jump(power: number): boolean {
    if (this.isJumping) return false;
    
    this.isJumping = true;
    this.jumpDistance = power * 2;
    
    // 计算是否成功跳到下一个平台
    const distanceToNext = this.nextPosition - this.currentPosition;
    const isSuccess = Math.abs(this.jumpDistance - distanceToNext) < 20;
    
    if (isSuccess) {
      this.score++;
      this.currentPosition = this.nextPosition;
      this.generateNextPosition();
    }
    
    setTimeout(() => {
      this.isJumping = false;
      if (!isSuccess) {
        // 游戏结束逻辑
      }
    }, 1000);
    
    return isSuccess;
  }
}

GamePage.ets - 游戏页面

import { GameModel } from '../model/GameModel';

@Entry
@Component
struct GamePage {
  private gameModel: GameModel = new GameModel();
  @State power: number = 0;
  @State isCharging: boolean = false;
  
  build() {
    Column() {
      // 分数显示
      Text(`分数: ${this.gameModel.score}`)
        .fontSize(30)
        .margin({ bottom: 20 });
      
      // 游戏区域
      Stack() {
        // 当前平台
        Rect()
          .width(80)
          .height(20)
          .fill(Color.Blue)
          .position({ x: 100, y: 400 });
        
        // 下一个平台
        Rect()
          .width(80)
          .height(20)
          .fill(Color.Red)
          .position({ x: this.gameModel.nextPosition, y: 400 });
        
        // 玩家角色
        Circle()
          .width(30)
          .height(30)
          .fill(Color.Green)
          .position({ 
            x: 100 + this.gameModel.currentPosition,
            y: this.gameModel.isJumping ? 370 - this.power : 370 
          });
      }
      .width('100%')
      .height(500)
      .border({ width: 1, color: Color.Black })
      
      // 控制区域
      Button(this.isCharging ? '释放跳跃' : '按住蓄力')
        .width('80%')
        .height(60)
        .margin({ top: 20 })
        .onTouch((event: TouchEvent) => {
          if (event.type === TouchType.Down) {
            this.isCharging = true;
            const interval = setInterval(() => {
              if (this.power < 100) {
                this.power += 2;
              } else {
                clearInterval(interval);
              }
            }, 50);
          } else if (event.type === TouchType.Up) {
            this.isCharging = false;
            this.gameModel.jump(this.power);
            this.power = 0;
          }
        });
      
      // 力量条
      Progress({ value: this.power, total: 100 })
        .width('80%')
        .margin({ top: 10 });
    }
    .width('100%')
    .height('100%')
    .onAppear(() => {
      this.gameModel.initGame();
    });
  }
}

Index.ets - 主页面

@Entry
@Component
struct Index {
  build() {
    Column() {
      Button('开始游戏')
        .width(200)
        .height(60)
        .onClick(() => {
          router.push({
            url: 'pages/GamePage'
          });
        });
      
      Button('游戏说明')
        .width(200)
        .height(60)
        .margin({ top: 20 })
        .onClick(() => {
          prompt.showToast({
            message: '按住按钮蓄力,释放跳跃到下一个平台'
          });
        });
    }
    .width('100%')
    .height('100%')
    .justifyContent(FlexAlign.Center)
    .alignItems(HorizontalAlign.Center)
  }
}

3. 游戏功能说明

  1. ​游戏机制​​:

    • 玩家通过长按按钮蓄力,释放后角色跳跃
    • 需要准确跳到下一个平台才能得分
    • 跳跃距离由蓄力时间决定
  2. ​实现要点​​:

    • 使用position属性实现角色和平台的定位
    • 通过TouchEvent监听触摸事件实现蓄力控制
    • 使用setInterval实现蓄力条增长
    • 游戏逻辑与UI分离,便于维护
  3. ​扩展建议​​:

    • 添加更多平台类型和障碍物
    • 实现角色跳跃动画
    • 添加音效和背景音乐
    • 实现游戏存档和排行榜功能

4. 运行效果

游戏运行时,玩家会看到:

  1. 绿色圆形代表玩家角色
  2. 蓝色矩形代表当前平台
  3. 红色矩形代表目标平台
  4. 底部有蓄力按钮和力量条
  5. 顶部显示当前得分

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2406937.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++实现分布式网络通信框架RPC(2)——rpc发布端

有了上篇文章的项目的基本知识的了解&#xff0c;现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…

消防一体化安全管控平台:构建消防“一张图”和APP统一管理

在城市的某个角落&#xff0c;一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延&#xff0c;滚滚浓烟弥漫开来&#xff0c;周围群众的生命财产安全受到严重威胁。就在这千钧一发之际&#xff0c;消防救援队伍迅速行动&#xff0c;而豪越科技消防一体化安全管控平台构建的消防“…

VisualXML全新升级 | 新增数据库编辑功能

VisualXML是一个功能强大的网络总线设计工具&#xff0c;专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑&#xff08;如DBC、LDF、ARXML、HEX等&#xff09;&#xff0c;并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…

Sklearn 机器学习 缺失值处理 获取填充失值的统计值

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…

FFmpeg avformat_open_input函数分析

函数内部的总体流程如下&#xff1a; avformat_open_input 精简后的代码如下&#xff1a; int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…

【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道

文/法律实务观察组 在债务重组领域&#xff0c;专业机构的核心价值不仅在于减轻债务数字&#xff0c;更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明&#xff0c;合法债务优化需同步实现三重平衡&#xff1a; 法律刚性&#xff08;债…

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)

目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 ​编辑​编辑 UDP的特征 socke函数 bind函数 recvfrom函数&#xff08;接收函数&#xff09; sendto函数&#xff08;发送函数&#xff09; 五、网络编程之 UDP 用…

从物理机到云原生:全面解析计算虚拟化技术的演进与应用

前言&#xff1a;我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM&#xff08;Java Virtual Machine&#xff09;让"一次编写&#xff0c;到处运行"成为可能。这个软件层面的虚拟化让我着迷&#xff0c;但直到后来接触VMware和Doc…

五子棋测试用例

一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏&#xff0c;有着深厚的文化底蕴。通过将五子棋制作成网页游戏&#xff0c;可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家&#xff0c;都可以通过网页五子棋感受到东方棋类…

GraphQL 实战篇:Apollo Client 配置与缓存

GraphQL 实战篇&#xff1a;Apollo Client 配置与缓存 上一篇&#xff1a;GraphQL 入门篇&#xff1a;基础查询语法 依旧和上一篇的笔记一样&#xff0c;主实操&#xff0c;没啥过多的细节讲解&#xff0c;代码具体在&#xff1a; https://github.com/GoldenaArcher/graphql…

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL

ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…

Axure 下拉框联动

实现选省、选完省之后选对应省份下的市区

【UE5 C++】通过文件对话框获取选择文件的路径

目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 &#xff0c;这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器&#xff0c;右键点击 .uproject 文件&#xff0c;选择 "Generate Visual Studio project files"&#xff0c;重…

热烈祝贺埃文科技正式加入可信数据空间发展联盟

2025年4月29日&#xff0c;在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上&#xff0c;可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞&#xff0c;强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…

rknn toolkit2搭建和推理

安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 &#xff0c;不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源&#xff08;最常用&#xff09; conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…

ZYNQ学习记录FPGA(一)ZYNQ简介

一、知识准备 1.一些术语,缩写和概念&#xff1a; 1&#xff09;ZYNQ全称&#xff1a;ZYNQ7000 All Pgrammable SoC 2&#xff09;SoC:system on chips(片上系统)&#xff0c;对比集成电路的SoB&#xff08;system on board&#xff09; 3&#xff09;ARM&#xff1a;处理器…

第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)

第一篇&#xff1a;Liunx环境下搭建PaddlePaddle 3.0基础环境&#xff08;Liunx Centos8.5安装Python3.10pip3.10&#xff09; 一&#xff1a;前言二&#xff1a;安装编译依赖二&#xff1a;安装Python3.10三&#xff1a;安装PIP3.10四&#xff1a;安装Paddlepaddle基础框架4.1…

自然语言处理——文本分类

文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益&#xff08;IG&#xff09; 分类器设计贝叶斯理论&#xff1a;线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别&#xff0c; 有单标签多类别文本分类和多…

高考志愿填报管理系统---开发介绍

高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发&#xff0c;采用现代化的Web技术&#xff0c;为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## &#x1f4cb; 系统概述 ### &#x1f3af; 系统定…

使用SSE解决获取状态不一致问题

使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件&#xff0c;这个上传文件是整体功能的一部分&#xff0c;文件在上传的过程中…