メインコンテンツへスキップ
見出し画像

【pyxel 1.5】pyxelで3D迷路を作ってみる(5)

    今回は短めですが、敵のグラフィックを試作してみた話になります。

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

    さて、前回までで迷路としての体裁はある程度できたので、要素を追加してゲームらしくしていきます。具体的には「敵から逃げながら」「何かを成し遂げて」「ゴールに到着」という形を想定しています。
    敵の見た目ですが、前回泡のグラフィックを作ったので「海っぽいもの」。画面は基本黒だから「深海」。という感じで作ってみました。

    画像
    ▲深海魚的なやつが迫ってきます。距離によって4つのイメージを分けて描画します。

    それではコードに移っていきます。

           #Draw enemy-------------------------------------------------------------
           
          if pyxel.btn(pyxel.KEY_1): 
           #Pos 1------------------------------------------------------------------
              ex = 117
              ey = 75
              pyxel.circ(ex, ey, 1, 9)
              pyxel.circ(ex - 1, ey + 1, 1, 9)
              pyxel.circ(ex + 16, ey, 1, 9)
              pyxel.circ(ex + 16 + 1, ey + 1, 1, 9)
              
          elif pyxel.btn(pyxel.KEY_2):     
           #Pos 2------------------------------------------------------------------
              ex = 114
              ey = 70
              pyxel.circ(ex, ey, 2, 9)
              pyxel.circ(ex - 1, ey + 1, 2, 9)
              pyxel.circ(ex + 26, ey, 2, 9)
              pyxel.circ(ex + 26 + 1, ey + 1, 2, 9)      
              
          elif pyxel.btn(pyxel.KEY_3): 
          #Pos 3-------------------------------------------------------------------
              ex = 109
              ey = 65
              pyxel.circ(ex, ey, 3, 9)
              pyxel.circ(ex - 1, ey + 1, 3, 9)
              pyxel.circ(ex + 36, ey, 3, 9)
              pyxel.circ(ex + 36 + 1, ey + 1, 3, 9)
              pyxel.circ(ex - 1, ey + 1, 2, 10)
              pyxel.circ(ex + 36 + 1, ey + 1, 2, 10)
          
          #teeth 1----------------------------------------------------------------
              x = 105
              x2 = 110
              y = 100
              x3 = x + ((x2 - x) / 2)
              y3 = 90
                
              for i in range(5):
                  vx =  i * 4.3
                  vy =  i * 5
                  pyxel.tri(x+vx, y+vy, x2+vx, y+vy, x3+vx, y3+vy, 1)      
                  pyxel.trib(x+vx, y+vy, x2+vx, y+vy, x3+vx, y3+vy, 7)    
          
          #teeth 2-----------------------------------------------------------------
              x = 145
              x2 = 150
              y = 100
              x3 = x + ((x2 - x) / 2)
              y3 = 90
           
              for i in range(5):
                  vx =  i * 4.3
                  vy =  i * 5
                  pyxel.tri(x-vx, y+vy, x2-vx, y+vy, x3-vx, y3+vy, 1)              
                  pyxel.trib(x-vx, y+vy, x2-vx, y+vy, x3-vx, y3+vy, 7)              
          
          #teeth 3----------------------------------------------------------------
              x = 105
              x2 = 110
              y = 87
              x3 = x + ((x2 - x) / 2)
              y3 = 97
          
              for i in range(5):
                  vx =  i * 4.3
                  vy =  i * -5          
                  pyxel.tri(x+vx, y+vy, x2+vx, y+vy, x3+vx, y3+vy, 7)      
                  pyxel.trib(x+vx, y+vy, x2+vx, y+vy, x3+vx, y3+vy, 1)     
          
          #teeth 4----------------------------------------------------------------
              x = 145
              x2 = 150
              y = 87
              x3 = x + ((x2 - x) / 2)
              y3 = 97
          
              for i in range(5):
                  vx =  i * 4.3
                  vy =  i * -5
                  pyxel.tri(x-vx, y+vy, x2-vx, y+vy, x3-vx, y3+vy, 7)      
                  pyxel.trib(x-vx, y+vy, x2-vx, y+vy, x3-vx, y3+vy, 1)      
         #------------------------------------------------------------------------
          elif pyxel.btn(pyxel.KEY_4): 
          #Pos 4-------------------------------------------------------------------
              ex = 85
              ey = 40
              pyxel.circ(ex, ey, 4, 9)
              pyxel.circ(ex - 1, ey + 1, 4, 9)
              pyxel.circ(ex + 80, ey, 4, 9)      
              pyxel.circ(ex + 80 + 1, ey + 1, 4, 9)
              pyxel.circ(ex + 80 + 1, ey + 1, 3, 10)
              pyxel.circ(ex - 1, ey + 1, 3, 10)  
          
          #teeth 1----------------------------------------------------------------
              x = 75
              x2 = 85
              y = 110
              x3 = x + ((x2 - x) / 2)
              y3 = 90
                
              for i in range(5):
                  vx =  i * 10
                  vy =  i * 8
                  pyxel.tri(x+vx, y+vy, x2+vx, y+vy, x3+vx, y3+vy, 1)      
                  pyxel.trib(x+vx, y+vy, x2+vx, y+vy, x3+vx, y3+vy, 7)    
          
          #teeth 2-----------------------------------------------------------------
              x = 165
              x2 = 175
              y = 110
              x3 = x + ((x2 - x) / 2)
              y3 = 90
          
              for i in range(5):
                  vx =  i * 10
                  vy =  i * 8
                  pyxel.tri(x-vx, y+vy, x2-vx, y+vy, x3-vx, y3+vy, 1)              
                  pyxel.trib(x-vx, y+vy, x2-vx, y+vy, x3-vx, y3+vy, 7)              
          
          #teeth 3----------------------------------------------------------------
              x = 75
              x2 = 85
              y = 64
              x3 = x + ((x2 - x) / 2)
              y3 = 90
          
              for i in range(5):
                  vx =  i * 10
                  vy =  i * - 8          
                  pyxel.tri(x+vx, y+vy, x2+vx, y+vy, x3+vx, y3+vy, 7)      
                  pyxel.trib(x+vx, y+vy, x2+vx, y+vy, x3+vx, y3+vy, 1)     
          
          #teeth 4----------------------------------------------------------------
              x = 165
              x2 = 175
              y = 64
              x3 = x + ((x2 - x) / 2)
              y3 = 90
          
              for i in range(5):
                  vx =  i * 10
                  vy =  i * - 8
                  pyxel.tri(x-vx, y+vy, x2-vx, y+vy, x3-vx, y3+vy, 7)      
                  pyxel.trib(x-vx, y+vy, x2-vx, y+vy, x3-vx, y3+vy, 1)      
         #------------------------------------------------------------------------

    ▲描画のコード部分。今回はテスト用に1・2・3・4のキーを押すと各距離でのイメージが表示されます。

          if pyxel.btn(pyxel.KEY_1): 
           #Pos 1------------------------------------------------------------------
              ex = 117
              ey = 75
              pyxel.circ(ex, ey, 1, 9)
              pyxel.circ(ex - 1, ey + 1, 1, 9)
              pyxel.circ(ex + 16, ey, 1, 9)
              pyxel.circ(ex + 16 + 1, ey + 1, 1, 9)

    ▲一番遠い距離の場合。pyxel.circで丸を描いて、2つずらしてつなげることで楕円っぽくします。

    画像
    ▲表示するとこんな感じ
          elif pyxel.btn(pyxel.KEY_2):     
           #Pos 2------------------------------------------------------------------
              ex = 114
              ey = 70
              pyxel.circ(ex, ey, 2, 9)
              pyxel.circ(ex - 1, ey + 1, 2, 9)
              pyxel.circ(ex + 26, ey, 2, 9)
              pyxel.circ(ex + 26 + 1, ey + 1, 2, 9)      

    ▲1段階近づいた状態。先ほどとほぼ同じです。

    画像
    ▲ちょっと近づいてきました。
          elif pyxel.btn(pyxel.KEY_3): 
          #Pos 3-------------------------------------------------------------------
              ex = 109
              ey = 65
              pyxel.circ(ex, ey, 3, 9)
              pyxel.circ(ex - 1, ey + 1, 3, 9)
              pyxel.circ(ex + 36, ey, 3, 9)
              pyxel.circ(ex + 36 + 1, ey + 1, 3, 9)
              pyxel.circ(ex - 1, ey + 1, 2, 10)
              pyxel.circ(ex + 36 + 1, ey + 1, 2, 10)
          
          #teeth 1----------------------------------------------------------------
              x = 105
              x2 = 110
              y = 100
              x3 = x + ((x2 - x) / 2)
              y3 = 90
                
              for i in range(5):
                  vx =  i * 4.3
                  vy =  i * 5
                  pyxel.tri(x+vx, y+vy, x2+vx, y+vy, x3+vx, y3+vy, 1)      
                  pyxel.trib(x+vx, y+vy, x2+vx, y+vy, x3+vx, y3+vy, 7)    
          
          #teeth 2-----------------------------------------------------------------
              x = 145
              x2 = 150
              y = 100
              x3 = x + ((x2 - x) / 2)
              y3 = 90
           
              for i in range(5):
                  vx =  i * 4.3
                  vy =  i * 5
                  pyxel.tri(x-vx, y+vy, x2-vx, y+vy, x3-vx, y3+vy, 1)              
                  pyxel.trib(x-vx, y+vy, x2-vx, y+vy, x3-vx, y3+vy, 7)              
          
          #teeth 3----------------------------------------------------------------
              x = 105
              x2 = 110
              y = 87
              x3 = x + ((x2 - x) / 2)
              y3 = 97
          
              for i in range(5):
                  vx =  i * 4.3
                  vy =  i * -5          
                  pyxel.tri(x+vx, y+vy, x2+vx, y+vy, x3+vx, y3+vy, 7)      
                  pyxel.trib(x+vx, y+vy, x2+vx, y+vy, x3+vx, y3+vy, 1)     
          
          #teeth 4----------------------------------------------------------------
              x = 145
              x2 = 150
              y = 87
              x3 = x + ((x2 - x) / 2)
              y3 = 97
          
              for i in range(5):
                  vx =  i * 4.3
                  vy =  i * -5
                  pyxel.tri(x-vx, y+vy, x2-vx, y+vy, x3-vx, y3+vy, 7)      
                  pyxel.trib(x-vx, y+vy, x2-vx, y+vy, x3-vx, y3+vy, 1)      
         #------------------------------------------------------------------------

    ▲さらに近づいた段階。目のほかに牙の描画も増えて一気にごちゃつきます。牙はfor文で繰り返しつつ、座標を移動して表示しています。

    画像
    ▲目はオレンジのほかに黄色を入れて、牙は上下で色分けします。
          elif pyxel.btn(pyxel.KEY_4): 
          #Pos 4-------------------------------------------------------------------
              ex = 85
              ey = 40
              pyxel.circ(ex, ey, 4, 9)
              pyxel.circ(ex - 1, ey + 1, 4, 9)
              pyxel.circ(ex + 80, ey, 4, 9)      
              pyxel.circ(ex + 80 + 1, ey + 1, 4, 9)
              pyxel.circ(ex + 80 + 1, ey + 1, 3, 10)
              pyxel.circ(ex - 1, ey + 1, 3, 10)  
          
          #teeth 1----------------------------------------------------------------
              x = 75
              x2 = 85
              y = 110
              x3 = x + ((x2 - x) / 2)
              y3 = 90
                
              for i in range(5):
                  vx =  i * 10
                  vy =  i * 8
                  pyxel.tri(x+vx, y+vy, x2+vx, y+vy, x3+vx, y3+vy, 1)      
                  pyxel.trib(x+vx, y+vy, x2+vx, y+vy, x3+vx, y3+vy, 7)    
          
          #teeth 2-----------------------------------------------------------------
              x = 165
              x2 = 175
              y = 110
              x3 = x + ((x2 - x) / 2)
              y3 = 90
          
              for i in range(5):
                  vx =  i * 10
                  vy =  i * 8
                  pyxel.tri(x-vx, y+vy, x2-vx, y+vy, x3-vx, y3+vy, 1)              
                  pyxel.trib(x-vx, y+vy, x2-vx, y+vy, x3-vx, y3+vy, 7)              
          
          #teeth 3----------------------------------------------------------------
              x = 75
              x2 = 85
              y = 64
              x3 = x + ((x2 - x) / 2)
              y3 = 90
          
              for i in range(5):
                  vx =  i * 10
                  vy =  i * - 8          
                  pyxel.tri(x+vx, y+vy, x2+vx, y+vy, x3+vx, y3+vy, 7)      
                  pyxel.trib(x+vx, y+vy, x2+vx, y+vy, x3+vx, y3+vy, 1)     
          
          #teeth 4----------------------------------------------------------------
              x = 165
              x2 = 175
              y = 64
              x3 = x + ((x2 - x) / 2)
              y3 = 90
          
              for i in range(5):
                  vx =  i * 10
                  vy =  i * - 8
                  pyxel.tri(x-vx, y+vy, x2-vx, y+vy, x3-vx, y3+vy, 7)      
                  pyxel.trib(x-vx, y+vy, x2-vx, y+vy, x3-vx, y3+vy, 1)      
         #------------------------------------------------------------------------

    ▲最も接近した状態。コードは先ほどとほぼ同じ。

    画像
    ▲背景が透けて見えてるけど、光学迷彩か何か?

    とりあえず目と口を作ってみました。実は体もちょっと手を付けたのですが、ない方が見た目に統一感があるのでこれで行こうと思います。ほら、深海って真っ暗だから目とかしか見えないってことで。

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

    ▲リポジトリがごちゃごちゃしてきたので、各ゲームごとに切り分けました。

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


    この記事が参加している募集

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

    あなたへのおすすめ