用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/diannao/2993.shtml

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

相关文章

【C++例题】复数类加减法运算重载—成员函数形式

知识点&#xff1a; 1.两个不同位置的const的不同意义 2.形参有默认值的函数只能在类内给出&#xff0c;类外不能多余声明&#xff0c;即使默认值一样 3.创建一个临时对象调用的是构造函数而非默认的复制构造函数 4.重载的运算符可以当成普通运算符使用&#xff0c;但是要注…

hsql数据库(HyperSQL )(简单了解一下)

文章目录 一、HyperSQL &#xff08;HSQLDB&#xff09;1、HSQLDB是什么2、安装事务提一嘴特点看官网Datagrip连接HSQLDBMaven地址使用场景 参考文章 一、HyperSQL &#xff08;HSQLDB&#xff09; 1、HSQLDB是什么 HSQLDB (Hyper SQL Database)是一个用Java编写的关系数据库管…

SpringBoot---------整合Mybatisplus

快速入门 第一步&#xff1a;导入依赖 <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.1</version></dependency> 第二步&#xff1a;编写mapper…

【C++题解】1632. 需要几辆车

问题&#xff1a;1632. 需要几辆车 类型&#xff1a;分支 题目描述&#xff1a; 学校有 n 位同学要外出旅游&#xff0c;一辆大巴车可以坐 30 人&#xff0c;请问需要几辆大巴车&#xff1f; 输入&#xff1a; 一个整数 n&#xff0c;代表同学的总人数。 输出&#xff1a;…

区块链技术在物联网中的应用:连接未来的智能世界

随着物联网&#xff08;IoT&#xff09;的快速发展&#xff0c;越来越多的设备和传感器开始连接到互联网&#xff0c;并产生海量的数据。这些数据不仅具有巨大的商业价值&#xff0c;还能够为我们的生活和工作带来巨大的便利和效率提升。然而&#xff0c;与此同时&#xff0c;物…

明日方舟游戏助手:一键完成日常任务 | 开源日报 No.233

MaaAssistantArknights/MaaAssistantArknights Stars: 11.6k License: AGPL-3.0 MaaAssistantArknights 是一款《明日方舟》游戏的小助手&#xff0c;基于图像识别技术&#xff0c;支持一键完成全部日常任务。 刷理智、掉落识别及上传企鹅物流智能基建换班、自动计算干员效率…

STM32 串口打印乱码(Cubemx)

STM32 串口打印乱码&#xff08;Cubemx&#xff09; 时钟配置错误&#xff0c;CubeMX默认的外部晶振是25MHz&#xff0c;而板载的晶振为8MHzSTM32F407修改程序将外部25M晶振修改为8M&#xff08;标准库、HAL库&#xff09; 核心问题 芯片型号与晶振配置&#xff1a;使用的ST…

网络安全-Diffie Hellman密钥协商

密钥协商是保密通信双方&#xff08;或更多方&#xff09;通过公开信道来共同形成密钥的过程。一个密钥协商方案中&#xff0c;密钥的值是某个函数值&#xff0c;其输入量由两个成员&#xff08;或更多方&#xff09;来提供。密钥协商的记过是参与协商的双方&#xff08;或更多…

【linux】Linux第一个小程序-进度条

1. 预备知识&#xff1a;回车和换行 回车&#xff08;Carriage Return&#xff0c;CR&#xff09;&#xff1a; 在早期的机械打字机中&#xff0c;回车指的是将打字机的打印头移回到行首的操作&#xff0c;这样打印头就可以开始新的一行的打印。在ASCII编码中&#xff0c;回车用…

AIGC-stable-diffusion(文本生成图片)+PaddleHub/HuggingFace

功能 stable-diffusion(文本生成图片)PaddleHub&#xff0c;HuggingFace两种调用方式 PaddleHub 环境 pip install paddlepaddle-gpu pip install paddlehub 代码 from PIL import Image import paddlehub as hub module hub.Module(namestable_diffusion)## 保存在demo…

