Siv3Dと2年。

  • 5
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

Siv3D Advent Calendar 2015
8日目の記事です。

自己紹介

Rinifisu(リニフィス)です。
言いにくいので「リニさん」「リンさん」などとよく呼ばれています(笑)

現在はコンピュータ関係を扱う専門学校のゲーム学科で、勉強や作品制作を行いながら、ゲームプログラマーを目指しています。

趣味で作曲もしていますが、現在はプログラミングに特化しているため、抑え気味です。
Siv3D だけではなく、自分がどのようにプログラミングの世界に入っていったかも含め、書いていきます。

高校時代(前半)

初めはBasic

プログラムに触れることとなったのが、Basic言語の授業でした。
入学時に手に入れた「ポケットコンピュータ」、通称ポケコンにBasic環境が付いていて、それに異常なほどハマってしまいました。
「カジュアルRPG」「イライラ棒」「早押しゲーム」「ミュージックシーケンサー」・・・と色々と作っては同じクラスのメンバーにデータを配布して、遊んでもらっていました。

Basicだけでは物足りない!

ポケコンBasicでプログラミングをしていた人には知っているとは思いますが、Basicはインタプリタ言語であり、ポケコンの処理速度も悪いため、非常に実行速度が遅く、画面全体にドット絵を表示するだけでも数十秒かかってしまっていました。

市販されているゲームのような本格的なゲームを作るために、まず触れてみたのがJava言語です。
独学で半年かけ、インターネットにあるソースコードを真似て覚えていました。
しかし、基礎を一通り終わらせた時に感じたのが「・・・で?結局ゲームはどうやって作るの?」でした。
Java.png

BasicではあったPOINTLINE(ピクセルを打ち込む命令)等がそもそも無いので、文字列でそれっぽいゲームは作ってはいましたが、「これじゃない」と何度も言っていた記憶があります。ここからどんどんと自信が落ちていきました。

しかし、モチベーションを取り戻す、救いの手が1つだけありました。
C#言語でWindowsツールが作れることを知り、勉強をしながらいくつか作品を生み出すことができました。

桁が細かなストップウォッチ&タイマー「コマトケイ」
http://rinifisu.blog.jp/archives/14277405.html
コマトケイ.png

まともに使う事の出来ないメモ帳 「イライラメモ帳」
http://rinifisu.blog.jp/archives/1402078.html
イライラメモ帳.png

高校時代(後半)

ゲームライブラリ

独学をしていたころやそれ以前に、現在通っている専門学校のオープンキャンパスに参加を行っていました。
その時に印象に残ったワードが1つあり、ゲームライブラリという単語です。
早速調べてみると、出てきたのが Siv・・・ではなく「とある別のゲームライブラリ」でした。

サンプルや他の作品を見ると、ゲーム作品!!!と明らかに言えるものがたくさんあり、感動したことを覚えています。
早速勉強できるサイトがあったので、学んで作ってはいましたが・・・

挫 折 し ま し た。

様々なアセットデータを int 型で管理するのはわかりましたが、それが逆に混乱を招いてしまいました。
がむしゃらに作っていたものの、最終的に致命的な不具合を大量に発生させてしまい、バックアップも忘れて、途中で放棄してしまいました。

Siv3D

「ゲームライブラリ」と言う単語は挫折したゲームライブラリのためだけにあると、勝手に決めつけていましたが、そのタイミングで偶然Siv3Dを見つけました。

地形が自動生成されるデモ動画を見つけ、早速環境を整えて実行してみました。

驚 き ま し た 。

ほんの数行で図形や文字が表示できてしまいますから。
必要な更新処理はSystem::Updateに全て詰め込まれてるわけですから、全く散らかりませんし、名前も単純で「あっ、これはシステムをアップデートするんだな」とすぐにわかりましたから。

早速「Play Siv3D!」の基本から順番にコードを書いていきました。
名前が非常にわかりやすく、すぐに覚えることができました。

C++言語の基礎すら危なかった自分でも、スムーズに作業を進めることができました。

そして完成した初のゲーム作品が「Laser Maze」です。
Laser Maze.png

Laser Maze 2.png

普通のゲーム制作では簡単にできないような「Twitter投稿」「暗号化」「アセットデータの管理」「最新バージョンを取得」などが実装できました。

関数やクラスの概念を知らなかったので、Main関数に1万行前後書いてしまっていますし、ポインタや標準テンプレートライブラリも当時知らなかったので一切使っていませんが、それでもゲームとしてきちんと動作しています。

「Laser Maze」のコードの一部

Main.cpp
# include "GameData.h"

