【006期】用Processing写一个根据音乐变化的黑白格游戏

黑白格游戏

      • 简述
      • 准备工作
      • 游戏设计
      • 实现代码
      • 注意事项
      • 优化
      • 二次优化

简述

为了创建一个简单的根据音乐变化的黑白格游戏,我们将利用Processing的简洁性和直观操作来实现。游戏的核心思想是:屏幕上呈现多个黑白格,随着音乐的播放,格子会根据音乐的节奏和强度变化颜色。这个游戏将使用Processing的sound库来分析音乐,根据音乐的节奏强度来触发不同的视觉效果。

准备工作

首先,确保你已经在Processing环境中安装了sound库。这可以通过Processing的“导入库…”功能完成,搜索并安装sound库。

游戏设计

  • 游戏界面:屏幕被划分为多个小格,每个格子可以是黑色或白色。
  • 音乐分析:游戏会实时分析正在播放的音乐的节奏强度,并根据这个强度改变格子的颜色。
  • 互动性:玩家可以通过键盘操作影响某些游戏效果(例如,按下特定按键可以改变格子的排列方式或颜色变化的速度)。

实现代码

import processing.sound.*;SoundFile file;
Amplitude amp; // 用于测量音乐的振幅
int gridSize = 10; // 网格尺寸
float[][] grid; // 存储每个格子的音频响应值void setup() {size(800, 600);background(255);// 加载音乐并播放file = new SoundFile(this, "yourMusicFile.mp3");file.loop();amp = new Amplitude(this);amp.input(file);// 初始化格子数组grid = new float[width/gridSize][height/gridSize];
}void draw() {background(255);float currentAmp = amp.analyze(); // 获取当前音频的振幅// 更新每个格子的状态for (int x = 0; x < width/gridSize; x++) {for (int y = 0; y < height/gridSize; y++) {grid[x][y] = lerp(grid[x][y], currentAmp*100, 0.05); // 根据音频振幅更新格子状态fill(grid[x][y] > 50 ? 0 : 255); // 根据格子状态填充颜色rect(x*gridSize, y*gridSize, gridSize, gridSize); // 绘制格子}}
}void keyPressed() {// 添加键盘互动,例如,按下空格键重新排列格子if (key == ' ') {// 重新排列格子的代码}
}

注意事项

  1. 音乐文件:确保你有权使用的音乐文件放在Processing的data文件夹中,并且在SoundFile对象的构造函数中正确指定了文件名。
  2. 性能:根据你的计算机性能,可能需要调整gridSize或其他参数,以确保游戏运行流畅。
  3. 增强体验:考虑添加更多的视觉效果(如根据音乐节奏改变格子的颜色或大小)以及更复杂的用户互动(如不同的按键执行不同的视觉效果)。

优化

为了优化这个黑白格游戏,我们可以进行以下改进:

  1. 我们将采用更高效的方式来更新格子颜色,避免在每一帧中重绘整个网格。
  2. 我们可以添加一个阈值,当音频的振幅超过这个阈值时才更改颜色,从而创建更有节奏感的视觉效果。
  3. 我们可以添加一些动画效果,如渐变等,使视觉效果更平滑。
  4. 我们可以提供一个简单的用户界面,让用户能够控制音乐播放和停止,以及更改网格的尺寸和其他参数。

下面是一段改进后的代码:

