ゲーム作りは楽しい

なんか書く

クソワンデッキデュエル

ワンデッキデュエルとは

カードキングダムで紹介された1つのデッキを使って昔ながらの遊戯王を楽しむゲームです。

本家はポケモンカード等たまに出てくるが、基本は遊戯王の原型を保ち、遊戯王が好きな人、好きだった人が楽しめるような構築になっています。

作ったデッキ

さて、私も最近ワンデッキデュエルを遊んでいるのですが、もはや遊戯王の原型を保てないほど沢山のカードゲームのカードが入っており、なんのゲームだかわかりません笑。他のゲームの名詞は遊戯王の名詞と置き換えて無理やり遊んでいます。(クリーチャーはモンスターと同義など)
ただ、厳密にルールを決めてると言うよりは柔軟に翻訳をして雑に遊んでいます。

そんな感じで雑なので「クソワンデッキデュエル」とでも名乗ることにします。

いろいろ突っ込んでいた結果、最近デッキ枚数が120枚を越えてきたので、圧縮版のデッキも組みました。

f:id:mahou_ptr:20200222191829j:plain


自分のルールでは生贄はなしで遊んでいるので、ブルーアイズとかはいきなり出して構いません。

また、ひとつのカードに複数のカードが含まれてたりもして、むちゃくちゃです。
(重なった魔法など発動は1度までですが死者蘇生した場合は再度使用できます)

f:id:mahou_ptr:20200222192657j:plain:w150

そんな感じで、遊戯王というルールに上乗せする形で、色んなカードゲームのカードを見ては、これを入れたら盛り上がりそう!みたいなことを考えながら遊びを作っています。

2019 10~12月 アニメ/ゲーム感想

まえがき

もともと仕事の中で個人的に始めたやつなんですが、遊んだゲームの感想とかをまとめてました。
勿体ないのでブログにも記載しようかと思ってこちらにも記載します。
あと最近、アニメは全然見れてないです。

今期見たアニメ

ゲームがメインでアニメがそれの追尾のはずだが、発売延期によりゲーム発売される前にアニメが先に終わってしまった。
レベルファイブの日野社長のブログによると発売予定していたゲームをタイトルを変えて2020年に4月発売予定とのこと
イナズマイレブンの新作はiOS aOS switch ps4クロスプラットフォームが予定されていたのもあり、各ハードでの操作感やグラフィックなどが気になっています。
(アニメ放送自体はもっと前ですが終わったと知ってdアニメで見ました)

今期遊んだゲーム

  • moon

有名な作品らしいですが、プレイしたことがなかったのでやってみました。
敵と戦わないアンチRPG
個性的なキャラクターが魅力的で面白かったのと、無茶ぶりくらいな謎解き要素が多く難しい印象でした。
BGMが自分で何を流すか選べるというのはRPGにしては珍しいとも思いました。
(でも金をためてbgmを買うので攻略に必要なもの以外ほぼ買わなかった)
名作にはキャラが個性的なものが多くUndertaleとかも影響を受けた作品なんじゃないかと思いました。(敵を倒さない所なども含め)

ドラクエシリーズではかなりの人気作でしたがクリアまでプレイしたことがなかったのでやりました。しんりゅうを倒しました。
性格によってパラメータの上がり幅が変わるシステムだったのを初めて知り、他のドラクエにはなかったシステムだったので驚きました。
これだけのボリュームのものをFCでつくらているのはやはりすごいなと思ったのと
昔から人気なコンシューマのシリーズ作品はFCの時代から明らかにクオリティの高いものを作れていると改めて思いました。

ジャンプ後方向転換できないとか、床から落ちる場合にx軸の速度が無視されて真下に垂直に落ちるなどの操作性がとても気持ちよくなかった印象でした。(関連シリーズの「デモンズブレイゾン」も遊びましたがこちらは操作性がかなり改善されていた)
また、同じステージを最低でも2周もさせられるという仕組みが面倒臭かった。
ラスボスに挑むためにはランダムドロップの専用の武器を必ず装備する必要があり、そうでない場合はなんどもラス面をやらされるという辛い設計でした。
もともとACだったのもありそう簡単にクリアさせない意図があったのかなと思います。
エンディングのスタッフがみんなニックネームで書かれていたのがみていて面白かった。

  • 戦え原始人3

