Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/soozynn/louder
Vanila JavaScript Audio Jumping Game
https://github.com/soozynn/louder
canvas javascript oop webaudio-api
Last synced: 4 days ago
JSON representation
Vanila JavaScript Audio Jumping Game
- Host: GitHub
- URL: https://github.com/soozynn/louder
- Owner: soozynn
- Created: 2022-02-28T01:44:21.000Z (almost 3 years ago)
- Default Branch: main
- Last Pushed: 2022-06-14T07:18:06.000Z (over 2 years ago)
- Last Synced: 2024-11-08T02:52:43.346Z (about 2 months ago)
- Topics: canvas, javascript, oop, webaudio-api
- Language: JavaScript
- Homepage:
- Size: 84.2 MB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# π Louder!
[π νλ‘μ νΈ μμ° μμ 보λ¬κ°κΈ°](https://youtu.be/RqTlaotUZX4?t=7777)
## πΆ What is Louder?
μ μ μ λͺ©μ리 λ°μ벨μ μ΄μ©νμ¬ μ₯μ λ¬Όκ³Ό λͺ¬μ€ν°λ€μ νΌν΄ νλ«νΌ μ¬μ΄λ₯Ό μ΄λ, μ ννμ¬ κΉλ°μ΄ μλ μ΅μ’ Finish μ§μ κΉμ§ μμ£Όν΄μΌνλ μμ±μΈμ κΈ°λ°μ μΉ κ²μμ λλ€.
## πΆ Motivation
νλμκ²μμ λν μΆμ΅μ΄ λ§μ κ°μΈ νλ‘μ νΈλ‘ κ°λ¨ν κ²μμ ꡬννκ³ μΆμ λ§μμ΄ μ»Έμ΅λλ€. μ΄μ μ λͺ©μ리λ₯Ό μ΄μ©ν λ―Έλ κ²μμ μ¬λ°κ² μ νλ κΈ°μ΅μμ μμ΄λμ΄λ₯Ό μ»μ΄ Web Audio API λ₯Ό μ΄μ©ν μμ±μΈμ κ²μμ κΈ°ννκ² λμμ΅λλ€.
### - Why chose Vanilla JavaScript?
μ΄κΈ°μλ κ°λ¨ν μ± κ²μμΌλ‘ λ§λ€μ΄λ³΄κ³ μ React-nativeμ μ¬μ©μ κ³ λ €νμμ΅λλ€. νμ§λ§, React-nativeλ₯Ό μ΄μ©νμ¬ κ²μ μ±μ κ°λ°νλ€λ©΄ nativeμμ JSλ‘ μ΄λ²€νΈλ₯Ό μ μ‘νκ³ JSμμ nativeλ‘ UI μ λ°μ΄νΈλ₯Ό μ μ‘ν΄μΌ νλ λκΈ° μκ°μΌλ‘ μΈν΄ κ²μμ λμ λλ μ§μ°μ΄ λ°μν μ μλ€λ κ²μ μκ² λμμ΅λλ€.
κ·Έλ¬λ€ μ΄μ λΆν° μκ°ν΄μλ νλ μμν¬μ λΌμ΄λΈλ¬λ¦¬ μμ΄ Vanilla JavaScript λ§μ μ΄μ©νμ¬ κ²μμ κ°λ°ν΄λ³΄λ©΄ μ΄λ¨κΉ? λΌλ μκ°μ κΈ°μ μΌλ‘ Vanilla JavaScript μ canvas λ§μ μ΄μ©νμ¬ νλ‘μ νΈλ₯Ό ꡬννκ² λμμ΅λλ€. μ΄λ² νλ‘μ νΈλ₯Ό ν΅ν΄ Vanilla JavaScriptμ **OOP, closure, this, ꡬ쑰 μ€κ³**μ λν΄ λ§μ΄ κ³ λ―Όν΄λ³Ό μ μμκ³ , μ΄μ μ μ λλ‘ μ 리νμ§ λͺ»νλ μλ°μ€ν¬λ¦½νΈμ κ°λ μ λν΄μλ λ€μ νλ² κ³΅λΆν μ μμλ μκ°μ΄μμ΅λλ€.
## πΉ Game Introduction
#### Start Page
> κ²μμ μμνκΈ° μ , How to play buttonμ ν΅ν΄ κ²μ μ‘°μ λ°©λ²μ μ μ μμ΅λλ€.
#### How to play
> λͺ©μ리μ λ³Όλ₯¨ ν¬κΈ°λ₯Ό ν΅ν΄ μΊλ¦ν°λ₯Ό μ‘°μν μ μμ΅λλ€.
- `Soft volume`: μμ λ°μ벨μ μΊλ¦ν°λ₯Ό μμΌλ‘ μμ§μΌ μ μμ΅λλ€.
- `Loud volume`: ν° λ°μ벨μ μΊλ¦ν°λ₯Ό μ νμν¬ μ μμ΅λλ€.
- `Volume up`: λ°μλ²¨μ΄ ν΄μλ‘ μΊλ¦ν°λ λ λκ² μ νν μ μμ΅λλ€.> λͺ¬μ€ν°λ λ°μ μ£½μΌ μ μμ§λ§, 머리 μΈμ λͺΈν΅μ΄ λ¨Όμ λΏμ μ κ²μμ μ’ λ£λ©λλ€.
#### Level select page
> κ²μμ λμ΄λλ₯Ό μ ννμ¬ μ§νν μ μμ΅λλ€.
- Level 1 - ice map
> μ°μΈ‘ μλ¨μλ Gameμ bgmμ λκ³ ν¬ μ μλ On/Off λ²νΌμ΄ μμ΅λλ€.
- Level 2 - fire map
> κ²μμ Finish μ§μ μΈ κΉλ°μ λ¨μ μμΉλ₯Ό μ€μ μλ¨μ μλ % λ₯Ό ν΅ν΄ μλ € μ€λλ€.
- Level 3 - dark map
> Level μ λ°λΌ 컨μ /μ§ν/λͺ¬μ€ν° μ’ λ₯κ° λ€λ₯΄λ©°, Level μ΄ λμ μλ‘ λͺ¬μ€ν°κ° λ§μμ§κ³ , μ§νμ΄ μ΄λ €μμ§λ ꡬ쑰μ λλ€.
## πΆ About the difficulties...
### `Object Orient Programming (OOP)`
μ΄λ² νλ‘μ νΈμμ μΊλ¦ν°μ μ§νμ κ·Έλ €μ€ λμ ν΄λμ€ κΈ°λ°μ κ°μ²΄ μ§ν₯ μΈμ΄λ₯Ό μλν΄λ³΄μλλ° canvasμ ν΄λμ€ λ¬Έλ²μ μ΅μνμ§ μμ μ΅νλ λ°μ λ§μ μκ°μ΄ κ±Έλ Έμ§λ§, μ μ°¨ κ°μ²΄ μ§ν₯ μΈμ΄μ λν μ΄ν΄μ νμ λν μ μκ² λμκ³ , Vanilla JavaScript λ§μ μ¬μ©νλ©΄μ νλ μμν¬λ λΌμ΄λΈλ¬λ¦¬λ€μ λν μ₯λ¨μ κ³Ό νΈλ¦¬μ±μ λν΄μλ λͺΈμ λκ»΄λ³Ό μ μλ μκ°μ΄μμ΅λλ€.
μ²μμλ κ²μμ ꡬννλ©΄μ μ΅μν μ μ°¨μ§ν₯ νλ‘κ·Έλλ°κ³Ό ν¨μν νλ‘κ·Έλλ°μΌλ‘ μ§ννμμ΅λλ€. νμ§λ§ ν¨μμ λ§μ 맀κ°λ³μλ₯Ό μ λ¬νκ³ κ°μ κΈ°μ΅νκΈ° μν΄ ν΄λ‘μ λ₯Ό λ§λ€μ΄μΌ νμ΅λλ€. κ²μ κΈ°λ₯μ μν΄ ν¨μ κ° λ§μ 맀κ°λ³μ μ λ¬ λ° μ½λ κ° κ²°ν©λκ° λμμ§κ³ λ°©λν΄μ§μΌλ‘μ¨ μ μ§ λ³΄μ λ° λλ²κΉ μ΄ μ΄λ €μμ Έ μ΄λ₯Ό λ κ°μ νκΈ° μν΄ κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°μ λμ νκ² λμμ΅λλ€. κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°μ ν΅ν΄ κ²μ μ€λΈμ νΈμ ν¬κΈ° / μμΉ / μ΄λ―Έμ§ μμ±μ λΆμ¬νκ³ κ°κ°μ μ€λΈμ νΈλ§λ€ μ΄λ ν νλμ λ©μλλ‘ μ μν¨μΌλ‘μ¨ μ¬μ¬μ©μ± ν₯μ λ° μ½λλ₯Ό λ μ§κ΄μ μΌλ‘ λΆλ¦¬ν μ μμμ΅λλ€.
μ½λ μμ
```
export default class Particle {
constructor({ position, velocity, radius }) {
this.position = {
x: position.x,
y: position.y,
};this.velocity = {
x: velocity.x,
y: velocity.y,
};this.radius = radius;
this.timeTheLess = 300;
}draw(ctx) {
ctx.beginPath();
ctx.arc(this.position.x, this.position.y, this.radius, 0, Math.PI * 2, false);
ctx.fillStyle = "red";
ctx.fill();
ctx.closePath();
}update(ctx, gravity, canvas) {
this.timeTheLess--;
this.draw(ctx);
this.position.x += this.velocity.x;
this.position.y += this.velocity.y;if (this.position.y + this.radius + this.velocity.y <= canvas.height) {
this.velocity.y += gravity * 0.4;
}
}}
```
### `canvas`
κ²μ νλ μ΄ νλ©΄μ 보μ¬μ£ΌκΈ° μν΄, Vanila Javascriptλ₯Ό κΈ°λ°μΌλ‘ HTMLμ λ€μν μ λλ©μ΄μ μ 보μ¬μ€ μ μλ canvasλ₯Ό μ¬μ©νμμ΅λλ€. μνλ μ /λν/μ΄λ―Έμ§λ₯Ό κ·Έλ¦¬κ³ , μ λλ©μ΄μ ν¨κ³Όλ₯Ό λ£κΈ° μν΄ requestAnimationFrame ν¨μλ₯Ό μ¬κ·λ‘ μ€νν΄μ£Όμμ΅λλ€.
κ²μ νΉμ±μ λ€μν μν©(μ ν & λν / μΆ©λ & μ μ΄ / μΊλ¦ν° μ¬λ§ λ±)μμ canvasμ μ΄λ»κ² μ΄λ―Έμ§λ₯Ό κ·Έλ €μ£Όμ΄μΌν μ§ λ§μ μ΄λ €μμ΄ μμμ΅λλ€. μλκ° μλ κ²μ μΊλ¦ν° ꡬνμ μν΄ Sprites imageλ₯Ό μ¬μ©νμκΈ° λλ¬Έμ κΈ°λ³Έ 60fpsλ‘ μ€νλλ requestAnimationFrame ν¨μμμ μ΄λ―Έμ§ νλ μμ λ§κ² canvas drawingμ΄ μ€νλλλ‘ νλ μ μ μ΄ λ‘μ§μ΄ νμνμ΅λλ€.
μ§λ©΄ μ μ΄ λ° μ₯μ λ¬Ό μΆ©λ ꡬνμ μν΄ μΊλ¦ν° μ’ν(x, y)μ μ§λ©΄ λ° μ₯μ λ¬Ό μ’νλ₯Ό λ€μν κ²½μ°λ₯Ό κ³ λ €νμ¬ λ‘μ§μ λ§λ€μ΄μΌ νμ΅λλ€. μ΄μ²λΌ canvasλ₯Ό λ€λ£¨λκ² κΉλ€λ‘κ³ μ΄λ €μ μ§λ§, κ²μ, μΉ λμμΈ λ±μ μ°μ΄λ canvasμ νμ©λμ λν΄ λ°°μΈ μ μμλ μ’μ κ²½νμ΄μμ΅λλ€.
### `Sprites image`
μ μ μκ² λ³΄μ¬μ§λ μ¦κ±°μμ κ·Ήλννκ³ , νμ¬ κ²μμ΄ μ λμνκ³ μλ€λ μ 보λ₯Ό μ λ¬νκΈ° μν΄ μμ§μ΄λ μΊλ¦ν°μ ν¨κ³Όλ₯Ό μ£Όμμ΅λλ€. canvas μ frame κΈ°λ₯μ μ΅λν νμ©νμ¬ λ‘λ© μκ°μ λ¨μΆμμΌ°μ΅λλ€.
### `Web Audio API`
μμ±μΈμμ μν΄ Web Apiλ‘ μ 곡λλ Audio Contextλ₯Ό μ¬μ©νμμ΅λλ€.
Audio Contextμ AnalyserNodeλ₯Ό ν΅ν΄ μ»μ μ μλ μ£Όνμ λ°μ΄ν°κ° FFTλ‘ λ³νλμ΄ μ 곡λλλ° μ΄λ₯Ό μνλ ννλ‘ κ°κ³΅νμ¬ μ¬μ©νλ κ²μ μ΄λ €μμ΄ μμ΄ μ€νμμ€λ₯Ό κ°λν΄μ λ°μ벨μ ν¬κΈ°μ λ°λΌ μΊλ¦ν°μ μ ν λμ΄λ₯Ό μ‘°μ ν΄μ£Όμμ΅λλ€.
## πΆ Schedule
π» 2022. 02. 21 ~ 2022. 03. 13 (3μ£Ό)
`1μ£Όμ°¨`
- `κΈ°ν λ¨κ³: 2022λ 2μ 21μΌ ~ 2022λ 2μ 27μΌ`
- μμ΄λμ΄ κ΅¬μ λ° κ²ν
- κΈ°μ μ€ν κ²μ¦ λ° κ²ν
- [Mock-up](https://www.notion.so/Mockup-7ed08f7eea9c42029aaedb121663da15) μμ
- Kanban μμ±
- μ¬μ©ν Game sprites μ΄λ―Έμ§, bgm μ 리`2 & 3μ£Όμ°¨`
- `κ°λ° λ¨κ³: 2022λ 2μ 28μΌ ~ 2022λ 3μ 13μΌ`
- κΈ°λ₯ ꡬν
- 리ν©ν λ§ λ° λ²κ·Έ ν΄κ²°
- ν μ€νΈ μ½λ μμ±
- 리λλ―Έ μμ±
## πΆ TechStack
- Vanilla Javascript
- canvas
- HTML
- CSS
- Eslint
- Prettier
- Jest
## πΆ Impression
κ°λ°μ μ§ννλ©΄μ μ€κ°μ€κ° μ ννμ§ λͺ»νλ κΈ°μ κ²μ¦μΌλ‘ μΈν΄ λͺ©μ κ³Ό κΈ°νμ λ§μ΄ λ°κΏμΌνλ λΆλΆμ΄ μμλλ° μ΄λ₯Ό ν΅ν΄ κ°λ° λ¨κ³λ₯Ό κ±°μΉκΈ° μ μ νν κΈ°μ κ²μ¦κ³Ό κΈ°νμ μ€μμ±μ λν΄ λ€μ νλ² μΈμ§ν μ μμκ³ , ν κ°μ νλ‘μ νΈλ₯Ό λ§λ€κΈ° μν΄ κΈ°ν /λμμΈ / κ°λ° λ± μ΄λ νλ μ€μνμ§ μμ λ¨κ³κ° μλ€λ κ²μ λͺΈμ λλ μ μλ μκ°μ΄μμ΅λλ€.
물리 μμ§μ μ¬μ©νμ§ μκ³ μλ°μ€ν¬λ¦½νΈμ μΊλ²μ€λ§μΌλ‘ μΊλ¦ν°μ μ§νμ μΆ©λμ ꡬννλ λΆλΆμ μμ΄μ μ΄λ €μμ΄ λ§μμ§λ§ κ°λ°μ μμνκΈ° μ΄μ λΆν° λ λ§λ€μ΄λ³΄κ³ μΆμλ κ²μμ μ£Όμ λ‘ μμ ν μ μμ΄ μ΄λ €μμ λ€λ‘νκ³ μ¬λ°κ² ꡬνν μ μμλ νλ‘μ νΈμμ΅λλ€.