NXP恩智浦 S32G电源管理芯片 VR5510 安全概念 Safety Concept (万字长文详解,配21张彩图)

NXP恩智浦 S32G电源管理芯片 VR5510 安全概念 Safety Concept (万字长文详解&#xff0c;配21张彩图) 1. 简介 本应用笔记描述了与S32G处理器和VR5510 PMIC相关的安全概念。该文档涵盖了S32G和VR5510的安全功能以及它们如何相互作用&#xff0c;以确保对ASIL D安全完整性级别…

transformers - 预测中间词

代码 from transformers import AutoTokenizer#加载编码器 tokenizer AutoTokenizer.from_pretrained(distilroberta-base, use_fastTrue)print(tokenizer)#编码试算 tokenizer.batch_encode_plus([hide new secretions from the parental units,contains no wit , only labor…

@PropertySource的使用

假设我们有一个名为 database.properties 的属性文件&#xff0c;内容如下&#xff0c;该文件位于项目的类路径 (resources 目录) 下&#xff1a; # database.properties db.urljdbc:mysql://localhost:3306/mydb db.usernameroot db.passwordpassword 然后&#xff0c;创建一…

STM32,复位和时钟控制

外部时钟 HSE 以后需要用到什么就这样直接拿去配就行了

【文件上传与包含漏洞综合利用】DVWA-文件上传-难度:High

实验过程和结果 步骤1&#xff1a;尝试直接上传php木马&#xff0c;失败&#xff0c;截图如下&#xff1a; 步骤2&#xff1a;将php木马后缀改为jpeg尝试上传&#xff0c;依旧失败&#xff0c;截图如下&#xff1a; 步骤3&#xff1a;将真实的jpeg图片1.jpeg上传&#xff0c;成…

CNPM、NPM 和 Yarn:JavaScript 包管理器的比较

在现代Web开发中&#xff0c;包管理器是不可或缺的工具&#xff0c;它们帮助开发者管理项目中使用的各种第三方库。在JavaScript世界里&#xff0c;最常见的包管理器有 NPM、Yarn 和 CNPM。本文将详细介绍这三者的不同之处&#xff0c;并用简单的例子来帮助初学者理解每种工具的…

企业微信hook接口协议,ipad协议http,外部联系人图片视频文件下载

外部联系人文件下载 参数名必选类型说明file_id是StringCDNkeyopenim_cdn_authkey是String认证keyaes_key是Stringaes_keysize是int文件大小 请求示例 {"url": "https://imunion.weixin.qq.com/cgi-bin/mmae-bin/tpdownloadmedia?paramv1_e80c6c6c0cxxxx3544d9…

AI作画算法原理详解

人工智能绘画&#xff08;AI绘画&#xff09;算法通常基于深度学习框架&#xff0c;尤其是生成对抗网络&#xff08;GANs&#xff09;。这些算法通过训练大量的艺术作品数据&#xff0c;学会生成新的图像&#xff0c;这些图像在风格和内容上与训练数据相似。 生成对抗网络&…

智慧火电厂合集 | 数字孪生助推能源革命

火电厂在发电领域中扮演着举足轻重的角色。主要通过燃烧如煤、石油或天然气等化石燃料来产生电力。尽管随着可再生能源技术的进步导致其比重有所减少&#xff0c;但直至 2023 年&#xff0c;火电依然是全球主要的电力来源之一。 通过图扑软件自主研发 HT for Web 产品&#xf…

[Algorithm][前缀和][和为K的子数组][和可被K整除的子数组][连续数组][矩阵区域和]详细讲解

目录 1.和为 K 的子数组1.题目链接2.算法原理详解3.代码实现 2.和可被 K 整除的子数组1.题目链接2.算法原理详解3.代码实现 3.连续数组1.题目链接2.算法原理详解3.代码实现 4.矩阵区域和1.题目链接2.算法原理详解3.代码实现 1.和为 K 的子数组 1.题目链接 和为 K 的子数组 2.…