全然知らない作品だったのですが、switchのスーファミにあったので一通り遊んでクリアしました。
操作性としては、ダッシュと攻撃とジャンプとしゃがむ くらいですが
ダッシュ中は攻撃できなかったのでスピード感もって進むことはできなかった。
ただ、そこがこのゲームの駆け引きの部分だったのかもしれない。
ステージの途中で遠距離型の武器が隠されていて入手するとかなり有利に戦えるようになったのがすごく楽しかったし気持ち良かった。
ラスボスだけすごく理不尽な攻撃をしてきたのが辛かった。
(僕が攻略できてないだけかもしれません。)

MMORPG自体が実は初めてでわくわくしました。
通りがかりの戦闘中のプレイヤーに応援してあげることで手助けができる機能があり(応援するとテンションがあがる)、自分も知らない人に応援してもらえて嬉しかったし、そのあとフレンドになれたという成功体験ができました。
また、オンラインゲームとはいえ一人で遊ぶ機会が多いと思いますが、野良の人とパーティを組むのは少し敷居の高さがあると思います。
なので、休憩中のプレイヤーをAI行動でレンタルできる機能があり一人プレイでも問題なく楽しむことができました。
ストーリーは全体として新しい城についたら必ず困ってる人がいてイベントがある。攻略すると進むという統一された形になっていたのでわかりやすかった。(自分はまだver1までの範囲ですが)
サーバーは細かく別れていて、初心者・カムバック専用/ソロ専用/学生専用/実況者専用/etc...
同じ目的や状況に合わせたサーバー選びができたのがいいなと思いました。
もちろん自分の場合は迷わず初心者サーバーに入れりました。
また、オンラインというのもあって他のドラクエ以上に育成はサクサクできた印象です。
レベル80未満の間は経験値2倍の装備が最初で手に入ったり、初心者サーバー限定で毎日定時にメタル系が必ず出てくる時間があったりしました。

さすがにまだクリアはしていないので今後ものんびり進めていきたいです。

3Dがより強化されて広い世界を冒険している印象が今まで以上に感じられワクワク感がすごかったです。特にワイルドエリアという他のプレイヤーとも繋がれる場所が広い。
また、町も魅力的な町が多くて良かった。
育成面は従来の「がくしゅうそうち」が廃止されてデフォルトで手持ちポケモン全員が育つようになったのでストーリーもサクサク進めれて良かった印象です。
自分はバトルガチ勢ではないので厳選やガチ育成はしないのですがそこら周りもより良くなっている印象でした。
新アイテムの「けいけんちアメ」でレベル上げが早かったり、ポケモンの性格補正を変えれるアイテムがでたりしていました。
毎回ポケモンの新作を遊ぶたびに思うことですが、このゲームはいろんな楽しみ方がされているゲームだからすごくいいし、かつ毎度それら全てに磨きがかかっている気がしています。
(ストーリー、育成、バトル、図鑑コンプ、ポケモンとのふれあい etc)

転職します。

先に言いますが、転職エントリではないです。 あの文化好きじゃない。


いろいろあり、次もまたゲーム業界ですが
ソーシャルゲームのサーバーエンジニア ⇒ コンシューマー
といった感じで、同じゲームプログラマーですが全く違った方向に行きます。

でも、もともと興味があった分野なので楽しみです(あと不安やプレッシャーもいい感じに感じてます)

もともと知識がゼロだったのもあり、学んでみたいと思い約二年サーバーエンジニアをやらしてもらってました。
ゲームプログラマーを目指す人たちって目に見えるアプリケーションのとことかに意識を向けがちでサーバーのこととか良くわからなかったりするのかなと思います。(自分もそうでした)
やってみて思ったのは、確かに目に見えないところではあるが自分はゲームを作っているぞという感覚は決して失われなかったので結構楽しいじゃんといった感じでした。
まぁこれは人や会社によっては変わるかも。。

ソーシャルゲームのサーバーということでたくさんのユーザーを抱えたサービスにもなるので、そういった経験を仕事の中で学べたのはよかったなと思っています。

リポジトリに別れを告げるのを忘れてた。。まぁいいけど(笑)

