見出し画像

続:pyxelでRPG風のものを作る(9)

今回は扉を開ける方法に暗証番号による開錠を作成しました。今までは、「該当する鍵アイテムを所持する」、「対応するレバーを操作する」の2つだった扉の開け方が増えました。

前回までの進行具合は以下のnoteをご参照ください。

まずは特定の扉を触った際に暗証番号の入力画面を開かせるようにします。

無題

▲赤枠で囲った白い扉を触れた際に入力画面を開きます。

     elif n == 366 or n == 367:
        pyxel.rect(0, 100, 128, 63, 0)
        self.Draw_fonts(self.text_list["240"],5, 105)
        pyxel.text(5, 120, "Press SPACE-KEY to continue...", 
                   pyxel.frame_count % 16)
        self.event_cnt = True
        self.n1 = 0
        self.n2 = 0
        self.n3 = 0
        self.sn = 1

▲白い扉は画像番号366367なので、elif n == 366 or n == 367:の分岐でここに入っていきます。暗証番号の入力を促すテキストを表示し、次の画面で使う変数「n1 n2 n3 sn」を初期化します。これはそれぞれ「n1(暗証番号1桁目) n2(暗証番号2桁目) n3(暗証番号3桁目) sn(何桁目を入力しているか)」に使います。
以前作ったイベント継続の仕組みを使って、スペースキーが押下されるとn == 3661の分岐に進みます。

無題

▲画面はこんな感じ

次は実際の暗証番号入力画面です。

     elif n == 3661:
        self.event_cnt = False
        if pyxel.btnp(pyxel.KEY_1):
           if self.sn == 1:
               self.n1 = 1
           elif self.sn == 2:
               self.n2 = 1
           elif self.sn == 3:
               self.n3 = 1
           self.sn += 1
        elif pyxel.btnp(pyxel.KEY_2):
           if self.sn == 1:
               self.n1 = 2
           elif self.sn == 2:
               self.n2 = 2
           elif self.sn == 3:
               self.n3 = 2
           self.sn += 1
        elif pyxel.btnp(pyxel.KEY_3):
           if self.sn == 1:
               self.n1 = 3
           elif self.sn == 2:
               self.n2 = 3
           elif self.sn == 3:
               self.n3 = 3
           self.sn += 1
        elif pyxel.btnp(pyxel.KEY_4):
           if self.sn == 1:
               self.n1 = 4
           elif self.sn == 2:
               self.n2 = 4
           elif self.sn == 3:
               self.n3 = 4
           self.sn += 1
        elif pyxel.btnp(pyxel.KEY_5):
           if self.sn == 1:
               self.n1 = 5
           elif self.sn == 2:
               self.n2 = 5
           elif self.sn == 3:
               self.n3 = 5
           self.sn += 1
        elif pyxel.btnp(pyxel.KEY_6):
           if self.sn == 1:
               self.n1 = 6
           elif self.sn == 2:
               self.n2 = 6
           elif self.sn == 3:
               self.n3 = 6
           self.sn += 1
        elif pyxel.btnp(pyxel.KEY_7):
           if self.sn == 1:
               self.n1 = 7
           elif self.sn == 2:
               self.n2 = 7
           elif self.sn == 3:
               self.n3 = 7
           self.sn += 1
        elif pyxel.btnp(pyxel.KEY_8):
           if self.sn == 1:
               self.n1 = 8
           elif self.sn == 2:
               self.n2 = 8
           elif self.sn == 3:
               self.n3 = 8
           self.sn += 1
        elif pyxel.btnp(pyxel.KEY_9):
           if self.sn == 1:
               self.n1 = 9
           elif self.sn == 2:
               self.n2 = 9
           elif self.sn == 3:
               self.n3 = 9
           self.sn += 1
        elif pyxel.btnp(pyxel.KEY_0):
           if self.sn == 1:
               self.n1 = 0
           elif self.sn == 2:
               self.n2 = 0
           elif self.sn == 3:
               self.n3 = 0
           self.sn += 1
           
        pyxel.rect(0, 40, 128, 60, 0)
        pyxel.rectb(0, 40, 128, 60, 8)
        pyxel.text(15, 60, str(self.n1), 7)
        pyxel.text(55, 60, str(self.n2), 7)
        pyxel.text(95, 60, str(self.n3), 7)
        pyxel.rectb(11+((self.sn-1)*40), 58, 10, 10, pyxel.frame_count % 16)
        pyxel.text(10, 75, "HINT", 7)
        pyxel.text(15, 85, "B1", 7)
        pyxel.blt(25,83,2,56,48,8,8,)   
        pyxel.text(55, 85, "B2", 7)
        pyxel.blt(65,83,2,64,40,8,8,)   
        pyxel.text(95, 85, "B3", 7)
        pyxel.blt(105,83,2,64,48,8,8,)   
           
    
        if self.sn == 4:
           #Check pass
           if str(str(self.n1)+str(self.n2)+str(self.n3)) == "123":
               print("ok")
               self.movie_count = 3663
               self.MapEvents_ctr(4, 14)
           else:
               print("ng")
               self.movie_count = 3662
               
        print(str(self.n1)+str(self.n2)+str(self.n3))

▲ごちゃごちゃしていますが基本的には0~9のキー入力を受け付けて「n1 n2 n3」の変数に入れています。入力するごとにself.sn += 1で桁を移動させて、4になったらif self.sn == 4:の分岐に入って入力内容をチェックします。今回は正解を123にしたので if str(str(self.n1)+str(self.n2)+str(self.n3)) == "123":がTrueなら3663の正解画面へ移行するとともに扉を開く処理を呼び出します(self.MapEvents_ctr(4, 14))、Falseなら3662の不正解画面へ遷移します。各所にあるprintはデバッグ用なのでお気になさらず。

無題

▲画面はこんな感じ。入力に合わせて、受付中の桁が分かるように四角が移動します。今回はエリアにある特定のオブジェの数を暗証番号としているのでヒントでそれを示します。

     elif n == 3662:
        pyxel.rect(0, 100, 128, 63, 0)
        self.Draw_fonts(self.text_list["239"],5, 105)
        
        pyxel.text(5, 120, "Press SPACE-KEY to continue...", 
                   pyxel.frame_count % 16)
        
    elif n == 3663:
        pyxel.rect(0, 100, 128, 63, 0)
        self.Draw_fonts(self.text_list["238"],5, 105)
        pyxel.text(5, 120, "Press SPACE-KEY to continue...", 
                   pyxel.frame_count % 16)

▲正解不正解の部分です。ここは文字を表示させるだけです。

無題

無題

▲画面はこんな感じ。

今回はここまで。暗証番号を入れるところはちょっと冗長になってしまってこれがプログラミング的な正攻法とは思えませんが、思い描いていた動きができた時はやっぱり楽しいですね。

コードやpyxresファイル、モジュールファイルはGitHubの方に置いてあります。

開発中ですが、exe形式にしたものはitch.coに載せています。

ここまで読んでいただきありがとうございました。

ここまで読んでいただきありがとうございます!