ページの最後に全コードとデータのリンクを掲載
方針
- アイテム取得数を保存する
- 加算用移動スピードの変数を用意
- アイテム取得数が一定数毎になると移動スピードに加算してスピードUPさせる
- 速度制御用のbool的なフラグも用意する
変数を作る
def __init__(self):
いろいろと初期化
# 初期追加速度 self.addspeed = 0 # 速度制御用flag self.isSpeedUp = False # アイテム取得数 self.getitem = 0
アイテム取得数を加算
def update_fruit(self, x, y, is_active, ver):
アイテムと接触したタイミングでアイテム取得数を+1する
#種別で分岐 if ver == 0: is_active = False #表示を消す self.score += 10 #scoe加算 self.getitem += 1 #アイテム取得数加算 pyxel.play(1,0,loop = False) #SE再生(CH 1,SOUND 0,単発再生)
追加速度を設定する
def update_fruit(self, x, y, is_active, ver):
アイテムの移動処理部分に追加してあげるだけ
# 左に移動 x -= 1 + self.addspeed
今回はアイテムを3個取るたびにスピードUPさせてみる
def update_play_scene(self):
↓を参考にさせていただきました
jibundex.com
取得数が3の倍数の時にスピードアップさせたいので
取得数を3で割って余りが0になったタイミングに判定する
ただ、この方法だと、3の場合数になってから次のアイテムを取得するまでの間
ずーっと処理が走ってしまって困るので
self.isSpeedUpフラグで1回だけ処理を入れて、余りが0で無くなったら戻しています
# アイテム取得で速度制御 三つ取得ごとに速度Up if self.getitem % 3 == 0: if self.isSpeedUp == False: self.addspeed += 1 self.isSpeedUp = True print("up処理") else: # isSpeedUpをFalseにする self.isSpeedUp = False
ゲームオーバー時にイロイロと初期化を忘れずに
def update_fruit(self, x, y, is_active, ver):
ここで初期化しないと変なことになってしまうので注意
elif ver == 1: is_active = False #表示を消す pyxel.play(1,2,loop = False) #SE再生(CH 1,SOUND 0,単発再生) # BGM再生(MUSIC 0番をloop再生) pyxel.playm(2, loop = False) # いろいろ初期化 self.getitem = 0 self.addspeed = 0 self.isSpeedUp == False # 画面移動 self.scene = SCENE_GAMEOVER
これで、難易度が徐々に上がるようになりました
調整は気が向いたらw
現時点での全コード
from random import randint import pyxel #画面遷移用の変数 SCENE_TITLE = 0 #タイトル画面 SCENE_PLAY = 1 #ゲーム画面 SCENE_GAMEOVER = 2 #ゲームオーバー画面 class App: def __init__(self): # 画面サイズの設定 captionはwindow枠にtext出せる pyxel.init(160, 120, caption="Hello Pysel") # editorデータ読み込み(コードと同じフォルダにある) pyxel.load("my_resource.pyxres") #画面遷移の初期化 self.scene = SCENE_TITLE #得点初期化 self.score = 0 self.highscore = 0 # 初期配置 self.player_x = 80 self.player_y = 60 # 初期追加速度 self.addspeed = 0 # 速度制御用flag self.isSpeedUp = False # アイテム取得数 self.getitem = 0 # fruit初期配置 x座標 y座標 表示flag on 種類(0と1)を4個用意 self.fruit = [(i * 60, randint(0, 104), True, randint(0, 1)) for i in range(4)] #BGM再生(MUSIC 0番をloop再生) pyxel.playm(1, loop = True) # 実行開始 更新関数 描画関数 pyxel.run(self.update, self.draw) def update(self): if pyxel.btnp(pyxel.KEY_Q): pyxel.quit() #処理の画面分岐 if self.scene == SCENE_TITLE: self.update_title_scene() elif self.scene == SCENE_PLAY: self.update_play_scene() elif self.scene == SCENE_GAMEOVER: self.update_gameover_scene() #タイトル画面処理用update def update_title_scene(self): #ENTERでゲーム画面に遷移 if pyxel.btnp(pyxel.KEY_ENTER): #BGM再生(MUSIC 0番をloop再生) pyxel.playm(0, loop = True) self.scene = SCENE_PLAY #ゲーム画面処理用update def update_play_scene(self): #ハイスコア判定 if self.highscore <= self.score: self.highscore = self.score # アイテム取得で速度制御 三つ取得ごとに速度Up if self.getitem % 3 == 0: if self.isSpeedUp == False: self.addspeed += 1 self.isSpeedUp = True print("up処理") else: # isSpeedUpをFalseにする self.isSpeedUp = False self.update_player() # i番目とv要素(各fruitの要素) enumerate関数で各fruitの値を取得して実行しているっぽ for i, v in enumerate(self.fruit): # (*v)ってタプルという複数の要素を管理するデータ型の一つらしい # つまり、初期化で設定したデータをタプル型にしてupdate_fruit関数に渡しているっぽい self.fruit[i] = self.update_fruit(*v) #ゲームオーバー画面処理用update def update_gameover_scene(self): #ENTERでタイトル画面に遷移 if pyxel.btnp(pyxel.KEY_ENTER): #BGM再生(MUSIC 0番をloop再生) pyxel.playm(1, loop = True) self.score = 0 #得点初期化 self.scene = SCENE_TITLE def update_player(self): # key入力 # max関数 min関数で画面外に行かないようにしているのか if pyxel.btn(pyxel.KEY_LEFT): self.player_x = max(self.player_x - 2, 0) if pyxel.btn(pyxel.KEY_RIGHT): self.player_x = min(self.player_x + 2, pyxel.width - 16) if pyxel.btn(pyxel.KEY_UP): self.player_y = max(self.player_y - 2, 0) if pyxel.btn(pyxel.KEY_DOWN): self.player_y = min(self.player_y + 2, pyxel.height - 16) def update_fruit(self, x, y, is_active, ver): #衝突判定(playerとfruitの座標の絶対値から衝突しているか判定している) if is_active and abs(x - self.player_x) < 12 and abs(y - self.player_y) < 12: #種別で分岐 if ver == 0: is_active = False #表示を消す self.score += 10 #scoe加算 self.getitem += 1 #アイテム取得数加算 pyxel.play(1,0,loop = False) #SE再生(CH 1,SOUND 0,単発再生) elif ver == 1: is_active = False #表示を消す pyxel.play(1,2,loop = False) #SE再生(CH 1,SOUND 0,単発再生) # BGM再生(MUSIC 0番をloop再生) pyxel.playm(2, loop = False) # いろいろ初期化 self.getitem = 0 self.addspeed = 0 self.isSpeedUp == False # 画面移動 self.scene = SCENE_GAMEOVER # 左に移動 x -= 1 + self.addspeed # 画面外に出たら if x < -40: # 画面反対側に強制移動 x += 240 # y座標はランダム y = randint(0, 104) # 表示flag on is_active = True # 種類再設定(ランダム) ver = randint(0, 1) # 返り値を設定 return (x, y, is_active, ver) def draw(self): # 画面クリア 0は黒 pyxel.cls(0) #描画の画面分岐 if self.scene == SCENE_TITLE: self.draw_title_scene() elif self.scene == SCENE_PLAY: self.draw_play_scene() elif self.scene == SCENE_GAMEOVER: self.draw_gameover_scene() #score表示用に整形(format関数の文字列操作を利用) s = "Score:{:>4}".format(self.score) #text表示(x座標、y座標、文字列、color) pyxel.text(5, 10, s, 7) #highscore表示用に整形(format関数の文字列操作を利用) hs = "HighScore:{:>4}".format(self.highscore) #text表示(x座標、y座標、文字列、color) pyxel.text(5, 4, hs, 7) #タイトル画面描画用update def draw_title_scene(self): pyxel.text(70, 40, "GAME", 7) pyxel.text(50, 80, "- PRESS ENTER -", 7) #ゲーム画面描画用update def draw_play_scene(self): # editorデータ描画 pyxel.blt(self.player_x, self.player_y, 0, 0, 0, 16, 16, 0) # draw fruits for x, y, is_active, ver in self.fruit: if is_active: #verを見て画像変更 if ver == 0: pyxel.blt(x, y, 0, 16, 0, 16, 16, 0) elif ver == 1: pyxel.blt(x, y, 0, 32, 0, 16, 16, 0) #ゲームオーバー画面描画用update def draw_gameover_scene(self): pyxel.text(55, 40, "GAME OVER", 7) pyxel.text(50, 80, "- PRESS ENTER -", 7) App()