見出し画像

【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の方に置いてあります。

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

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


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

つくってみた

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