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

2024-04-25 12:44

本文主要是介绍【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' 对应黑色格子。当按下相应的键时,格子会被标记为清除,并在下一帧中从列表中移除。
  • 游戏会持续生成新的格子并让它们下落,直到玩家按下相应的键来消除它们。

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

这篇关于【006期】用Processing写一个根据音乐变化的黑白格游戏的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/934717

相关文章

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

国产游戏崛起:技术革新与文化自信的双重推动

近年来,国产游戏行业发展迅猛,技术水平和作品质量均得到了显著提升。特别是以《黑神话:悟空》为代表的一系列优秀作品,成功打破了过去中国游戏市场以手游和网游为主的局限,向全球玩家展示了中国在单机游戏领域的实力与潜力。随着中国开发者在画面渲染、物理引擎、AI 技术和服务器架构等方面取得了显著进展,国产游戏正逐步赢得国际市场的认可。然而,面对全球游戏行业的激烈竞争,国产游戏技术依然面临诸多挑战,未来的

火柴游戏java版

代码 /*** 火柴游戏* <p>* <li>有24根火柴</li>* <li>组成 A + B = C 等式</li>* <li>总共有多少种适合方式?</li>* <br>* <h>分析:</h>* <li>除去"+"、"="四根,最多可用火柴根数20根。</li>* <li>全部用两根组合成"1",最大数值为1111。使用枚举法,A和B范围在0~1111,C为A+B。判断</li>** @

国产游戏行业的崛起与挑战:技术创新引领未来

国产游戏行业的崛起与挑战:技术创新引领未来 近年来,国产游戏行业蓬勃发展,技术水平不断提升,许多优秀作品在国际市场上崭露头角。从画面渲染到物理引擎,从AI技术到服务器架构,国产游戏已实现质的飞跃。然而,面对全球游戏市场的激烈竞争,国产游戏技术仍然面临诸多挑战。本文将探讨这些挑战,并展望未来的机遇,深入分析IT技术的创新将如何推动行业发展。 国产游戏技术现状 国产游戏在画面渲染、物理引擎、AI

第四次北漂----挣个独立游戏的素材钱

第四次北漂,在智联招聘上,有个小公司主动和我联系。面试了下,决定入职了,osg/osgearth的。月薪两万一。 大跌眼镜的是,我入职后,第一天的工作内容就是接手他的工作,三天后他就离职了。 我之所以考虑入职,是因为 1,该公司有恒歌科技的freex平台源码,可以学学,对以前不懂的解解惑。 2,挣点素材钱,看看张亮002的视频,他用了6000多,在虚幻商城买的吸血鬼游戏相关的素材,可以玩两年。我

c++的静态变化!

静态成员   对于非静态成员,一个类的每个对象都自己存有一个副本,每个对象根据自己拥有的非静态的数据成员来区别于其他对象。而静态成员则解决了同一个类的多个对象之间数据和函数的共享问题。   静态数据成员   静态数据成员的作用是:实现同一类的不同对象之间的数据共享。   #include<IOSTREAM>   using namespace std;   class Po

nyoj 1038 纸牌游戏

poj 的一道改编题,说是翻译题更恰当,因为只是小幅度改动。 一道模拟题,代码掌控能力比较好,思维逻辑清晰的话就能AC。 代码如下: #include<stdio.h>#include<string.h>#include<algorithm>using namespace std;struct node{char c[5];int rk;char da[5];int nu

如果出一个名叫白神话悟空的游戏

最近黑神话由于与原著不符引起了原著派的争议。 所以我在摸鱼的时候想到如果游科或者某个别的公司“痛改前非”不夹带私货完全复刻吴承恩百回版剧情制作一个“重走西游路”的游戏,会有一个什么样的销量?(设定为原著派已经多方渠道认证,此游戏的确没有夹带私货,绝大部分复刻了原著剧情) 游戏玩法我想了几类 超长线性有岔路蜈蚣形状地图,蜈蚣的腿部是探索区域和支线,重走西游路线,开篇就是开始取经前唐玄宗御弟cg

UniApp实现漂亮的音乐歌词滚动播放效果

在现代的音乐播放应用中,歌词的展示和滚动播放已经成为了一个非常常见的功能。今天,我们将通过UniApp来实现一个漂亮的歌词滚动播放功能。我们将使用UniApp提供的组件和API来完成这个任务。 页面结构 在页面的模板部分,我们需要创建一个音频播放器和歌词展示区域。使用<scroll-view>组件来实现歌词的滚动效果。 <template><view class="audio-co

2024年 Biomedical Signal Processing and Control 期刊投稿经验最新分享

期刊介绍 《Biomedical Signal Processing and Control 》期刊旨在为临床医学和生物科学中信号和图像的测量和分析研究提供一个跨学科的国际论坛。重点放在处理在临床诊断,患者监测和管理中使用的方法和设备的实际,应用为主导的研究的贡献。 生物医学信号处理和控制反映了这些方法在工程和临床科学的界面上被使用和发展的主要领域。期刊的范围包括相关的评论论文(review p