さて、またこれからリスタートにはなりますが頑張っていきます。

ハッシュドポテトの作り方 C++編

はじめに

本記事はネタである。 ハッシュドポテイトうんめなー

今日もハッシュドポテイト食べたいなー

よし、作ろう

1. ポテトを用意する

// ポテト
struct 
{
    std::uint8_t taste;     // 味
    std::uint8_t fragrance; // 香り
    std::uint8_t freshness; // 新鮮さ
    std::uint8_t size;      // 大きさ
};

まずはポテトを用意した。 評価する要素として、テキトーに4つ用意した

2. ポテトの下ごしらえ

ハッシュドポテトを作る前にきっちり水で洗い、皮をむきましょう。特に芽には気をつけましょう。

// ポテト
struct Potate
{
    union
    {
        struct 
        {
            std::uint8_t taste;     // 味
            std::uint8_t fragrance; // 香り
            std::uint8_t freshness; // 新鮮さ
            std::uint8_t size;      // 大きさ
        };
        std::uint32_t individual; // 個体値
    };
};

同じポテトでも、それぞれ個性は違うもの!ここでは各要素をまとめた個体値を定義した。

3. ハッシュしていく

いよいよ準備したポテトをハッシュしていく

// ポテト
struct Potate
{
    union
    {
        struct 
        {
            std::uint8_t taste;     // 味
            std::uint8_t fragrance; // 香り
            std::uint8_t freshness; // 新鮮さ
            std::uint8_t size;      // 大きさ
        };
        std::uint32_t individual; // 個体値
    };
    
    bool operator ==(const Potate& other) const
    {
        return this->individual == other.individual;
    }
    bool operator !=(const Potate& other) const
    {
        return this->individual != other.individual;
    }
};

template<>
struct std::hash<Potate>
{
    std::size_t operator()(const Potate& potate) const
    {
        return potate.individual;
    }
};

よし!! これでポテトは無事にハッシュできるようになったわけだ。

4. 油で揚げる

ハッシュされただけでハッシュドポテトといえるのだろうか? 否!、しっかり油で揚げる必要がある。 カリッカリだからおいしいのだ!

しっかりハッシュされいるポテトは揚げるとしましょう。

// ハッシュできてれば揚げてよし
template<class T>
constexpr bool is_hashed = std::is_invocable_r_v<std::size_t, std::hash<T>, T>;

// ハッシュドポテト
using HashBrowns = std::conditional_t<is_hashed<Potate>, Potate, void>;

これでハッシュドポテトの完成です!!!

5. 食べる!!

おいしいハッシュドポテトをせっかく作ったので感想を言いましょう。

int main()
{
    // 感想
    using Impressions = std::unordered_map<HashBrowns, std::string>;
    Impressions impressions;
    
    HashBrowns potate{5, 5, 5, 5};
    impressions[potate] = "The potate Delicious!!!";
    std::cout << impressions[potate] << std::endl;
}

とっても、おいしいですね!!

まとめ

今回は、ハッシュドポテトの作り方を学びました。

皆さんも是非、ハッシュドポテトを作って、召し上がってください!

CocosCreator Effect classを考える

挨拶

久しぶりの投稿です。 4月から就職しました。(一応ゲームエンジニア)
最近はCocosCreatorを触っているのでそれ関連でEffectの管理を考えてみました。

Effect.js

cc.ComponentとしてEffectのマネージャーを作成する

export let Effect = cc.Class({
    extends: cc.Component,

    properties: {
        _effects: [],
        _isPause: false
    },
    statics: {
        main: null
    },

    // LIFE-CYCLE CALLBACKS:

    onEnable() {
        if (Effect.main)
            return;
        Effect.main = this;
    },
    onDisable() {

        if (Effect.main !== this)
            return;

        Effect.main = null;

    },
    update(dt) {
        if (this._isPause)
            return;
        //パフォーマンス不安
        this._effects = this._effects.filter((elm) => {
            if (elm._effect === null) {
                return false;
            }
            elm._timer += dt;
            let isDestory = !elm._effect.update(elm._timer);
            if (isDestory) {
                elm._effect.onDestroy();
            }
            return !isDestory;
        });
    },
    add(effect) {
        if (effect instanceof IEffect)
            this._effects.push({ _timer: 0, _effect: effect });
        else
            throw "effect type is must extends `IEffect`";
    },

    clear() {
        this._effects = [];
    },
    pause() {
        this._isPause = true;
    },
    resume() {
        this._isPause = false;
    }
});