import processing.sound.*;SoundFile file;
Amplitude amp; 
int gridSize = 20; 
float[][] grid;
float threshold = 0.01f; // 阈值
int cols, rows;void setup() {size(600, 400);cols = width / gridSize;rows = height / gridSize;grid = new float[cols][rows];file = new SoundFile(this, "yourMusicFile.mp3");file.loop();amp = new Amplitude(this);amp.input(file);noStroke();
}void draw() {float currentAmp = amp.analyze();for (int x = 0; x < cols; x++) {for (int y = 0; y < rows; y++) {// Simple animation effect using lerpgrid[x][y] = lerp(grid[x][y], currentAmp > threshold ? 1 : 0, 0.1); // Determine color based on amplitudefill(grid[x][y] * 255);rect(x * gridSize, y * gridSize, gridSize, gridSize);}}
}void keyPressed() {if (keyCode == UP) {threshold += 0.005; // Increase the threshold} else if (keyCode == DOWN) {threshold -= 0.005; // Decrease the threshold} else if (keyCode == LEFT) {gridSize = max(gridSize - 5, 5); // Decrease grid sizeupdateGrid();} else if (keyCode == RIGHT) {gridSize = min(gridSize + 5, 100); // Increase grid sizeupdateGrid();} else if (key == ' ') {if (file.isPlaying()) {file.pause();} else {file.loop();}}
}void updateGrid() {// Update grid dimensions based on new gridSizecols = width / gridSize;rows = height / gridSize;grid = new float[cols][rows]; // Reset grid
}

上述代码对原有的黑白格游戏进行了优化,添加了对音量阈值的控制,并提供了通过键盘控制音乐播放、格子大小和阈值的功能。特别是,增大和减小网格的尺寸可以通过左右方向键来控制,改变音频阈值可以通过上下方向键来进行调节,空格键用来控制音乐的播放和暂停。这些改进使得游戏的互动性和可玩性大大增强。

二次优化

在这个游戏版本中,我们将创建一个游戏,其中黑白格子将从屏幕顶部随机生成,并且会根据音乐的节奏下落。玩家的任务是在格子到达屏幕底部前按下相应的键来消除它们。格子的大小和下落速度将随着音乐的节奏和强度变化。

 import processing.sound.*;SoundFile file;
Amplitude amp;
ArrayList<GridSquare> squares;
float speedMultiplier = 1.0; // 下落速度倍数
float lastAmp = 0; // 存储上一帧的振幅
float ampChangeThreshold = 0.01; // 定义触发新格子生成的振幅变化阈值void setup() {size(800, 600);file = new SoundFile(this, "yourMusicFile.mp3");file.loop();amp = new Amplitude(this);amp.input(file);squares = new ArrayList<GridSquare>();
}void draw() {background(255);float currentAmp = amp.analyze();// 如果振幅变化大于一定阈值,则生成新的格子if (Math.abs(currentAmp - lastAmp) > ampChangeThreshold) {float size = map(currentAmp, 0, 0.1, 10, 100); // 根据音量大小映射格子大小squares.add(new GridSquare(random(width - size), -size, size, speedMultiplier));lastAmp = currentAmp; // 更新上一帧的振幅值}// 更新并绘制所有格子for (int i = squares.size() - 1; i >= 0; i--) {GridSquare square = squares.get(i);square.update();square.display();if (square.isOffScreen() || square.isCleared()) { // 如果格子被清除或移出屏幕squares.remove(i);}}// 根据当前振幅更新下落速度倍数speedMultiplier = map(currentAmp, 0, 0.1, 0.5, 5);
}void keyPressed() {// 检查每个格子是否与按键匹配的颜色for (int i = squares.size() - 1; i >= 0; i--) {GridSquare square = squares.get(i);if ((key == 'w' && square.isWhite()) || (key == 'b' && !square.isWhite())) {square.setCleared(true);}}
}class GridSquare {float x, y, size, speed;boolean isWhite, cleared;GridSquare(float x, float y, float size, float speedMultiplier) {this.x = x;this.y = y;this.size = size;this.speed = size / 20 * speedMultiplier; // 根据大小调整速度this.isWhite = random(1) > 0.5; // 随机决定颜色}boolean isWhite() {return isWhite;}boolean isOffScreen() {return y > height;}boolean isCleared() {return cleared;}void setCleared(boolean status) {cleared = status;}void update() {y += speed; // 根据速度下落}void display() {fill(isWhite ? 255 : 0);rect(x, y, size, size);}
}

在这个游戏中:

  • GridSquare 类代表落下的格子。
  • 当检测到音乐节拍时,会创建一个新的 GridSquare 对象,并加入到 squares 列表中。
  • 格子的大小是根据音乐的振幅动态计算的,速度也根据格子的大小和音乐的振幅进行调整。
  • 按键 'w' 对应白色格子,按键 'b' 对应黑色格子。当按下相应的键时,格子会被标记为清除,并在下一帧中从列表中移除。
  • 游戏会持续生成新的格子并让它们下落,直到玩家按下相应的键来消除它们。

你可以根据自己的喜好进行细节调整,比如调整格子生成的频率,或者增加更多的按键来消除不同颜色的格子。这个游戏框架提供了一个很好的起点来创建一个交互性强的音乐游戏。

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

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

相关文章

使用ClickHouse和Terraform进行CI/CD

本文字数&#xff1a;11047&#xff1b;估计阅读时间&#xff1a;28 分钟 审校&#xff1a;庄晓东&#xff08;魏庄&#xff09; 本文在公众号【ClickHouseInc】首发 简介 在 ClickHouse&#xff0c;我们致力于以 API 为先的开发方式来构建 ClickHouse Cloud。用户通过用户界面…

arm64-v8a和armeabi-v7a分别是什么?它们之间有什么区别

2024年4月22日&#xff0c;周一上午 arm64-v8a 和 armeabi-v7a 都是针对不同的 ARM 处理器架构的编译版本&#xff0c;它们之间的主要区别在于处理器架构和指令集。 arm64-v8a&#xff1a; arm64-v8a 是针对 ARMv8 架构的 64 位处理器的编译版本。ARMv8 架构引入了 64 位指令集…

如何快速学习盲打键盘的指法

学习盲打键盘的指法需要一定的时间和练习&#xff0c;但是以下几个方法可以帮助你加快学习的速度&#xff1a; 掌握正确的手位&#xff1a;了解标准的键盘布局以及手指应该放置的位置是学习盲打的第一步。在QWERTY键盘上&#xff0c;你的左手应该放在ASDF键上&#xff0c;右手应…

人工智能入门(一):基于Pytorch的手写数字识别模型

前言&#xff1a; 因为还在上学&#xff0c;时间不太够用&#xff0c;很多内容写到后面心有余力不足&#xff0c;未来有时间我会慢慢补充。人工智能的知识涉猎范围广又杂乱无章&#xff0c;啃书或上课学到的知识往往很早就过时了或者离实际的项目无关。所以&#xff0c;我很希…

VS调试、debug和release、栈区底层简单介绍、const 修饰指针变量介绍

文章目录 前言一、调试二、debug和release三、调试需要多用&#xff0c;多熟悉四、栈区底层简单介绍五、优秀的代码&#xff1a;常见的coding技巧: 六、const 修饰指针变量1. const 出现在 * 左边2. const 出现在 * 右边 七、strcpy函数的仿写1.版本12. 版本23. 版本34. 版本4 …

Corner case 数据处理方法

背景 特斯拉的纯视觉处理方法&#xff0c;在处理corner case的过程中&#xff0c;面对着数据量少&#xff0c;而且难以采集的问题。为了提升模型的数据量&#xff0c;通过一定的数据处理方法进行corner case的数据生成&#xff0c;不失为一种有效的办法。 "Corner case&…

Andorid进程间通信之 UNIX SOCKET

1&#xff0c;什么是UNIX SOCKET UNIX SOCKET&#xff0c;域套接字&#xff0c;UNIX SOCKET可用于同一台设备进程间通信&#xff0c;它不需要经过网络协议栈&#xff0c;不需要打包拆包、计算校验和、维护序列号应答等&#xff0c;只需要将数据从一个进程复制到另一个进程&…

高精度加法及乘法

目录 字符串的高精度加法 为什么需要高精度加法&#xff1f; 怎么进行高精度加法&#xff1f; 链表的高精度加法 翻转链表&#xff08;带虚拟头节点&#xff09; 字符串的高精度乘法 字符串的高精度加法 大数加法_牛客题霸_牛客网 (nowcoder.com)https://www.nowcoder.co…

linux下查看前10最耗内存的进程

lunux查找占用内存前10的进程 1、使用Top命令查询进程 输入 top 命令&#xff0c;然后按下大写M按照内存MEM排序&#xff0c;按下大写P按照CPU排序。 2、查询占用CPU最高的前10个进程 ps aux|head -1;ps aux|grep -v PID|sort -rn -k 3|head 3、查询占用内存最大的前10个进程…

2024年度西安市创新联合体备案申报条件时间要求须知

一、申报条件 组建市级创新联合体需具备牵头单位、成员单位、组建协议、首席科学家等四个条件。 (一)牵头单位 1.牵头单位应为在西安市注册登记的省市产业链龙头骨干企业&#xff0c;重点支持市级重点产业链“链主”企业; 2.牵头单位一般为1家。 (二)成员单位 1.成员单位…

excel 按照姓名日期年月分组求和

excel 需要按照 姓名 日期的年份进行金额求和统计&#xff0c;采用sumifs 进行统计 注意&#xff1a;sumifs 不支持 合并列拆分计算&#xff0c;合并列只会计算一个值 表格数据大概如下&#xff1a;(sheet) ABC姓名日期金额A2023/01/01500A2023/01/151500B2023/01/01200B202…

python 调试 c++源码

1. gdb常用调试命令概览和说明 2. 编译c库设置Debug模式 cmake设置debug 在CMake中设置debug模式通常意味着启用调试信息和优化。以下是一个简单的CMakeLists.txt文件示例&#xff0c;展示了如何设置项目以便在Debug模式下构建&#xff1a; cmake_minimum_required(VERSION 3…

LeetCode 2739.总行驶距离:不模拟直接算(很好算的)——相当于“满5返1”的活动

【LetMeFly】2739.总行驶距离&#xff1a;不模拟直接算&#xff08;很好算的&#xff09;——相当于“满5返1”的活动 力扣题目链接&#xff1a;https://leetcode.cn/problems/total-distance-traveled/ 卡车有两个油箱。给你两个整数&#xff0c;mainTank 表示主油箱中的燃料…

桐乡上元——管理会计,除了跳槽,还有四个更好的晋升方式!

基于多位财务资深从业者的经验&#xff0c;对于财会人员&#xff0c;尤其是有志于从事管理会计、向管理方向发展的从业者&#xff0c;至少有以下4个方式&#xff0c;可以让自己获得提升&#xff1a; 01寻求轮岗 财务工作分工比较细&#xff0c;涉及方方面面&#xff0c;是否具备…

cad中快速计算多个矩形面积的方法

1、输入命令reg&#xff0c;选中矩形创建面域 2、输入命令uni,选中刚刚创建的面域&#xff0c;组合成一个面域 3、输入命令&#xff1a;LI &#xff0c;选中面域&#xff0c;即可查看面积和周长 需注意的一点&#xff0c;开始创建的矩形或者多段线要在一个面内&#xff0c;就是…

【动态规划】Leetcode 322. 零钱兑换【中等】

零钱兑换 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1 。 你可以认为每种硬币的数量是无…

docker部署mysql5.7

docker部署mysql5.7 使用docker部署mysql比较方便&#xff0c;适合开发测试使用。 创建文件夹 创建文件夹持久化容器数据&#xff0c;同时映射本地配置文件&#xff0c;方便修改 mkdir -p /home/ubuntu/mysql/datamysql的配置文件如下&#xff1a; [mysqld] # 设置字符集 …

英文阅读~ McDonald‘s buys all 225 of Israeli franchise restaurants after boycotts

McDonald’s buys all 225 of Israeli franchise restaurants after boycotts McDonald’s 是个名字&#xff0c;它买&#xff5e; 遭遇抵制后&#xff0c;麦当劳回购了以色列全部 225 家特许经营餐厅 Israeli ɪzˈreɪli 以色列的&#xff0c;以色列人的 以色列人 boycotts 抵…

flutter开发实战-混淆minifyEnabled及shrinkResources

flutter开发实战-混淆minifyEnabled及shrinkResources 最近开发中&#xff0c;出现了在Debug模式下完全正常&#xff0c;打包build后出现插件代码调用提示未实现。 No implementation found for method login on channel app_plugin 经过查找发现在build apk时候出现了混淆的问…

向光而行--那些静悄悄的生命也有光内心有光眼里才有光不要放弃!

人生的每一步路都是有用的&#xff0c;都不会白走 一个人只有内心有光&#xff0c;才能写出有光的文字&#xff0c;活出有光的人生 历史上任何一个伟大的诗人&#xff0c;只…