とりあたまの日々

アニメ、マンガ、その他趣味について書きます。

やればできるかね

歩くノイズをクリックするの続き。いろいろと参考にした結果、前回(どうにかしてくれ - とりあたまの日々)から改良したのが以下である。

f:id:chik08:20200621114424g:plain

 ランダムにノイズを描画、COUNTはノイズの数、クリックして全て滅したらゲームクリアとなる。

from enum import Enum, auto
from collections import deque, namedtuple

import pyxel
import random

# 初期値
WINDOW_H = 120
WINDOW_W = 160

class GAMEMODE(Enum):
    # 画面のシーンをEnum
    Title = auto()
    Noise = auto()

class Noise:

    def __init__(self):
        # 変数初期値
        self.IMG_ID0 = 0
        self.x = 0
        self.y = 56
        self.vx = 1
        self.pos = -32

        # ノイズ存在フラグ
        self.exists = True

    def update(self):
        # 移動する
        self.x += self.vx
        # 画面外に出ないようにする
        if self.x < 0:
            self.x = 0
            self.vx *= -1
            self.pos = -32
        if self.x > pyxel.width - 32:
            self.x = pyxel.width -32
            self.vx *= -1
            self.pos = 32

    def checkHit(self, x, y):
        # 判定
        left = self.x
        top = self.y
        right = self.x + 32
        bottom = self.y + 32
        if left <= x <= right:
            if top <= y <= bottom:
                return True
        return False

    def draw_noise(self):
        # 歩くノイズ描画
        pyxel.blt(self.x, self.y, self.IMG_ID0, 0, 32*(pyxel.frame_count % 4), self.pos, 32, 7)

class App:

    def __init__(self):
        pyxel.init(WINDOW_W, WINDOW_H, caption="noise", fps=12)
        pyxel.load("assets\walk.pyxres")

        self.noise_list = []
        self.count_noise = 3 # ノイズの数
        for i in range(self.count_noise):
            noise = Noise() # オブジェクト生成
            noise.x = random.randint(32, pyxel.width-32)
            self.noise_list.append(noise)

        self.my_gamemode = GAMEMODE.Title # 最初にタイトル画面を表示
        pyxel.run(self.update, self.draw)

    def update(self):
        # 選択update
        if self.my_gamemode == GAMEMODE.Title:
            self.update_title()
        elif self.my_gamemode == GAMEMODE.Noise:
            self.update_noise()
            pyxel.mouse(True)

    def update_title(self):
        # スペース押下で遷移する
        if pyxel.btnp(pyxel.KEY_SPACE):
            self.my_gamemode = GAMEMODE.Noise

    def update_noise(self):
        for noise in self.noise_list:
            if noise.exists:
                if pyxel.btnp(pyxel.MOUSE_LEFT_BUTTON):
                    if noise.checkHit(pyxel.mouse_x, pyxel.mouse_y):
                        # クリックされたらノイズを消す
                        noise.exists = False
                        # ノイズの残り数
                        self.count_noise -= 1
                # 生存している場合のみ更新
                if noise.exists:
                    noise.update()

    def draw(self):

        pyxel.cls(0)
        # 選択draw
        if self.my_gamemode == GAMEMODE.Title:
            self.draw_title()

        elif self.my_gamemode == GAMEMODE.Noise:
            self.draw_noise()

    def draw_title(self):
        # タイトル画面
        pyxel.text(52, 50, "WALK ONLY NOISE", 7)
        pyxel.text(60, 60, "PUSH, SPACE", 7)

    def draw_noise(self):
        # 生存している場合のみ描画
        for noise in self.noise_list:
            if noise.exists:
                noise.draw_noise()
                # メッセージ
                pyxel.text(60, 0, "CLICK NOISE!", 7)
                pyxel.text(0, 0, "COUNT: %d" %(self.count_noise), 7)
                # 地面
                pyxel.bltm(0, 88, 0, 0, 0, 24, 16)

        is_wiped = True # 全滅したかどうか
        for noise in self.noise_list:
            if noise.exists:
                is_wiped = False # 全滅していない
        if is_wiped:
           # 全滅させたのでクリア
           pyxel.text(60, 50, "GAME CLEAR", 7)

App()

 ノイズの数が増えたことによって、より存在感が際立った。ノイズの種類を増やすとか、クリックで消滅ではなく響の攻撃で滅するとか、まだ改造できそうだ。

あとは、BGMとかも付けたいところだ。また何か調べていこう。