IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> React Native Expo 项目中添加动画音效 -> 正文阅读

[游戏开发]React Native Expo 项目中添加动画音效

背景

最近做一个学校作业,用 React Native 写一个游戏。游戏中涉及一个物体下落的动效,是用 React Native 的 Animated API 实现的。

现在希望在物体落地的时候发出“嗒”的一个音效,没想到还挺麻烦。

首先需要一个库来实现音频的播放。网上搜了一下,大部分人的解决方案都是用 react-native-sound 这个库。我照着试了一下,安装很麻烦不说,即便我只是像下面这样引入这个库:

import Sound from 'react-native-sound';

也会一直报这个错误:

TypeError: null is not an object (evaluating 'RNSound.IsAndroid')
at node_modules/react-native/Libraries/Core/ExceptionsManager.js:104:6 in reportException
at node_modules/react-native/Libraries/Core/ExceptionsManager.js:172:19 in handleException
at node_modules/react-native/Libraries/Core/setUpErrorHandling.js:24:6 in handleError
at node_modules/@react-native/polyfills/error-guard.js:49:36 in ErrorUtils.reportFatalError
at node_modules/metro-runtime/src/polyfills/require.js:204:6 in guardedLoadModule
at http://192.168.1.5:19000/node_modules/expo/AppEntry.bundle?platform=android&dev=true&hot=false&minify=false:488211:3 in global code

后来突然想到,我这个项目是基于 Expo 的,如果 Expo 提供了音频解决方案就好了。搜了一下还真有!

后来又捣鼓了一阵,终于实现了。

实现

代码

示例代码如下:

import { useRef, useEffect } from 'react';
import { Animated, Dimensions, Easing } from 'react-native';
import { Audio } from 'expo-av'; // 引入该库

const WINDOW_WIDTH = Dimensions.get('window').width;
const WINDOW_HEIGHT = Dimensions.get('window').height;
const BOX_SIZE = WINDOW_WIDTH / 5;
const BOX_INIT_X = WINDOW_WIDTH/2 - BOX_SIZE/2;
const BOX_INIT_Y = WINDOW_WIDTH/2;
const BOX_FINAL_Y = WINDOW_HEIGHT - BOX_SIZE

let crashSound; // 音效

export default function App() {
  const positionY = useRef(new Animated.Value(BOX_INIT_Y)).current

  // 加载音效
  useEffect(async () => {
    const { sound } = await Audio.Sound.createAsync(
      require('./crash_sound.m4a')
    );

    crashSound = sound;
  }, [])
  
  // 设置动画
  useEffect(() => {
    Animated.timing(
      positionY,
      {
        toValue: BOX_FINAL_Y,
        duration: 1000,
        useNativeDriver: false,
        easing: Easing.ease
      }
    ).start(() => {
      // 这个是动效的回调函数,会在动效结束之后被调用,然后播放音效
      // 注意用 replayAsync 而不是 playAsync
      crashSound.replayAsync();
    });
  }, [])

  const boxStyle = {
    position: 'absolute',
    top: positionY,
    left: BOX_INIT_X,
    width: BOX_SIZE,
    height: BOX_SIZE,
    backgroundColor: 'red'
  }
  return <Animated.View style={boxStyle} />
}

注意,使用 replayAsync 而不是 playAsync,是因为 playAsync 只能播一次,第二次调用就没声音了;而 replayAsync 每次调用都有声音。

效果

示例视频

参考链接

Expo - Playing sounds
React Native 中使用 Animated 实现物体下落动效

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-02-26 12:03:55  更:2022-02-26 12:07:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 16:29:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码