add関数に渡すのはIEffectを継承して実装したエフェクトのインスタンスとする

export class IEffect {
    constructor(node = null) {
        this.node = node;
    }
    update(timeSec) {
        return timeSec <= 1.0;
    }
    onDestroy() {
        if (this.node !== null)
            this.node.destroy();
    }
}

Effectのupdate(dt)が追加したエフェクト全てのupdate(timeSec)に各経過時間を渡して呼んでいる
コンストラクタでnodeを登録しておけば自動でdestroy()をよんでもらえる。
cc.Nodeやcc.Componentを渡すことができる

Sample1

Sample1.js

import { Effect, IEffect } from "Effect";

class Sample1 extends IEffect {
    update(timeSec) {
        this.node.scale += 0.01;
        return timeSec <= 1;
    }
}
cc.Class({
    extends: cc.Component,

    start() {
        this.t = 0;
        Effect.main.add(new Sample1 (this.node));
    },
    update(dt) {
    },
});

Effectコンポーネントがアタッチされたノードをもつシーンで このスクリプトがアタッチされたプレハブを生成したりすればよい

C++ 範囲ベースforに自分で作ったclassを対応させる

はじめに

NITMic Advent Calender 25日目 担当のマホウです。

メリークリスマス!

僕はサンタさんに免許更新のお金をもらいました! ラッキーなことに初回の更新なのに講習を地元でうけれることになりました。

今日は C++の範囲ベースfor

//こーゆーの
for(auto&& elm:v)
{}

に自分の作ったクラスを対応させる方法を紹介します。

範囲ベースfor とは

そもそも範囲ベースfor(range-based for)とは 配列とかコンテナとかの要素を全て回したりするときに、とても使える構文で C#だとforeachってキーワードがあったりするあれみたいなものです。

例えば、こんなコード

int main()
{
    int ar[] = { 1,2,3 };
    for (size_t i = 0; i < std::size(ar); ++i)
    {
        std::cout << ar[i] << std::endl;
    }

    return 0;
}

int main()
{
    int ar[] = { 1,2,3 };
    for (int elm : ar)
    {
        std::cout << elm << std::endl;
    }

    return 0;
}

のようにかけます。

int elmの部分はコピーが発生するので、値を書き換えたいときやコピーのコストがかかるものは(というかclassは全部といってもいい) auto& elmのような参照にしておく必要があります。
書き換えないときはconst auto&にするとよいでしょう
ユニヴァーサル参照auto&&とかもあり(詳しいことは自分で調べて)

予断ですが普通forの時にint iとsize等の比較は符号有り無し比較で警告が出るのでsize_t等unsignedにする癖をつけといたほうがいいかもね

Range Concept

さっそくですが ある要件さえ満たしていれば範囲ベースforで使うことができます。

その要件は

  • begin()とend()メソッドを持っている(正確にはstd::begin/endをオーバーロードしてもいいのだがとてもオススメはしない)
  • begin()とend()の返り値の型は
    • operator *
    • operator ++(前置)
    • operator != を持つ

これだけです。 C++17ではない場合begin()とend()の返り値の型は同じでなければなりません。

ここなんか読むと範囲forがどう展開されるか書いてあるので、わかりやすいです。 cpprefjp.github.io

class Hoge 
{
    int m_ar[3];

public:
    Hoge():
        m_ar{1,2,3}
    {}
    /*
   ポインタ型は++ * !=をもつ
   */
    int* begin()
    {
        return &m_ar[0];
    }
    int* end()
    {
        return &m_ar[3];
    }

};
int main()
{

    Hoge hoge;

    for (int elm : hoge)
    {
        std::cout << elm << std::endl;
    }

    return 0;
}

応用例 逆順範囲for

ほしいと思ったことありませんか? 要件をしった僕達ならもう実現できちゃいます。

#include<iterator>

namespace range
{
    template<class Range>
    using range_value_t = typename std::iterator_traits<decltype(std::begin(std::declval<Range&>()))>::value_type;

