2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

この記事について

  • この記事は、プログラミング初心者である筆者がSiv3Dのチュートリアルを進めている時にふと気づいたことについて書いた記事です
    • チュートリアルで紹介されていたある実装について、ちょっとした別解を思いついた!と言う感じの記事です
    • ついでに、Siv3Dというツールの紹介もしてみようという記事でもあります

Siv3Dとは?

  • 公式サイト
    • 曰く、「創造のための C++ フレームワーク」
    • オープンソース
  • C++を使ってゲーム開発ができるツールで、オープンソースのゲームエンジンのようなものだと筆者は認識しています
    • ゲーム以外の用途にも使えそうです

なぜSiv3Dを触り始めたのか?

  • 筆者がいずれ(趣味で)ゲーム開発をしたいなぁとぼんやり考えているからです
  • UnityやUnreal Engineで作ることも考えましたが、以下の点からSiv3Dに行きつきました
    • UnityやUnreal Engineは大企業のゲーム開発にも用いられるツールであるため、良くも悪くも高機能過ぎる。初心者がちょっと触ってみるには少し重い
    • そんな中何か良いゲームエンジンがないかと探しあぐねていた時に、たまたま見つけたのがSiv3D。環境設定さえ済ませてしまえば、ちょこっとC++のコードを書くだけですぐにゲーム(未満のプログラム)を動かせるという点が、プログラミング初心者には魅力的でした
  • 上記の理由に加えて、ゲーム開発のついでにC++の勉強をしたいという意図もありました。なので、開発言語がC++であることは必須であり、その点でもSiv3Dは自分が求めている条件に合致するものでした

Siv3Dのチュートリアル

  • Siv3Dは公式のチュートリアルが充実しています
    • プログラミング初心者でもC++の基礎的なところさえ抑えていればそこまで読み進めるのに苦労はしない
    • 読みながらゲームプログラミングに特有の考え方を学ぶことができて、読み物としても面白い
    • ライブラリ等の説明用に置いてあるサンプルコードも豊富で、実際にコードを動かしながら挙動を理解することができる(楽しい)
  • ※筆者はこの公式のチュートリアルを読み進めている途中です。今はチュートリアル2がそろそろ終わるところです
    • チュートリアルは全部で4つあります。つまり筆者の進度はざっくり全体の半分くらい

本題

  • 今回の記事では、Siv3Dのチュートリアルで触れられているお題について、ちょっとした別解を思いついたのでご紹介させて頂きます

市松模様を描くというお題

  • 今回紹介するお題は、チュートリアル1の「9.模様を描く」の中にある、9.3少し複雑にするという項目です
  • お題は至ってシンプル。以下のように、水玉模様に少し複雑なパターンを入れてみようというものです。要は市松模様(鬼滅の炭治郎のアレ)に似たパターンを実装しろという話です

3.png
(↑公式チュートリアルから引用したスクショ)

  • 1つ前の項目 「9.2二重ループで円を並べる」にて円をタイル状に並べる方法は既に学んでいたので、コードを少しいじれば「市松模様」を実装できるのでは……?と思い至りました
  • そのため、あえて実装例のコードを見ずに自力で実装してみました

思考過程

実装に至るまでの思考過程をメモしていたので、以下にそのメモをほぼそのまま貼り付けます。

  • i, j の偶奇に応じて円の大きさを変えれば良い
  • お手本通りにするなら……?

二重ループ
x座標:i
y座標:j

i,j 奇数 → 小円
i偶数、j奇数→大円
j偶数、i奇数→大円
i,j偶数→小円

論理記号で言うと

0 0 0
0 1 1
1 0 1
1 1 0

0が奇数、小円

このパターンは論理記号で言うとXORなのでは?
→ググったら、C++では ^記号でXORを表現できるらしい

# include <Siv3D.hpp>

void Main()
{
	Scene::SetBackground(Palette::White);

	while (System::Update())
	{
		for (int j=0; j < 5; j++){			
			for (int32 i = 0; i < 5; i++){
				if (i % 2 == 0 ^ j % 2 ==0) {
					Circle{100*i, 100*j, 30}.draw(Palette::Skyblue);
				} else {
					Circle{100*i, 100*j, 5}.draw(Palette::Skyblue);
				}
			}
		}
	}
}
  • ↑で実装できた!嬉しい!
  • 市松模様というパターンと、排他的論理和が紐つくのは何か面白い

余談

  • Siv3D公式チュートリアルの答えを見たら、排他的論理和ではなくi+jの和の偶奇で分岐させていた
    • どちらの実装でも問題ない気はするが、排他的論理和で実装する方がロジックをより直接的に表現できているような気がする……?
    • デザインパターンとかも勉強して、どちらの実装の方が望ましいか判断できるようになりたいな(この程度の規模のコードならマジでどちらでもいい気はするが)

おわりに

以上です。
結局のところこの記事で言いたかったのは、「市松模様というパターンと、排他的論理和が紐つくのは何か面白い」というだけのことでした。

Siv3Dについて

Siv3Dはゲーム開発抜きにしても面白いツール(筆者主観)ですので、C++に触れたことのある方は是非Siv3Dも触ってみてはいかがでしょうか。公式チュートリアルのサンプルコードを適当に動かしたり弄ったりするだけでも結構面白いですよ。

2
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?