とりあたまの日々

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

手軽にできるけど

思い出したかのようにアプリゲームをやった。いつもはログインだけで終わる「デュエプレ」をやった。進めていなかったストーリーを進めて、デッキ構成を考えて、イベントもぽちぽちした。

時間を過ぎるのも忘れて、カードの分解と生成、次はどのデッキにしようかとやっていた。ランクマもやってみたりして、はじめて勝てたりした。しばらくやったのち、次の日、残りのストーリーも進めた。

しかし、それは急激に起こった。飽きたのである。目当てのカードが出ず、イベントも何だかで、モチベーションは瞬く間に下がったのである。無料のゲームなんだからと言えば、それまでだけど。他のアプリゲームでもあるのだが、やりたい欲が出るのに、すぐ冷めていくのである。

数年前までは毎日のようにお目当てのカードの為にイベントを走ったりした。溜まった石でガチャを回して、一喜一憂した。あの時は、ひたすらやってたのに。

手軽さゆえに、やるのも飽きるのも早いのか。思い出した時にやればいいのだが。今日はどうしようか。

やればできるかね

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

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とかも付けたいところだ。また何か調べていこう。

どうにかしてくれ

前回(何だこれは - とりあたまの日々)のドット絵で響やキャロルを描けなかった私はとうとうノイズで何か作ることにした。

f:id:chik08:20200614163233p:plain

そして、出来上がったのがこれになる。何となく形にはなったが、やはりノイズが異様である。動きがおかしい。

f:id:chik08:20200614163657g:plain

 以下の実装でノイズが歩行する描写ができた。歩行の速さは適当に調整した。クリックするとゲームクリアとなる。

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

import pyxel

# 初期値
WINDOW_H = 120
WINDOW_W = 160

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

class App:

    def __init__(self):
        pyxel.init(WINDOW_W, WINDOW_H, caption="noise", fps=12)
        pyxel.load("assets\walk.pyxres")
        self.my_gamemode = GAMEMODE.Title # 最初にタイトル画面を表示

        # 変数初期値
        self.IMG_ID0 = 0
        self.x = 0
        self.y = 56
        self.vx = 1
        self.pos = -32

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

        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):
        # 左クリックしたらノイズ消滅
        if pyxel.btnp(pyxel.MOUSE_LEFT_BUTTON):
            left   = self.x
            top    = self.y
            right  = self.x + 32
            bottom = self.y + 32
            if left <= pyxel.mouse_x <= right:
                if top <= pyxel.mouse_y <= bottom:
                    self.exists = False
        # 消滅しているので更新不要
        if self.exists == False:
            return
        # 移動する
        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 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):
        # 消滅しているので更新不要
        if self.exists == False:
            pyxel.text(60, 50, "GAME CLEAR", 7)
            return
        pyxel.text(60, 20, "CLICK NOISE!", 7)
        # 歩くノイズ描画
        pyxel.blt(self.x, self.y, self.IMG_ID0, 0, 32*(pyxel.frame_count % 4), self.pos, 32, 7)
        # 地面
        pyxel.bltm(0, 88, 0, 0, 0, 24, 16)

App()

 いろいろと参考にした結果、歩くだけとなった。まだ1体をクリックするだけなので、もっとゲーム性を増したいと思う。

先日、シンフォギアのアプリゲームが「魔法少女リリカルなのは Detonation」とコラボしたみたいだが、プレイしないまま終わってしまった。

考えよう

ポートフォリオサイトを作ろうとして思ったこと。いざ作ろうとした時のことを述べてみる。

・デザインについて

 別にデザイナーでもないしとは思いつつ、作るからにはかっこいいデザインにはしたい。とはいえ、時代にそぐわないのはアレだし、あえてクラシックデザインにするか。考えれば考えるほど悩む。

・レスポンシブ対応

 「今時レスポンシブ対応にしてないとか有り得ない」とか思われたくので、デバイスに依存しないように作成したい。

・作成物

 そもそも見せられるほどたくさんの作成物がない。これは重要なことである。何かしら見せられるものを作っていきたい。手を動かせ、創造しろ、と念仏を唱えるばかりである。アウトプットが大事だよね。

今後の課題である。

何だこれは

EDGEなるドット絵エディタを使ってみた。ポチポチ打ってたら、いつの間にかてっぺんを過ぎていった。何とか1枚は絵を描けた。

f:id:chik08:20200524195803p:plain

そして、前回(在宅でも成果を挙げたい - とりあたまの日々)作成した電気ねずみのプログラムを使用して動かしてみた。

f:id:chik08:20200524201157g:plain

ノイズを5体も並べたら流石に異様な光景になった。せめて響やキャロルちゃんも用意して、戦わせるとかすればよかった。またいろいろ調べたり、参考にして実装していきたいと思う。

適合していきたい

PythonおよびPyxelでタイトル画面を作った。

まずは、Pyxel Editorでドットを打っていく。思いのほか上手くいかず、何度もやり直して作成した。

f:id:chik08:20200517184001p:plain

そして、それらしく配置して表示する。

f:id:chik08:20200517184310g:plain

戦姫絶唱シンフォギア」と表示される。タイトル画面だけなのでゲームが始まるわけではない。今後、ゲームができるように実装していきたいと思う。

シンフォギアでアクションゲーム、リズムゲームが出たらやってみたいものだね。

在宅でも成果を挙げたい

Pythonの勉強として、Pyxelなるレトロゲームエンジンを使用して電気ねずみさんを動かしてみた。試行錯誤の末、今のところゲーム性はないが何となく形にはなったと思う。以下、やったこと。

・左右移動
・ジャンプ
・でんきショック

f:id:chik08:20200510205836g:plain

「わたモテ」喪176を見て、自分も目標に向かって何かやらなくてはと思う今日この頃だった。