メインコンテンツへスキップ

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

    今回は何か機能を追加するわけでもなく、今まで使っていたソースコードが長くて見にくくなってきたので、外部モジュール化を試してみます。

    …と思ったのですが今まで同一クラス内にいろいろ書きすぎたせいで(特にAppクラス)変数のスコープがごっちゃごちゃになっているので早々に断念。辞書型配列で持たせているひらがなフォント・敵の座標・NPCの座標を外部モジュールとすることでとりあえず終了です。まあモジュールとパッケージ化の練習ということで。

    さて、今まではAppクラスのinitメソッドで以下のような形で変数を代入していました。

    #Font set
        self.font_list = {
            "a":[0,0],
            "A":[8,0],
            "i":[16,0],
            "I":[24,0],
            "u":[32,0],
            "U":[40,0],
            "e":[48,0],
            "E":[56,0],
            "o":[64,0],
            "O":[72,0],
            "KA":[80,0],
            "GA":[88,0],
            "KI":[96,0],
            "GI":[104,0],
            "KU":[112,0],
            "GU":[120,0],
            "KE":[128,0],
            "GE":[136,0],
            "KO":[144,0],
            "GO":[152,0],
            "SA":[160,0],
            "ZA":[168,0],
            "SI":[176,0],
            "JI":[184,0],
            "SU":[192,0],
            "ZU":[200,0],
            "SE":[208,0],
            "ZE":[216,0],
            "SO":[224,0],
            "ZO":[232,0],
            "TA":[240,0],
            "DA":[248,0],
            "TI":[0,8],
            "DI":[8,8],
            "tu":[16,8],
            "TU":[24,8],
            "DU":[32,8],
            "TE":[40,8],
            "DE":[48,8],
            "TO":[56,8],
            "DO":[64,8],
            "NA":[72,8],
            "NI":[80,8],
            "NU":[88,8],
            "NE":[96,8],
            "NO":[104,8],
            "HA":[112,8],
            "BA":[120,8],
            "PA":[128,8],
            "HI":[136,8],
            "BI":[144,8],
            "PI":[152,8],
            "HU":[160,8],
            "BU":[168,8],
            "PU":[176,8],
            "HE":[184,8],
            "BE":[192,8],
            "PE":[200,8],
            "HO":[208,8],
            "BO":[216,8],
            "PO":[224,8],
            "MA":[232,8],
            "MI":[240,8],
            "MU":[248,8],
            "ME":[0,16],
            "MO":[8,16],
            "ya":[16,16],
            "YA":[24,16],
            "yu":[32,16],
            "YU":[40,16],
            "yo":[48,16],
            "YO":[56,16],
            "RA":[64,16],
            "RI":[72,16],
            "RU":[80,16],
            "RE":[88,16],
            "RO":[96,16],
            "wa":[104,16],
            "WA":[112,16],
            "WI":[120,16],
            "WE":[128,16],
            "WO":[136,16],
            "NN":[144,16],
            }

    これはひらがなフォントの場合ですが、こんな感じで敵の座標とNPCの座標も辞書型で持たせていたわけです。この部分を本体の.pyファイルから分離しようと思います。

    まずは本体と同じ階層にモジュールを入れておくための「module」フォルダを作成します。その後とりあえず空ファイルで「Enemy_pos.py」、「Npc_pos.py」、「Fontlist.py」を作成します。これがモジュールファイルです。さらに「__init__.py」も作成します。これは該当フォルダをパッケージとして読み込めるようにするファイルで、中身は特に必要ありません。
    ここまでできたら、各モジュールファイルの中身を書いていきます。

    #Enemy_pos
    
    def enemy_posx():
        pos = {
                  "0-0":[],
                  "1-0":[5,13],
                  "2-0":[9,12,13],
                  "3-0":[10,12,8],
                  "4-0":[6,8,9,12],
                  "5-0":[],
                  "6-0":[],
                  "7-0":[],
                  "8-0":[],
                  "9-0":[],
                  "10-0":[],
                  "0-1":[5,106,108],
                  "1-1":[5,5,11,11,7,8],
                  "2-1":[2,3,2,3,4],
                  "3-1":[],
                  "4-1":[],
                  "5-1":[],
                  "6-1":[],
                  "7-1":[],
                  "8-1":[],
                  "9-1":[],
                  "10-1":[],
                  "0-2":[106,108,109,1012],
                  "1-2":[107,108,104,105,111,112,106,108,110],
                  "2-2":[],
                  "3-2":[7,8,9,10,11,11,12],
                  "4-2":[210],
                  "5-2":[205,208,210,211],
                  "6-2":[],
                  "7-2":[],
                  "8-2":[],
                  "9-2":[],
                  "10-2":[],
                  "0-3":[],
                  "1-3":[],
                  "2-3":[],
                  "3-3":[],
                  "4-3":[],
                  "5-3":[],
                  "6-3":[],
                  "7-3":[],
                  "8-3":[13],
                  "9-3":[],
                  "10-3":[],
        }
        return pos
    
    def enemy_posy():
        pos = {
                  "0-0":[],
                  "1-0":[5,7],
                  "2-0":[7,8,2],
                  "3-0":[7,8,11],
                  "4-0":[7,8,7,8],
                  "5-0":[],
                  "6-0":[],
                  "7-0":[],
                  "8-0":[],
                  "9-0":[],
                  "10-0":[],
                  "0-1":[5,10,10],
                  "1-1":[5,10,5,10,8,7],
                  "2-1":[7,8,9,10,11],
                  "3-1":[],
                  "4-1":[],
                  "5-1":[],
                  "6-1":[],
                  "7-1":[],
                  "8-1":[],
                  "9-1":[],
                  "10-1":[],
                  "0-2":[7,11,7,8],
                  "1-2":[5,6,7,8,7,8,2,3,3],
                  "2-2":[],
                  "3-2":[10,10,10,10,10,5,5,],
                  "4-2":[7],
                  "5-2":[4,8,7,9],
                  "6-2":[],
                  "7-2":[],
                  "8-2":[],
                  "9-2":[],
                  "10-2":[],
                  "0-3":[],
                  "1-3":[],
                  "2-3":[],
                  "3-3":[],
                  "4-3":[],
                  "5-3":[],
                  "6-3":[],
                  "7-3":[],
                  "8-3":[13],
                  "9-3":[],
                  "10-3":[],
        }
        return pos
    #Npc_pos
    
    def npc_posx():
       pos = {
                  "0-0":[],
                  "1-0":[],
                  "2-0":[],
                  "3-0":[],
                  "4-0":[],
                  "5-0":[13],
                  "6-0":[12,12],
                  "7-0":[107,208],
                  "8-0":[],
                  "9-0":[],
                  "10-0":[],
                  "0-1":[],
                  "1-1":[],
                  "2-1":[],
                  "3-1":[],
                  "4-1":[],
                  "5-1":[],
                  "6-1":[],
                  "7-1":[],
                  "8-1":[7],
                  "9-1":[],
                  "10-1":[],
                  "0-2":[],
                  "1-2":[],
                  "2-2":[],
                  "3-2":[],
                  "4-2":[],
                  "5-2":[],
                  "6-2":[],
                  "7-2":[],
                  "8-2":[313],
                  "9-2":[],
                  "10-2":[],
                  "0-3":[],
                  "1-3":[],
                  "2-3":[],
                  "3-3":[],
                  "4-3":[],
                  "5-3":[],
                  "6-3":[],
                  "7-3":[],
                  "8-3":[13],
                  "9-3":[],
                  "10-3":[],
       }
       return pos
       
    def npc_posy():
       pos = {
                  "0-0":[],
                  "1-0":[],
                  "2-0":[],
                  "3-0":[],
                  "4-0":[],
                  "5-0":[9],
                  "6-0":[4,10],
                  "7-0":[107,212],
                  "8-0":[],
                  "9-0":[],
                  "10-0":[],
                  "0-1":[],
                  "1-1":[],
                  "2-1":[],
                  "3-1":[],
                  "4-1":[],
                  "5-1":[],
                  "6-1":[],
                  "7-1":[],
                  "8-1":[5],
                  "9-1":[],
                  "10-1":[],
                  "0-2":[],
                  "1-2":[],
                  "2-2":[],
                  "3-2":[],
                  "4-2":[],
                  "5-2":[],
                  "6-2":[],
                  "7-2":[],
                  "8-2":[307],
                  "9-2":[],
                  "10-2":[],
                  "0-3":[],
                  "1-3":[],
                  "2-3":[],
                  "3-3":[],
                  "4-3":[],
                  "5-3":[],
                  "6-3":[],
                  "7-3":[],
                  "8-3":[13],
                  "9-3":[],
                  "10-3":[],
       }   
       return pos
    #Fontlist
    
    def text_j():  
       font_list = {
            "a":[0,0],
            "A":[8,0],
            "i":[16,0],
            "I":[24,0],
            "u":[32,0],
            "U":[40,0],
            "e":[48,0],
            "E":[56,0],
            "o":[64,0],
            "O":[72,0],
            "KA":[80,0],
            "GA":[88,0],
            "KI":[96,0],
            "GI":[104,0],
            "KU":[112,0],
            "GU":[120,0],
            "KE":[128,0],
            "GE":[136,0],
            "KO":[144,0],
            "GO":[152,0],
            "SA":[160,0],
            "ZA":[168,0],
            "SI":[176,0],
            "JI":[184,0],
            "SU":[192,0],
            "ZU":[200,0],
            "SE":[208,0],
            "ZE":[216,0],
            "SO":[224,0],
            "ZO":[232,0],
            "TA":[240,0],
            "DA":[248,0],
            "TI":[0,8],
            "DI":[8,8],
            "tu":[16,8],
            "TU":[24,8],
            "DU":[32,8],
            "TE":[40,8],
            "DE":[48,8],
            "TO":[56,8],
            "DO":[64,8],
            "NA":[72,8],
            "NI":[80,8],
            "NU":[88,8],
            "NE":[96,8],
            "NO":[104,8],
            "HA":[112,8],
            "BA":[120,8],
            "PA":[128,8],
            "HI":[136,8],
            "BI":[144,8],
            "PI":[152,8],
            "HU":[160,8],
            "BU":[168,8],
            "PU":[176,8],
            "HE":[184,8],
            "BE":[192,8],
            "PE":[200,8],
            "HO":[208,8],
            "BO":[216,8],
            "PO":[224,8],
            "MA":[232,8],
            "MI":[240,8],
            "MU":[248,8],
            "ME":[0,16],
            "MO":[8,16],
            "ya":[16,16],
            "YA":[24,16],
            "yu":[32,16],
            "YU":[40,16],
            "yo":[48,16],
            "YO":[56,16],
            "RA":[64,16],
            "RI":[72,16],
            "RU":[80,16],
            "RE":[88,16],
            "RO":[96,16],
            "wa":[104,16],
            "WA":[112,16],
            "WI":[120,16],
            "WE":[128,16],
            "WO":[136,16],
            "NN":[144,16],
       }
       return font_list

    ということでモジュールができました。全てもともとは本体に記載していた変数を戻り値として返す関数です。

    これを本体側で呼び出すためにインポートします。

    from module import Fontlist, Npc_pos, Enemy_pos

    その後、各モジュールからの戻り値を本体側で使うために代入します。

        self.npc_pos_x = Npc_pos.npc_posx()
        self.npc_pos_y = Npc_pos.npc_posy()
        
        self.enemy_pos_x = Enemy_pos.enemy_posx()
        self.enemy_pos_y = Enemy_pos.enemy_posy()
        
        self.font_list =Fontlist.text_j()

    モジュールファイル名.関数名()で各関数を呼び出し、各変数に入れます。これで動作としては同じようになるはずです。
    新しくなった本体のソースコードを載せてみます。

    # -*- coding: utf-8 -*-
    
    import pyxel
    from random import randint
    from module import Fontlist, Npc_pos, Enemy_pos
    
    class App:
    def __init__(self):
        #Font set
        self.font_list =Fontlist.text_j()
        
        #Player status
        self.Player = Player(8, 56)
        self.player_move = 0    
        self.atc_flug = False   
        self.atc_count = 0      
        self.p_atc_x = 0        
        self.p_atc_y = 0        
        
        #Map status
        self.stage_flug = 1     
        self.map_count_x = 1    
        self.map_count_y = 1    
        self.map_x = 0
        self.map_y = 0
        self.map_move = 0
    
        #NPC status
        self.npcs = []
        self.npc_move = 0
        self.npc_pos_x = Npc_pos.npc_posx()
        self.npc_pos_y = Npc_pos.npc_posy()
    
        #Enemy status
        self.enemys = []
        self.enemy_pos_x = Enemy_pos.enemy_posx()
        self.enemy_pos_y = Enemy_pos.enemy_posy()
        
        #System status
        self.game_start = False 
        self.game_over = False 
        self.movie_flug = False 
        self.movie_count = 0
        self.music_flug = True
        self.shop1 = Shop(1)
        
        pyxel.init(128,128, caption="pyxel_knights", scale=5)
    
        #Image read
        pyxel.load('assets/pknights.pyxres')
        
        pyxel.run(self.update, self.draw)
        
    def update(self):
    
        if pyxel.btnp(pyxel.KEY_S) and self.game_start == False:
          self.game_start = True
          self.movie_flug = True
          self.movie_count = 1
          self.music_flug = False
        if pyxel.btnp(pyxel.KEY_R) and self.game_over == True:
          self.Retry()
        if pyxel.btnp(pyxel.KEY_Q):
            pyxel.quit()
        
        if self.movie_flug == False:
            #Player controll
            self.Player_ctr()
            #NPC controll
            self.NPC_ctr()
            #Enemy controll
            self.Enemy_ctr()
            #Enemy Hit-check
            self.Hit_chk()
            #Player Damage-check
            self.Dmg_chk()
        
        #Enemy & NPC creation
        if self.map_move == 1:
           self.npcs.clear()
           self.enemys.clear()
           tgt_map_x = int(self.map_x / 16)
           tgt_map_y = int(self.map_y / 16)
           xy_key = str(tgt_map_x) + "-" + str(tgt_map_y)
           
           #Enemy creation
           enemy_x_1 = self.enemy_pos_x[xy_key]
           enemy_y_1 = self.enemy_pos_y[xy_key]
           enemy_kazu = len(enemy_x_1)
           for i in range(enemy_kazu):
               
               if enemy_x_1[i] < 101:
                   new_enemy_v = 32
                   new_enemy_x = enemy_x_1[i]
               elif enemy_x_1[i] < 201:
                  new_enemy_v = 48
                  new_enemy_x = enemy_x_1[i] - 100
               else:
                  new_enemy_v = 64
                  new_enemy_x = enemy_x_1[i] - 200
                   
               new_enemy_v2 = randint(1,3)
               new_enemy = Enemy1(new_enemy_x*8, enemy_y_1[i]*8, 
                                  new_enemy_v, new_enemy_v2)
               self.enemys.append(new_enemy)
               
           #NPC creation
           npc_x_1 = self.npc_pos_x[xy_key]
           npc_y_1 = self.npc_pos_y[xy_key]
           npc_kazu = len(npc_x_1)
           for i in range(npc_kazu):
               
               if npc_x_1[i] < 101:
                   new_npc_b = 16
                   new_npc_x = npc_x_1[i]
               elif npc_x_1[i] < 201:
                  new_npc_b = 8
                  new_npc_x = npc_x_1[i] - 100
               elif npc_x_1[i] < 301:
                  new_npc_b = 8
                  new_npc_x = npc_x_1[i] - 200               
               else:
                  new_npc_b = 16
                  new_npc_x = npc_x_1[i] - 300
                   
               if npc_y_1[i] < 101:
                   new_npc_v = 0
                   new_npc_y = npc_y_1[i]
               elif npc_y_1[i] < 201:
                   new_npc_v = 16
                   new_npc_y = npc_y_1[i] - 100
               elif npc_y_1[i] < 301:
                   new_npc_v = 32
                   new_npc_y = npc_y_1[i] - 200                
               else:
                   new_npc_v = 48
                   new_npc_y = npc_y_1[i] - 300
                   
               new_npc = NPC(new_npc_x*8, new_npc_y*8, new_npc_b, new_npc_v)
               self.npcs.append(new_npc)
               
           self.map_move = 0
         
    def draw(self):
        pyxel.cls(0)
        
        #Draw tilemap
        pyxel.bltm(0,0,0,0 + self.map_x,0 + self.map_y,16,16)
    
        #Draw player
        if self.atc_flug == True:
            if self.Player.player_m == 0:
                pyxel.blt(self.Player.player_x,self.Player.player_y,
                              0,0,16,8,8,14)
                pyxel.blt(self.Player.player_x+8,self.Player.player_y,
                              0,0,24,8,8,14)
            elif self.Player.player_m == 1:
                pyxel.blt(self.Player.player_x,self.Player.player_y,
                              0,8,16,8,8,14)
                pyxel.blt(self.Player.player_x-8,self.Player.player_y,
                              0,8,24,8,8,14)
            elif self.Player.player_m == 2:
                pyxel.blt(self.Player.player_x,self.Player.player_y,
                              0,16,16,8,8,14)
                pyxel.blt(self.Player.player_x,self.Player.player_y-8,
                              0,16,24,8,8,14)
            elif self.Player.player_m == 3:
                pyxel.blt(self.Player.player_x,self.Player.player_y,
                              0,24,16,8,8,14)  
                pyxel.blt(self.Player.player_x,self.Player.player_y+8,
                              0,24,24,8,8,14)
        else:
            if self.Player.player_m == 0:
                    pyxel.blt(self.Player.player_x,self.Player.player_y,
                              0,0,0+self.Player.player_m2*8,8,8,14)
            elif self.Player.player_m == 1:
                pyxel.blt(self.Player.player_x,self.Player.player_y,
                              0,8,0+self.Player.player_m2*8,8,8,14)
            elif self.Player.player_m == 2:
                pyxel.blt(self.Player.player_x,self.Player.player_y,
                              0,16,0+self.Player.player_m2*8,8,8,14)
            elif self.Player.player_m == 3:
                pyxel.blt(self.Player.player_x,self.Player.player_y,
                              0,24,0+self.Player.player_m2*8,8,8,14)
                
        #Draw NPCs
        npc_count = len(self.npcs)
        for e in range(npc_count):
            if self.npc_move < 50:
                pyxel.blt(self.npcs[e].npc_x,self.npcs[e].npc_y,
                          0,
                          0 + self.npcs[e].npc_v, 224,
                          self.npcs[e].npc_b,self.npcs[e].npc_b,14)
            else:
                pyxel.blt(self.npcs[e].npc_x,self.npcs[e].npc_y,
                          0,
                          0 + self.npcs[e].npc_v,240,
                          self.npcs[e].npc_b,self.npcs[e].npc_b,14)
             
        #Draw Enemys
        enemy_count = len(self.enemys)
        for e in range(enemy_count):
            if self.enemys[e].enemy_m == 0:
                pyxel.blt(self.enemys[e].enemy_x,self.enemys[e].enemy_y,
                          1,
                          8*self.enemys[e].enemy_v2,self.enemys[e].enemy_v,
                          8,8,14)
            else:
                pyxel.blt(self.enemys[e].enemy_x,self.enemys[e].enemy_y,
                          1,
                          8*self.enemys[e].enemy_v2,self.enemys[e].enemy_v+8,
                          8,8,14)
            if self.enemys[e].enemy_d == 1:
                pyxel.blt(self.enemys[e].enemy_x,self.enemys[e].enemy_y,
                          0,40,16,8,8,14)
                
        #Draw damage
        if self.Player.player_d == 1:
             pyxel.blt(self.Player.player_x,self.Player.player_y,0,32,16,8,8,14)      
             
        #Draw title text
        if self.game_start == False:
           pyxel.cls(0)
           pyxel.text(35, 40, "PYXEL KNIGHTS", 7)
           pyxel.text(45, 70, "S = ", 7)
           self.Draw_fonts(["HA","JI","ME","RU"], 60, 70)
           pyxel.text(45, 85, "Q = ", 7)
           self.Draw_fonts(["YA","ME","RU"], 60, 85)
        else: #Draw player hp
           pyxel.text(2, 122, "HP="+ str(self.Player.player_h),7)
           
        #Draw movie
        if self.movie_flug == True:
           self.Movie_ctr(self.movie_count)
            
        #Draw gameover text
        if self.game_over == True:
           pyxel.cls(0)
           pyxel.text(20, 30, "GAME OVER!", 7)
           pyxel.text(80, 70, "R = RETRY ", 7)
           pyxel.text(80, 80, "Q = QUIT ", 7)
           
    
    
    def Player_ctr(self):
        
        #Get map coordinate
        x = 16*(self.map_count_x-1)
        y = 16*(self.map_count_y-1)
    
        #Get player coordinate        
        move_map_x = int(self.Player.player_x / 8 + x)
        move_map_y = int(self.Player.player_y / 8 + y)
        
        #Tilemap action
        #HP recovery
        if pyxel.tilemap(0).get(move_map_x, move_map_y) == 31:
            self.Player.player_h = 100    
            
        #Status view and pause
        if pyxel.btnp(pyxel.KEY_I):
                   self.movie_flug = True
                   self.movie_count = 2
                   #self.movie_count = 226
        
        #Plyer move
        self.player_move = self.player_move + 1
        if (self.player_move > 6) and (self.atc_flug == False):
        
            if pyxel.tilemap(0).get(move_map_x, move_map_y-1) < 32:
                #Up
                if pyxel.btnp(pyxel.KEY_UP):
                    self.Player.player_y = self.Player.player_y - 8
                    self.player_move = 0
                    self.Player.player_m = 2
                    if self.Player.player_m2 == 0: #Move animation
                        self.Player.player_m2 = 1
                    else:
                        self.Player.player_m2 = 0      
                    if (self.Player.player_y - 8) < -8: #When map change
                        self.map_y = self.map_y - 16
                        self.Player.update(56, 120)
                        self.map_count_y = self.map_count_y - 1
                        self.map_move = 1
            elif pyxel.tilemap(0).get(move_map_x, move_map_y-1) >= 224:
                if pyxel.btnp(pyxel.KEY_UP):
                   self.movie_flug = True
                   self.movie_count = pyxel.tilemap(0).get(move_map_x,
                                                           move_map_y-1)
        
            if pyxel.tilemap(0).get(move_map_x, move_map_y+1) < 32:
                #Down
                if pyxel.btnp(pyxel.KEY_DOWN):
                    self.Player.player_y = self.Player.player_y + 8
                    self.player_move = 0
                    self.Player.player_m = 3     
                    if self.Player.player_m2 == 0: #Move animation
                        self.Player.player_m2 = 1
                    else:
                        self.Player.player_m2 = 0      
                    if (self.Player.player_y + 8) > 128: #When map change
                        self.map_y = self.map_y + 16
                        self.Player.update(56, 0)
                        self.map_count_y = self.map_count_y + 1
                        self.map_move = 1
            elif pyxel.tilemap(0).get(move_map_x, move_map_y+1) >= 224:
                if pyxel.btnp(pyxel.KEY_DOWN):
                   self.movie_flug = True
                   self.movie_count = pyxel.tilemap(0).get(move_map_x,
                                                           move_map_y+1)
                
            if pyxel.tilemap(0).get(move_map_x+1, move_map_y) < 32: 
                #Right
                if pyxel.btnp(pyxel.KEY_RIGHT):
                    self.Player.player_x = self.Player.player_x + 8
                    self.player_move = 0
                    self.Player.player_m = 0
                    if self.Player.player_m2 == 0: #Move animation
                        self.Player.player_m2 = 1
                    else:
                        self.Player.player_m2 = 0      
                    if (self.Player.player_x + 8) > 128: #When map change
                        self.map_x = self.map_x + 16
                        self.Player.update(0, 56)
                        self.map_count_x = self.map_count_x + 1
                        self.map_move = 1
            elif pyxel.tilemap(0).get(move_map_x+1, move_map_y) >= 224:
                if pyxel.btnp(pyxel.KEY_RIGHT):
                   self.movie_flug = True
                   self.movie_count = pyxel.tilemap(0).get(move_map_x+1,
                                                           move_map_y)
           
            if pyxel.tilemap(0).get(move_map_x-1, move_map_y) < 32: 
                #Left
                if pyxel.btnp(pyxel.KEY_LEFT):
                    self.Player.player_x = self.Player.player_x - 8
                    self.player_move = 0
                    if self.Player.player_m2 == 0: #Move animation
                        self.Player.player_m2 = 1
                    else:
                        self.Player.player_m2 = 0      
                    self.Player.player_m = 1
                    if (self.Player.player_x - 8) < -8: #When map change
                        self.map_x = self.map_x - 16
                        self.Player.update(120, 56)
                        self.map_count_x = self.map_count_x - 1
                        self.map_move = 1
            elif pyxel.tilemap(0).get(move_map_x-1, move_map_y) >= 224:
                if pyxel.btnp(pyxel.KEY_LEFT):
                   self.movie_flug = True
                   self.movie_count = pyxel.tilemap(0).get(move_map_x-1,
                                                           move_map_y)
               
        #Attack action       
        if pyxel.btnp(pyxel.KEY_SPACE):
            self.atc_flug = True
            pyxel.play(0,3,loop=False)
            
        if self.atc_flug == True:
            self.atc_count = self.atc_count + 1
            if self.atc_count > 8:
                self.atc_count = 0
                self.p_atc_x = 0
                self.p_atc_y = 0
                self.atc_flug = False
            else:
                if self.Player.player_m == 0:
                    self.p_atc_x = self.Player.player_x + 8
                    self.p_atc_y = self.Player.player_y
                elif self.Player.player_m == 1:
                    self.p_atc_x = self.Player.player_x - 8
                    self.p_atc_y = self.Player.player_y
                elif self.Player.player_m == 2:
                    self.p_atc_x = self.Player.player_x
                    self.p_atc_y = self.Player.player_y - 8
                elif self.Player.player_m == 3:
                    self.p_atc_x = self.Player.player_x
                    self.p_atc_y = self.Player.player_y + 8
          
    def Retry(self):
        #Player status
        self.Player = Player(8, 56)
        self.player_move = 0    
        self.atc_flug = False   
        self.atc_count = 0      
        self.p_atc_x = 0        
        self.p_atc_y = 0        
        
        #Map status
        self.stage_flug = 1     
        self.map_count_x = 1    
        self.map_count_y = 1    
        self.map_x = 0
        self.map_y = 0
        self.map_move = 0
        
        #Enemy status
        self.enemys = []
        
        #System status
        self.game_start = False 
        self.game_over = False 
        self.movie_flug = False 
                
    def Hit_chk(self):
        enemy_count = len(self.enemys)
        for e in range(enemy_count):
            self.enemys[e].enemy_d = 0
            enemy_pos_x = self.enemys[e].enemy_x
            enemy_pos_y = self.enemys[e].enemy_y
            if ((enemy_pos_x <= self.p_atc_x < enemy_pos_x + 8) and
                (enemy_pos_y <= self.p_atc_y < enemy_pos_y + 8)):
                self.enemys[e].enemy_d = 1
                #Music_ctr
                pyxel.play(1,0,loop=False)
                self.enemys[e].enemy_h = self.enemys[e].enemy_h -1
                #Enemy delete
                if self.enemys[e].enemy_h < 0:
                    self.Player.money += 10 * self.enemys[e].enemy_v2
                    del self.enemys[e]
                    #Music_ctr
                    pyxel.play(2,2,loop=False)
                    if len(self.enemys) == 0:
                        x = int(self.map_x / 16)
                        y = int(self.map_y / 16)
                        self.MapEvents_ctr(x, y)
                    break
        
    def Dmg_chk(self):     
         self.Player.player_d = 0
         enemy_count = len(self.enemys)  
         player_pos_x = self.Player.player_x
         player_pos_y = self.Player.player_y
         for e in range(enemy_count):
             enemy_pos_x = self.enemys[e].enemy_x
             enemy_pos_y = self.enemys[e].enemy_y
             if ((enemy_pos_x <= player_pos_x < enemy_pos_x + 8) and
                (enemy_pos_y <= player_pos_y < enemy_pos_y + 8)):
                 #Music_ctr
                 pyxel.play(3,1,loop=False)
                 self.Player.player_h = self.Player.player_h - 1
                 self.Player.player_d = 1
                 if self.Player.player_h <= 0:
                     self.game_over = True     
        
    
    def Enemy_ctr(self):        
        enemy_count = len(self.enemys)
        for e in range(enemy_count):
            self.enemys[e].enemy_m2 = self.enemys[e].enemy_m2 + 1
            if self.enemys[e].enemy_m2 > 47 - self.enemys[e].enemy_v2 * 7:
                self.enemys[e].enemy_m2 = 0
                enemy_pos_x = int(self.enemys[e].enemy_x / 8 + self.map_x)
                enemy_pos_y = int(self.enemys[e].enemy_y / 8 + self.map_y)
                enemy_pos_x2 = self.Player.player_x - self.enemys[e].enemy_x
                enemy_pos_y2 = self.Player.player_y - self.enemys[e].enemy_y
                #Check tilemap
                if (abs(enemy_pos_x2) < 35 and abs(enemy_pos_y2) < 35):
                    if abs(enemy_pos_x2) > abs(enemy_pos_y2):
                        #Move right
                        if enemy_pos_x2 > 0:
                            if (40> (pyxel.tilemap(0).get(enemy_pos_x+1, 
                                                          enemy_pos_y)) < 32):
                                self.enemys[e].enemy_x=self.enemys[e].enemy_x+8
                                self.enemys[e].enemy_m = 1
                        #Move left
                        else:
                            if (40> (pyxel.tilemap(0).get(enemy_pos_x-1, 
                                                          enemy_pos_y)) < 32):
                                self.enemys[e].enemy_x=self.enemys[e].enemy_x-8
                                self.enemys[e].enemy_m = 0           
                    else:
                        #Move down
                        if enemy_pos_y2 > 0:
                            if (40> (pyxel.tilemap(0).get(enemy_pos_x, 
                                                          enemy_pos_y+1)) < 32):
                                self.enemys[e].enemy_y=self.enemys[e].enemy_y+8
                        #Move up
                        else:
                            if (40> (pyxel.tilemap(0).get(enemy_pos_x, 
                                                          enemy_pos_y-1)) < 32):
                                self.enemys[e].enemy_y=self.enemys[e].enemy_y-8
    
    def NPC_ctr(self):        
        self.npc_move = self.npc_move + 1
        if self.npc_move > 100:
            self.npc_move = 0
            
    def MapEvents_ctr(self,x,y):
        xy_key = str(x) + "-" + str(y)
        if xy_key == "1-2":
            pyxel.tilemap(0).set(7+self.map_x, 10+self.map_y, ["006006"]) 
           #pyxel.tilemap(0).set(8+self.map_x, 10+self.map_y, ["010", "012"]) 
    
    def Movie_ctr(self,n):
        #Game start information
        if n == 1:
            pyxel.rect(0, 65, 128, 63, 0)
            self.Draw_fonts(["A","NA","TA","HA","O","U","KO","KU","NO",
                             "KA","KI","yu","U","KI","SI"], 5, 70)
            self.Draw_fonts(["MI","YA","KO","NO","HA","ZU","RE","NI",
                             "SU","NN","DE","I","MA","SU"], 5, 80)
            self.Draw_fonts(["KO","NO","SE","KA","I","WO","KI","MA","MA",
                             "NI"], 5, 95)
            self.Draw_fonts(["BO","U","KE","NN","SI","TE","MI","MA","SI",
                             "yo","U"], 5, 105)
            pyxel.text(5, 120, "Press SPACE-KEY to continue...", 
                       pyxel.frame_count % 16)
        #Status view
        elif n == 2:
            pyxel.rect(0, 100, 128, 63, 0)
            pyxel.text(5, 110, "Money="+ str(self.Player.money), 7) 
            pyxel.text(5, 120, "Press SPACE-KEY to return", 
                       pyxel.frame_count % 16)  
            
       #Shop/////////////////////////////////////////////
        elif n == 226 or n == 227:
            
            pyxel.bltm(0,0,0,240,0,16,16)
            pyxel.blt(100 ,15 ,0 ,48 ,0 ,16 ,16 ,2)
            
            #Shop select
            s = self.shop1
            
            if pyxel.btnp(pyxel.KEY_1):
                if s.urikire[0] == 1:
                    s.text_n = 98
                else:
                    s.text_n = 1
            elif pyxel.btnp(pyxel.KEY_2):
                if s.urikire[1] == 1:
                    s.text_n = 98
                else:
                    s.text_n = 2
            elif pyxel.btnp(pyxel.KEY_3):
                if s.urikire[2] == 1:
                    s.text_n = 98
                else:
                    s.text_n = 3
            elif pyxel.btnp(pyxel.KEY_4):
                if s.urikire[3] == 1:
                    s.text_n = 98
                else:
                    s.text_n = 4
                
            for i in range(4):
                item_name = []
                if s.urikire[i] == 1:
                    item_name = ["U","RI","KI","RE"]
                else:
                    item_name = s.item[i]
                self.Draw_fonts(item_name,15, 73 + (i * 10))
                pyxel.text(75, 73 + (i * 10), "price=" + 
                           str(s.price[i]), 7)
                
            shop_text = s.Show_text()
            text_len = len(shop_text)
            if s.text_n > 0 and s.text_n < 90:
                pyxel.text(12, 55, "( Y = Yes, N = No )", 7) 
                if pyxel.btnp(pyxel.KEY_Y):
                    p = s.text_n - 1
                    if self.Player.money - s.price[p] >= 0:
                        self.Player.money = self.Player.money - s.price[p]
                        s.urikire[p] = 1
                        s.text_n = 100
                    else:
                        s.text_n = 99
                elif pyxel.btnp(pyxel.KEY_N):
                    s.text_n = 0
            for t in range(text_len):
                self.Draw_fonts(shop_text[t],15, 15 + (t * 10))
                
            pyxel.text(15, 113, "SPACE-KEY = Exit", 7)   
        #//////////////////////////////////////////////////////////
            
        #NPC text//////
        elif n == 224:
            pyxel.rect(0, 100, 128, 63, 0)
            self.Draw_fonts(["MI","YA","KO","NO","E","I","HE","I","DA"],5, 105)
            pyxel.text(5, 120, "Press SPACE-KEY to continue...", 
                       pyxel.frame_count % 16)   
        elif n == 225:
            pyxel.rect(0, 100, 128, 63, 0)
            self.Draw_fonts(["MI","YA","KO","NO","JI","yu","U","NI","NN",
                             "DA"],5, 105)
            pyxel.text(5, 120, "Press SPACE-KEY to continue...", 
                       pyxel.frame_count % 16)   
        #/////////////
            
        #Return game
        if pyxel.btnp(pyxel.KEY_SPACE):
            self.movie_flug = False
    
    def Draw_fonts(self,txt,x,y):  
        txt_count = len(txt)      
        for i in range(txt_count):
            #Key check
            font_xy = self.font_list[txt[i]]
           
            fontx = font_xy[0]
            fonty = font_xy[1]
            pyxel.blt(x + 8 * i,y,1,fontx,fonty,8,8,14)
           
              
    class Player:
    def __init__(self, x, y):
        self.player_x = x
        self.player_y = y
        self.player_h = 100
        self.player_d = 0
        self.player_m = 0
        self.player_m2 = 0
        self.money = 0
    def update(self, x, y):
        self.player_x = x
        self.player_y = y
    
    class NPC:
     def __init__(self, x, y, b, v):
         self.npc_x = x
         self.npc_y = y
         self.npc_b = b
         self.npc_v = v
         self.npc_m = 0
     def update(self, x, y):
         self.npc_x = x
         self.npc_y = y
         
    class Enemy1:
     def __init__(self, x, y, v, v2):
         self.enemy_x = x
         self.enemy_y = y
         self.enemy_h = 10 + v2*5
         self.enemy_d = 0
         self.enemy_m = 0
         self.enemy_m2 = 0
         self.enemy_v = v
         self.enemy_v2 = v2
     def update(self, x, y):
         self.enemy_x = x
         self.enemy_y = y
         
    class Shop:
     def __init__(self, n):
         self.shop_v = n
         self.item = [["I","TI"],
                     ["NI"],
                     ["SA","NN"],
                     ["YO","NN"]]
         self.price = [100,200,300,400]
         self.text_n = 0
         self.urikire = [0, 0, 0, 0]
     def Show_text(self):
         t = self.text_n
         if t == 0:
             return [["I","RA","tu", "SI", "ya", "I", "MA", "SE"],
                     ["SI","yo","U", "HI", "NN", "NO", "BA", "NN"],
                     ["GO","U","WO", "E", "RA", "NN", "DE", "KU"],
                     ["DA","SA","I"],]
         elif t == 1:
             return [["HI","TO","TU", "ME", "NO", "SI", "yo", "U"],
                     ["HI","NN","DE", "SU"],
                     ["KA","I","MA", "SU", "KA"]]
         elif t == 2:
             return [["HU","TA","TU", "ME", "NO", "SI", "yo", "U"],
                     ["HI","NN","DE", "SU"],
                     ["KA","I","MA", "SU", "KA"]]
         elif t == 3:
             return [["MI","tu","TU", "ME", "NO", "SI", "yo", "U"],
                     ["HI","NN","DE", "SU"],
                     ["KA","I","MA", "SU", "KA"]]
         elif t == 4:
             return [["YO","tu","TU", "ME", "NO", "SI", "yo", "U"],
                     ["HI","NN","DE", "SU"],
                     ["KA","I","MA", "SU", "KA"]]
         elif t == 98:
             return [["U","RI","KI", "RE", "DE", "SU",]]
         elif t == 99:
             return [["O","KA","NE", "GA", "TA", "RI", "MA", "SE"],
                     ["NN"]]
         elif t == 100:
             return [["MA","I","DO", "A", "RI",]]
    
    App()

    うーん...まぁinit部分は見やすくなったかな?
    敵の座標を外に出せたので、ちょっとは拡張がしやすくなったかもしれません。例えば、「難易度ごとに敵の配置を変える」とかも本体側は呼び出す関数を変えればいいだけで、あとはモジュール側の記載でできそうな気がします。

    GitHubもディレクトリ構成をほんのちょっとだけいじりました。以後このRPGもどきは以下のフォルダで更新していこうと思います。

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

     
     
    出版社のしがない社内SE。 ここでは主に趣味のプログラミングやゲーム制作について書いています。作ったゲームは https://koidemizu.github.io/ で公開しているのでよかったら遊んでください。 ゲーム大好きインドア派。

    あなたへのおすすめ