見出し画像

【Python】波動を撃つ空手家【Pyxel】

レトロゲームエンジンPyxelで作ってみた波動を撃つ空手家です。
ムエタイの帝王とかを敵として出したかったんですが、そこまで作る気力はありませんでした…。

#波動を放つ空手家
import pyxel

class App:
    def __init__(self): 
        self.move_r = 0 #右移動フラグ
        self.move_l = 0 #左移動フラグ
        self.atk_flug = 0 #攻撃フラグ
        self.atk_count = 0 #攻撃硬直時間
        self.Player = Player(15, 19) #空手家初期位置
        self.Hadou = []
        
        pyxel.init(70,35)

        #ドット絵を読み込む
        pyxel.load('C:/pyxel/image/sf.pyxel')
        
        pyxel.run(self.update, self.draw)

pyxelをインポートして初期設定をします。各動作にフラグを持たせて、空手家のオブジェクトを作成。波動はリストとして、空で作っておきます。
ドット絵を読み込んで、runで起動します。

    def update(self):
        
        if pyxel.btnp(pyxel.KEY_Q):
            pyxel.quit()
            
        if self.atk_flug == 0: #攻撃硬直でない場合動作可能
            if pyxel.btnp(pyxel.KEY_SPACE): #スペースで攻撃
                if (self.move_r == 0 )and(self.move_l == 0):
                    if len(self.Hadou) < 1: #画面に表示できる波動は1個まで
                        #攻撃フラグとカウントを立て、Hadouのオブジェクトを作成する
                        self.atk_flug = 1
                        self.atk_count = 1
                        new_Hadou = Hadou(self.Player.player_x + 8,
                                          self.Player.player_y + 3)
                        self.Hadou.append(new_Hadou)
        
            if pyxel.btn(pyxel.KEY_RIGHT): #右移動
                if self.Player.player_x < 58:
                    self.move_r = 1
                    self.Player.update(self.Player.player_x + 0.5,
                                       self.Player.player_y)
            else:
                self.move_r = 0
            
            if pyxel.btn(pyxel.KEY_LEFT): #左移動
                if self.Player.player_x > 0:
                    self.move_l = 1
                    self.Player.update(self.Player.player_x - 0.5,
                                             self.Player.player_y)
            else:
                self.move_l = 0
        else: #攻撃硬直中の場合
            self.atk_count = self.atk_count + 1 #硬直フレーム数をカウントアップ
            if self.atk_count > 18: #18フレで解除
                self.atk_flug = 0
                self.atk_count = 0
        
        if len(self.Hadou) >= 1: #波動を進める処理
            if self.Hadou[0].hadou_x < 70:
                x = self.Hadou[0].hadou_x + 1.5
                y = self.Hadou[0].hadou_y
                self.Hadou[0].update(x, y)
            else:
                del self.Hadou[0]

atk_flugで攻撃の硬直を実装しています。硬直中でない場合は左右移動と攻撃ができます。
波動が存在している場合は画面端まで進めていきます。同時に1つしか存在できないようにしています。

    def draw(self):
        pyxel.cls(6)
        
       #空手家の描画
        if self.move_r == 1:
            pyxel.blt(self.Player.player_x,self.Player.player_y,0,0,16,16,16,3)
        elif self.move_l == 1:
            pyxel.blt(self.Player.player_x,self.Player.player_y,0,16,16,16,16,3)
        elif self.atk_flug == 1:
            pyxel.blt(self.Player.player_x,self.Player.player_y,0,16,0,16,16,3)
        else:
            pyxel.blt(self.Player.player_x,self.Player.player_y,0,0,0,16,16,3)
        
        #波動の描画
        if len(self.Hadou) >= 1:
            pyxel.blt(self.Hadou[0].hadou_x,self.Hadou[0].hadou_y,0,32,0,8,8,3)
        
class Player:
    def __init__(self, x, y):
        self.player_x = x
        self.player_y = y
    def update(self, x, y):
        self.player_x = x
        self.player_y = y
        
class Hadou:
    def __init__(self, x, y):
        self.hadou_x = x
        self.hadou_y = y
    def update(self, x, y):
        self.hadou_x = x
        self.hadou_y = y
        
        
        
App()

update()で計算した座標やフラグをもとに描画をしていきます。
空手家と波動のクラスを書いて、APP()で起動させます。

画像1

もう少し何とかなりそうですが、今回はここまで。対空攻撃が欲しいところです。

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