otoge(音ゲー)
音ゲーっぽいサンプルをおいておきます
音源と譜面が流れる速度を揃える必要があるのでそこはチューニングを頑張る
code:otoge.py
import pyxel
# 流れるノーツ1つ1つを再現するクラス
class Note:
# y方向に落ちる速さ
vy = 1
def __init__(self, y):
# 初期化するときにy座標の値を与えられるようにしている\
# Note(200) とするとyに200がはいる
self.y = y
self.available = True
def update(self):
self.y += Note.vy
def draw(self):
if self.available:
pyxel.rect(50, self.y, 20, 5, 2)
def did_hit_bar(self):
return self.available and 175 <= self.y <= 180
def disable(self):
self.available = False
class App:
def __init__(self):
pyxel.init(200, 200, caption="otoge-")
self.define_music()
self.define_score()
# ゲームプレイ用の変数
self.point = 0
self.is_playing = False
pyxel.run(self.update, self.draw)
def define_music(self):
# 音源を地道に定義する
pyxel.sound(0).set(
# 音程(#=シャープ、-=フラット、r=休符)
"e3e3b2c3d3d3c3b2 a2a2rc3e3e3d3c3 b2b2rc3d3d3e3e3 c3c3a2a2a2a2rr",
"t",
"7", # 音量
"nfnnnfnn nfnnnfnn nfnnnfnf nfnfnfnn", # エフェクト
25, # テンポ
)
def define_score(self):
# 譜面を地道にここで作る
def update(self):
if not self.is_playing:
if pyxel.btnp(pyxel.KEY_SPACE):
# スペースキーを押すとゲーム開始
pyxel.play(0, 0)
self.is_playing = True
else:
# 音符をアップデートしていく
for note in self.score:
note.update()
if note.did_hit_bar() and pyxel.btnp(pyxel.KEY_SPACE):
# 成功判定
self.point += 100
note.disable()
def draw(self):
pyxel.cls(7)
pyxel.text(0, 0, str(pyxel.play_pos(0)), 0)
pyxel.text(0, 10, str(self.point), 0)
frame = pyxel.play_pos(0)
# 当たり判定の線
pyxel.rect(0, 180, 200, 1, 0)
for note in self.score:
note.draw()
App()