void Main()
{
    Window::Resize((int)WS.x, (int)WS.y);
    Graphics::SetBackground(Palette::Gray);

    TextureAsset::Register(L"Cursor", L"engine/data/Cursor.png");
    Cursor::SetStyle(CursorStyle::Custom(TextureAsset(L"Cursor")));

    FontAsset::Register(L"30", 30), FontAsset::Register(L"25", 25), FontAsset::Register(L"20", 20), FontAsset::Register(L"17", 17),
        FontAsset::Register(L"50B", 50, Typeface::Black), FontAsset::Register(L"25B", 25, Typeface::Black), FontAsset::Register(L"20B", 20, Typeface::Black), FontAsset::Register(L"15B", 15, Typeface::Black), FontAsset::Register(L"12B", 12, Typeface::Black);

    SoundAsset::Register(L"Enter", L"engine/data/Enter.ogg");

    //セーブデータ読み込み
    String SavD = E_ANG(L"セーブデータ", L"セーブデータ.lmsf");//暗号化解除
    if (SavD == L"[[Error]]")
    {
        String SVD[]/*新規作成時の項目で使用するだけの物*/ = { L"", L"9", L"0", L"0", L"0", L"0", L"0", L"0", L"0", L"0", L"0", L"0", L"0", L"0", L"0.75", L"イエロー", L"オリジナル", L"確認する", L"表示する", L"false", L"", L"", L"", L"", L"", L"", L"" };

        MasterVoice::SetVolume(0.75);
        SoundAsset::Register(L"StartS", L"engine/data/MainGame/Sinka.ogg");
        SoundAsset(L"StartS").setLoopBySec(true, 28.473, 128.034);
        SoundAsset(L"StartS").play();

        while (System::Update())
        {
            SVD[0] = E_TextBox(SVD[0], L"ユーザー名を入力", 12, false, true);
            System::Sleep(200);
            if (SVD[0].isEmpty)continue;
            if (SVD[0] == L"[[[[Null]]]]")return;
            if (SVD[0] == L"")SVD[0] = L"名無しさん";
            bool Brflag = false;
            while (System::Update())
            {
                Circle Ti(CS.x * 1.5, CS.y * 1.5, WS.x / 10);
                Circle Rt(CS.x / 2, CS.y * 1.5, WS.x / 10);
                Ti.draw(Ti.mouseOver ? Palette::Yellow : Palette::Lightgrey);
                Rt.draw(Rt.mouseOver ? Palette::Yellow : Palette::Lightgrey);
                FontAsset(L"15B").drawCenter(L"いいえ", { CS.x * 1.5, CS.y * 1.5 }, Palette::Black);
                FontAsset(L"15B").drawCenter(L"はい", { CS.x / 2, CS.y * 1.5 }, Palette::Black);
                FontAsset(L"30").drawCenter(L"ユーザー名は<" + SVD[0] + L">", { CS.x, CS.y / 8 }, Palette::White);
                FontAsset(L"15B").drawCenter(L"\n\n\n\nスコア記録や設定項目などで使用されます。\nユーザー名は設定でいつでも変更可能ですが、\nスコアなどの記録はその時のユーザー名が適応されます。\nこの名前でよろしいですか?", { CS.x, CS.y / 4 }, Palette::White);

/* この後1万行ほど続いている為、省略 */

Laser Maze Ver_1.1.3.png

自己流コーディングルールでかなり汚いですね・・・
今ソースコードを見直してみましたが、散らかりすぎていてよくわかりませんでした。何してたんだ過去の自分・・・

最新バージョンの確認を行う

公開しました!・・・と作品を出した後に不具合報告や要望が結構出てきますよね。
その問題点を修正した最新バージョンを投稿しても、誰も気づかずにそのままのバージョンで・・・なんてことがあると思います。
そこで行うのが、Siv3Dのファイルダウンロード機能を使って、最新バージョンを確認・通知するというものです。

僕が行っている最新バージョンの確認取得の流れを載せます。

バージョンチェックに必要なものは
1.バージョンが書かれてあるテキストファイル(txt)
2.Google Driveやその他クラウドストレージ
です。無料で簡単にできるのでそこまで苦労はしないと思います。

今回はGoogle Driveで行います。

まずはバージョンが書かれてあるテキストファイルをアップロードします。
アップロード前.png

アップロード完了.png

アップロードしたテキストの中身はこのようになっています。
ファイルの中身.png

このファイルを共有設定で、ダウンロードできる状態を作ります。
1.ファイルを右クリック → 共有
2.共有可能なリンクを取得
3.リンクにアクセス → プレビュー画面に移動
4.プレビュー画面のURLをコピー
5.こちらの記事を参考にし、直接ダウンロードリンクを取得

直接ダウンロードリンクを入手できたら、以下のコードを入力して実行してみます。

Main.cpp
# include <Siv3D.hpp>

//2016年1月14日リリース予定の新バージョンで以下のソースコードは動作しません。
//Siv3D June 2015 v2 バージョン用
void Main()
{
    //ダウンロード先のURL
    const FilePath url = L"ここに直接ダウンロードリンクを入力";

    //保存先のパス
    const FilePath path = L"Version.txt";

    //接続確認とダウンロード
    if (Internet::IsConnected() && Internet::Download(url, path))
    {
        Println(L"最新のバージョンは" + TextReader(path).readContents() + L"です。");
    }
    else
    {
        Println(L"最新のバージョンの取得に失敗");
    }

    //キー入力待ち
    WaitKey();
}

//2016年1月14日リリース予定の新バージョンでは以下のソースコードを使用します。
//Siv3D January 2016 バージョンは以下のソースコード
void Main()
{
    //ダウンロード先のURL
    const FilePath url = L"ここに直接ダウンロードリンクを入力";

    //保存先のパス
    const FilePath path = L"Version.txt";

    //Http関連を扱うクラス
    HTTPClient client;

    //接続確認とダウンロード
    if (Internet::IsConnected() && client.download(url, path))
    {
        Println(L"最新のバージョンは" + TextReader(path).readAll() + L"です。");
    }
    else
    {
        Println(L"最新のバージョンの取得に失敗");
    }

    //キー入力待ち
    WaitKey();
}

先ほどのテキストファイルの直接ダウンロードリンクが手に入りました。
http://drive.google.com/uc?export=view&id=0B92WF_WWZ9iOSWV4Q093VGh4TXc
上手くいかない場合やすぐに確認したい場合はこのURLを使ってみてください。

実行すると、このようになりました。
20151203-094925-143.png
あとはこのStringを比較し、最新バージョンかを確認する構造を作れば完成です。
最新バージョンになるたびに、テキストを書き換えるだけで、「最新バージョンがあります!」と通知を送ることができます。

今回のアップロードと共有は、ブラウザで行いましたが、Google Driveのデスクトップ版などを利用すると、更に効率よくバージョン更新を行う事が可能です。

インターネットを使うので、許可なくダウンロードを行う事を避けるオプションを付けると良いですね。

・・・もっと簡単な共有方法あったら教えてください。

1年目

専門学校で基礎を学ぶ

授業で正しいC++を教えてもらえるという事でわくわくしていました。
printfscanfなどを習っているときに「FontPrintln(Siv3D の print)を使いたい・・・」と思っていました。

Siv3D でゲームを作っていたおかげで、すぐに覚えることができました。
一時期ポインタやiteratorで躓きましたが、何とか乗り越えることができました。

基礎勉強を一通り終えた後、学校専用のゲームライブラリでゲームを作ることになったのですが、Siv3Dに慣れていたので使いnk(蹴

ゲーム制作

学校専用のゲームライブラリで2つの作品を制作後に、Siv3Dでの制作許可が出ました。
C++の基礎も覚えたのでどんどん制作が進みます。

そして3か月ほどで完成した作品が「Lead!」です。
http://rinifisu.blog.jp/archives/25012544.html

紹介動画:http://youtu.be/lGbwpiW0ytk
Lead!.png

「Laser Maze」の時よりエフェクトや細かな動きが増えていると思います。
今回の制作ではグラフィック担当がいたので、制作に専念できました。

その後、エフェクト機能を使い、表現にこだわったカジュアルゲーム「EarlyPush」も完成し、公開しました。
便利な機能に恵まれているおかげで、制作に1ヵ月もかけていないです。
EarlyPush.png

2年目

ゲームプログラマーを目指して

この頃になると、プログラムの基礎はある程度身についたので、コーディングルールやグループ制作に特化し始めました。
更にSiv3Dを極めたいところでしたが、どのライブラリ環境でも耐えれるようになるため、他のライブラリを使用してひたすら3Dゲーム制作を行っていました。
時々研修などで制作を行う際はSiv3Dを使ってました。それが次のグループ制作ですね。

グループ制作

グループ制作では、Siv3Dを知らない方々にライブラリの説明をする必要がありますが、「Play Siv3D!」「Siv3D ユーザー助け合い所」「Slack」が充実している為、特に難しくは無くすぐにグループ制作に取り掛かることができました。

事情があってギャラリーや表には出していませんでしたが、Siv3Dで2作品ほど作っていました。

下剋上
下克上.png

下克上2.png

下剋上3.png

春(内定)
春 (1).png

春 (2).png

春 (3).png

現在

コラボレーション!!!

現在は、就職活動準備で大阪と東京を行っては帰ってを繰り返しています。
今月から本格的に開始するので、かなり忙しくなってきましたが、それでも空いている時間は必ずあります。(この記事を書いている時とか)
その時に「EarlyPush」のようなカジュアルゲームを量産しようと思ったのですが、デザインセンスの無い自分が無理をしてUIやオブジェクトを作っているので、時間が無駄ですし疲れますし楽しくないんですよね。フリー素材でも表現幅に制限がかかりますしブツブツ・・・
ここでマスコットキャラクターである「Siv3Dくん」の出番ですよね~

しかし、Siv3Dや様々な交流を今まで行っていたおかげで、大好きなイラストレーターの方とコラボすることができました!
サウンドクリエイターも加え、3人で制作を行っている作品が「にゃんパー」です。
にゃんパー.jpg
僕と PAROさん ししょさん の3人でゆるりと進めています!

現在は自作したタスクシステムを利用して、ゲーム企業に向けて制作強化しています。
AI(人工知能)の勉強始めました!頑張ります!

今回張り切って色々な機能紹介を行おうと思いましたが、全部「Play Siv3D!」に載っているんですよね!!!
チュートリアルもSiv3D自体もどんどん進化しているので、もうあれですよ。究極ですよ。

後半かなり雑になりましたが、以上です!ありがとうございました!


明日は @gorei50 さんです!よろしくお願いします!

この投稿は Siv3D Advent Calendar 20158日目の記事です。