    template<class Range>
    using range_iterator_t = decltype(std::begin(std::declval<Range&>()));

    template<class Range>
    using range_const_iterator_t = decltype(std::cbegin(std::declval<Range&>()));

    namespace detail
    {
        template<class Range>
        class ReverseRange
        {
            using iterator = std::reverse_iterator<range_iterator_t<Range>>;
            using const_iterator = std::reverse_iterator<range_const_iterator_t<Range>>;

        private:
            Range m_range;
        public:
            ReverseRange(Range&& range) :
                m_range(std::forward<Range>(range))
            {}

            iterator begin()
            {
                return iterator{ std::end(m_range) };
            }
            iterator end()
            {
                return iterator{ std::begin(m_range) };
            }

            const_iterator begin()const
            {
                return const_iterator{ std::end(m_range) };
            }
            const_iterator end()const
            {
                return const_iterator{ std::begin(m_range) };
            }
            std::size_t size()const
            {
                return std::size(m_range);
            }
        };
    }


    //逆順
    constexpr struct Reverse_OP
    {
        template<class Range>
        detail::ReverseRange<Range> operator ()(Range&& v)const
        {
            return detail::ReverseRange<Range>(std::forward<Range>(v));
        }

        template<class Range>
        friend auto operator -(Range&& v, Reverse_OP op)
        {
            return op(std::forward<Range>(v));
        }

    }reverse;
}
int main()
{

    int ar[] = { 1,2,3 };

    for (int elm : ar - range::reverse)
    {
        std::cout << elm << std::endl;
    }

    return 0;
}

最後に

25日間みなさんお疲れ様でした。 いろんな記事がよめて、特に自分があまり触れていない分野なんかは本当に勉強になりました。 今年はためしにやってみた感じですが、手ごたえはどうだったでしょうか?

いいね!って感じたならまた来年以降もやっていってくれたら良いかなと思います。

個人的によく使うノンダイアトニックコード紹介+α

はじめに

NITMic Advent Calendar 2017 21日目担当のマホウです お前も何回目だって言われそうですが、空いていたら埋めます。

今日はせっかくなので作曲の話をします。

  • プログラマーの職だった僕が作曲をはじめたきっかけの話
  • 個人的によく使うノンダイアトニックコードの紹介

をします!

コード(プログラミングのコードではない)

プログラミングの話を期待してた人は 昨日別のカレンダーで紹介した記事があるのでこっちで許して

qiita.com

作曲を始めたきっかけ

今年で作曲を始めてから3年目くらいになりますが、なんで部でプログラマーをやっていた僕が作曲を始めたかというと、答えはシンプルに面白そうだったからです。

にとみくを見学するまでパソコンで曲を作れるということも知りませんでした。DTM?何それ状態
ただ、曲を聴いたり歌ったり、どこからともなくメロディを思いついたりと音楽はもともと好きだったのと、
BGMが自分で作れたらゲーム制作で役立ちそうって思って興味を持ちました。
もともとモノづくり自体好きですしね!!!

かつて、にとみくの新入生歓迎会の日に
「志望役職はオールです」「提督なのです!」っていった日が懐かしく思えます。

で、ある日なんとなく「蟻さんに作曲教えてもらお!」って言ったら蟻さんが僕のPCに「Domino」を入れて環境も整えてくれたので僕は作曲を始めることができました。
すごく、適当な始まり方でしょ? でもそんなもんですよ、きっかけなんて。

ありがとう蟻さん

その後も、ことぶき君に「 FL Studio 」というちゃんとした作曲ソフトの使い方を教えてもらったり 先輩方から音楽理論を教えてもらったりと、、
なんやかんやあって今では作曲サークルにも所属してます♪

ちなみに楽器経験は皆無で小学生の時もリコーダーのドとレが鳴らせないレベルだし
最初は鍵盤でドとシ、ミとファの間には黒鍵がないことも知りませんでした。
和音#とは ってかんじでした。
ベースって何か知らなかった、ドラムも何もわからなかった。

そんな僕でも、調べたり、色々教えてもらいながら数をこなしていくうちに、少しずつ自分の曲が作れるようになっていきました!
本当にいい趣味を見つけたと思うし、にとみくに入ってなかったら作曲を始めることもなかったかもしれないと思うと奇跡にも思えます。

