「Mac畅玩鸿蒙与硬件49」UI互动应用篇26 - 数字填色游戏

简介: 本篇教程将带你实现一个数字填色小游戏,通过简单的交互逻辑,学习如何使用鸿蒙开发组件创建趣味性强的应用。

本篇教程将带你实现一个数字填色小游戏,通过简单的交互逻辑,学习如何使用鸿蒙开发组件创建趣味性强的应用。

20241230_213850.gif20241230_213850.gif


关键词
  • UI互动应用
  • 数字填色
  • 动态交互
  • 逻辑判断
  • 游戏开发

一、功能说明

数字填色小游戏包含以下功能:

  1. 数字选择:用户点击数字按钮后选中一个数字。
  2. 区域填色:选择数字后,点击区域进行填色,颜色根据数字变化。
  3. 颜色逻辑映射:通过逻辑映射,将数字和颜色关联。
  4. 清空重置:支持清空所有区域,恢复默认状态。

二、所需组件

  • @Entry@Component 装饰器
  • Canvas 组件用于绘制填色区域
  • RowColumn 布局组件
  • Button 组件用于选择数字和重置操作
  • @State 修饰符用于状态管理

三、项目结构

  • 项目名称DigitalColoringGame
  • 自定义组件名称ColoringGamePage
  • 代码文件ColorMapping.etsColoringGamePage.etsIndex.ets

四、代码实现

1. 定义颜色映射
// 文件名:ColorMapping.ets

export type ColorMapping = Record<number, string>;

export const colorMapping: ColorMapping = {
   
  1: '#FF0000', // 红色
  2: '#00FF00', // 绿色
  3: '#0000FF', // 蓝色
  4: '#FFFF00', // 黄色
  5: '#FF00FF', // 品红
};

2. 数字填色游戏页面
// 文件名:ColoringGamePage.ets

import {
    colorMapping } from './ColorMapping';

@Component
export struct ColoringGamePage {
   
  @State selectedNumber: number = 0; // 当前选择的数字
  @State coloredAreas: number[] = Array(9).fill(0); // 每个区域的颜色状态
  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(); // 创建 Canvas 渲染上下文

  // 选择数字
  selectNumber(num: number): void {
   
    this.selectedNumber = num; // 更新选中数字
  }

  // 填色区域
  fillArea(index: number): void {
   
    if (this.selectedNumber !== 0) {
   
      this.coloredAreas[index] = this.selectedNumber; // 更新颜色状态
      this.redrawCanvas(); // 重新绘制画布
    }
  }

  // 绘制初始画布
  drawInitialCanvas(): void {
   
    for (let i = 0; i < 9; i++) {
   
      const x = (i % 3) * 110; // 计算区域的 x 坐标
      const y = Math.floor(i / 3) * 110; // 计算区域的 y 坐标
      this.context.fillStyle = colorMapping[this.coloredAreas[i]] || '#FFFFFF'; // 设置填充颜色
      this.context.fillRect(x, y, 100, 100); // 绘制填充矩形
      this.context.strokeStyle = '#000000'; // 边框颜色
      this.context.strokeRect(x, y, 100, 100); // 绘制边框
    }
  }

  // 重新绘制画布
  redrawCanvas(): void {
   
    this.context.clearRect(0, 0, 330, 330); // 清空画布
    this.drawInitialCanvas(); // 重新绘制
  }

  // 重置游戏
  resetGame(): void {
   
    this.coloredAreas = Array(9).fill(0); // 清空状态
    this.selectedNumber = 0; // 重置选中数字
    this.redrawCanvas(); // 重置画布
  }

  build() {
   
    Column({
    space: 20 }) {
   
      Text('数字填色游戏')
        .fontSize(24)
        .fontWeight(FontWeight.Bold)
        .alignSelf(ItemAlign.Center);

      // 显示填色区域
      Canvas(this.context)
        .width(330)
        .height(330)
        .onReady(() => {
   
          this.drawInitialCanvas(); // 初始化画布
        })
        .onTouch((event: TouchEvent) => {
   
          const touch = event.touches[0]; // 获取触控点
          const x = Math.floor(touch.x / 110); // 计算列索引
          const y = Math.floor(touch.y / 110); // 计算行索引
          const index = y * 3 + x; // 计算区域索引
          if (index >= 0 && index < 9) {
   
            this.fillArea(index); // 更新对应区域颜色
          }
        });

      // 数字选择按钮
      Row({
    space: 10 }) {
   
        ForEach([1, 2, 3, 4, 5], (num: number) => {
   
          Button(`${
     num}`)
            .width(60)
            .height(60)
            .backgroundColor(colorMapping[num])
            .onClick(() => this.selectNumber(num)); // 选择数字
        });
      }

      // 重置按钮
      Button('重置')
        .onClick(() => this.resetGame()) // 重置游戏
        .margin({
    top: 20 })
        .width(100)
        .height(50);
    }
    .padding(20)
    .width('100%')
    .height('100%');
  }
}