長々と話をしてきましたが、ごめん、僕が一番言いたいことはこれから言うこと

せっかく
プログラミングができる人、絵が描ける/モデリングができる人、曲が作れる人
いろんなことができる人が身近にいるのだから、興味をもって他の世界をのぞいてみるのも面白いかもしれないよ?
新しい出会いがあるかもしれません!

ただ創作は嫌々やるものでもないので、無理にやれとも言いませんし、最終的には楽しんでいただければ幸いです。
モチベがない時は無理にやんなくてもいいんです。

以下は普通に作曲の話。 音楽初心者なので説明は間違ってるかもしれません。

ノンダイアトニックコードとは

コード(chord)とは和音のことで、 ドミソとかシファソのようなに同時に鳴らす音のことを言うんだと思います。 三つだったら三和音、ドミソシのように四つだったら四和音とか言ったりします。

で、ダイアトニックコードとはkey=Cのときは「ドレミファソラシ」だけで構成されるコードのことをいい 皆がよく知っている

C Dm Em F G Am Bm-5
ドミソ レファラ ミソシ ファラド ソシレ ラドミ シレファ

も含まれます。

じゃあ、ノンダイアトニックコードとは何かというと、
ダイアトニックコードじゃないコードになります。

「ドレミファソラシ」で曲を作っていたのに、それ以外の音も使ったコードってことです。 そういったコードが上手く使えるようになっていくと、「あ!ここ、エモい!」ってなる曲も作れるようになるかもしれません。

その場合メロディやベースなんかもそのスケール外の音を通してあげることでより強調できるかもしれません。(そうしないとやばい時もあります…)

今日は僕がよく使うノンダイアトニックコード(を含む進行)を紹介したいと思います。

すべてkey=C,Amで紹介します。  

C7


C7はF(IV)のセカンダリードミナント

 Gm7 C7 | F

ツーファイブワンのセットで使うことが多い

Cdim

こないだ知ったばかりなので、まだ最新曲でつかってみた程度ですが紹介しておきます。
トニック・ディミニッシュというそうです。

 C | Cdim

D7


ドッペルドミナントとか言うやつ G(V)のセカンダリードミナント

 Dm | D7 | G

E7

僕がめっちゃ好きな奴


王道進行のIIImをIII(7)にした版 Am(VIm)のセカンダリードミナント

 F | G | E7 | Am

さらにツーファイブにするのもあり

 F | G Bm7-5 | E7 | Am

短調の曲のドミナントVm7はV7にするのもよし

 Am | G | F | E7

Fm


とりあえずエモいから使っていけ

 F | Fm 

F#dim


トニックの代わりに使える奴らしい、D7のルート音をなくしたやつとも見れるのか?

 F#dim | G

Gm7


前使ったことあるやつだと

 C | Gm7 | FM7 | FmM7 | Em 

あとは先ほど同様C7と一緒に使うのがよくやる

A7


王道進行のVImをVI(7)に

 F | G | Em | A

Dmにつなげるときに使ったり。 EmEm7-5とかにしてみても面白いかも?

短調の曲でも最後Imで終わらずIで終わるのもあり
ピカルディ終止っていうそうです

 F | Em7 | A

B♭7

Eの裏コードになる和音

 F | G | B♭7 | Am 

ナインスにするのはとてもあり!(スケール内の音を通る)

 Em | Am | B♭9 | G7

その他

クリシェを使ったりするとノンダイアトニックコードがでてきたりする


僕の大好きな下降クリシェ。エモいです。 Bメロとか曲の最後のほうで使いたくなる

 Am | Caug | C | F#m7-5

さらにFM7につなげるのもあり

たまにAメロ前とかにいれたくなる上がっていくやつ

 C | Fm | F#dim | C7

他にも昔使ったことあるやつ

 Am | F | F#dim | C5

さいごに

今日紹介したのはあくまで僕がよく使うやつ(and使ったことある程度のやつ)を紹介した程度です。
むしろ使ったことないやつは紹介してない(今度はC#を使ってみよう)
他にもいいのがたくさんあると思いますし、自分のお気に入りを見つけていきましょう!

自分の好きな曲からパクっていけ!!

PS.遅れてすいませんでした。