3. 主入口文件
// 文件名:Index.ets

import {
    ColoringGamePage } from './ColoringGamePage';

@Entry
@Component
struct Index {
   
  build() {
   
    Column() {
   
      ColoringGamePage() // 调用数字填色游戏页面
    }
    .padding(20);
  }
}

效果示例:通过选择数字并点击区域,填充颜色,享受填色游戏的乐趣。

效果展示
20241230_213850.gif20241230_213850.gif


五、代码解读

  1. 颜色映射逻辑

    • ColorMapping.ets 文件使用 Record<number, string> 定义数字到颜色的映射关系,便于扩展和管理。
  2. 区域填色逻辑

    • fillArea() 方法根据当前选择的数字,为指定区域填色,实时更新画布。
  3. 数字选择与重置

    • 通过 selectNumber() 方法更新用户选择的数字,resetGame() 方法一键清空填色区域并恢复默认状态。
  4. 状态管理

    • 使用 @State 修饰符管理 selectedNumbercoloredAreas,实现组件状态和界面的实时联动。

六、优化建议

  1. 添加“未填色提示”,如动态高亮未填区域。
  2. 支持保存填色进度以便后续继续。
  3. 提供不同的配色主题,增强游戏的趣味性。

七、效果展示

  • 数字选择与区域填色:用户点击数字按钮并点击区域,实现数字填色。
  • 清空重置:一键清空所有区域,重新开始游戏。

八、相关知识点


小结

通过本篇教程,用户掌握了使用鸿蒙组件实现数字填色小游戏的核心方法,进一步提升了开发互动性应用的能力。


下一篇预告

在下一篇「UI互动应用篇27 - 水果掉落小游戏」中,我们将学习如何实现一个互动性更强的水果掉落小游戏,增强用户的娱乐体验。


上一篇: 「Mac畅玩鸿蒙与硬件48」UI互动应用篇25 - 简易购物车功能实现

下一篇: 「Mac畅玩鸿蒙与硬件50」UI互动应用篇27 - 水果掉落小游戏


作者:SoraLuna
链接:https://www.nutpi.net
來源:坚果派
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


目录
相关文章
|
传感器 数据管理 定位技术
鸿蒙5开发宝藏案例分享---一多开发实例(游戏)
这篇文章为开发者揭示了鸿蒙系统中的隐藏宝藏——官方提供的高质量开发案例。通过这些案例,可以大幅提升开发效率,轻松实现分布式游戏、跨端协同等功能。文中详细介绍了四个实战案例:用手机作为电视游戏手柄的分布式游戏手柄、支持多设备数据同步的跨端接力抓宠功能、针对中低端设备优化3D粒子特效的方法,以及利用卡片服务创造各种实用功能的技巧。最后还提供了避坑指南,帮助开发者更高效地利用文档资源。
|
前端开发 安全 开发工具
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
1175 90
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
人工智能 自然语言处理 API
用自然语言控制电脑,字节跳动开源 UI-TARS 的桌面版应用!内附详细的安装和配置教程
UI-TARS Desktop 是一款基于视觉语言模型的 GUI 代理应用,支持通过自然语言控制电脑操作,提供跨平台支持、实时反馈和精准的鼠标键盘控制。
7190 17
用自然语言控制电脑,字节跳动开源 UI-TARS 的桌面版应用!内附详细的安装和配置教程
|
UED
「Mac畅玩鸿蒙与硬件52」UI互动应用篇29 - 模拟火车票查询系统
本篇教程将实现一个模拟火车票查询系统,通过输入条件筛选车次信息,并展示动态筛选结果,学习事件处理、状态管理和界面展示的综合开发技巧。
493 13
「Mac畅玩鸿蒙与硬件52」UI互动应用篇29 - 模拟火车票查询系统
「Mac畅玩鸿蒙与硬件53」UI互动应用篇30 - 打卡提醒小应用
本篇教程将实现一个打卡提醒小应用,通过用户输入时间进行提醒设置,并展示实时提醒状态,实现提醒设置和取消等功能。
487 10
「Mac畅玩鸿蒙与硬件53」UI互动应用篇30 - 打卡提醒小应用
|
安全 JavaScript API
鸿蒙开发核心要素
鸿蒙开发核心要素
|
存储 IDE 定位技术
【HarmonyOS 5】鸿蒙组件&模板服务详解 - 助力高效开发的利器
在移动应用开发领域,效率与质量始终是开发者追求的核心目标。鸿蒙系统作为新兴的操作系统,为开发者提供了丰富且强大的开发资源,其中鸿蒙组件&模板服务更是成为开发者快速构建高质量应用的得力助手。
479 0
|
11月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
1837 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
11月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
1183 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
11月前
|
移动开发 Rust JavaScript
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
1240 4
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡

热门文章

最新文章