勉強会 2 コマ目(基本)¶
1. Main() 関数とメインループ¶
Siv3D の C++ プロジェクトでは、<Siv3D.hpp>
ヘッダをインクルードするだけで、Siv3D のさまざまな関数やクラスを使ったプログラムを書けます。<iostream>
や <vector>
などの C++ 標準ライブラリのインクルードは不要です。
Siv3D のプログラムでは、int main()
ではなく void Main()
という関数をメイン関数として使います。
while (System::Update()) { }
というループがメインループです。メインループは、プログラムを実行しているモニタ 🖥️ の表示周期(リフレッシュレート)に合わせて繰り返されます。一般に毎秒 60 回や 120 回です。
# include <Siv3D.hpp>
void Main()
{
while (System::Update()) // System::Update() が false を返すまで繰り返す
{
}
}
System::Update()
関数は普段は true
を返すため、半永久的にメインループが続きますが、ウィンドウを閉じたり Esc を押したりするなど特定の操作をすると、それ以降は false
を返すことでメインループを終了させ、そのまま Main()
関数の終端まで到達するとプログラムが終了します。
2. 文字列や数値を簡易表示する¶
Print
を使って画面に文字列を簡易表示します。Siv3D のプログラムで文字列を扱うときは、ダブルクォーテーションの前に U
を付けます。これは、文字列を Unicode (UTF-32) 文字列として扱うための記法です。
# include <Siv3D.hpp>
void Main()
{
Print << U"C++"; // U を付ける
Print << U"Hello, " << U"Siv3D";
Print << 123;
Print << 4.567;
while (System::Update())
{
}
}
3. 簡易表示をたくさん行う¶
Print
したものは画面に残り続けます。画面に収まらなくなったものは、古いものから順に消えていきます。
# include <Siv3D.hpp>
void Main()
{
int32 count = 0;
while (System::Update())
{
Print << count;
++count;
}
}
このコードに登場する int32
は int
と同じ意味で、整数型を表します。ほかにも int64
や uint32
などの型があります。int
や long long
などの C++ 標準の型名の代わりに、Siv3D では明示的にサイズを表現した型名を使います。これにより、プラットフォーム間での移植性が高まり、一貫性のある読みやすいコードになります。次の表の ★ が付いた型は特に重要です。
型名 | 説明 |
---|---|
bool | ★ ブーリアン型(false または true ) |
int8 | 符号付き 8-bit 整数型(-128 ~ 127) |
uint8 | 符号無し 8-bit 整数型(0 ~ 255) |
int16 | 符号付き 16-bit 整数型(-32,768 ~ 32,767) |
uint16 | 符号無し 16-bit 整数型(0 ~ 65,535) |
int32 | ★ 符号付き 32-bit 整数型(-2,147,483,648 ~ 2,147,483,647) |
uint32 | 符号無し 32-bit 整数型(0 ~ 4,294,967,295) |
int64 | 符号付き 64-bit 整数型(-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807) |
uint64 | 符号無し 64-bit 整数型(0 ~ 18,446,744,073,709,551,615) |
float | 単精度浮動小数点数型 |
double | ★ 倍精度浮動小数点数型 |
size_t | ★ オブジェクトのサイズを表現する符号無し 64-bit 整数型(0 ~ 18,446,744,073,709,551,615) |
char32 | ★ UTF-32 の 1 要素(char32_t の別名) |
String | ★ 文字列クラス。要素は char32 |
FilePath | ★ ファイルパス文字列(String の別名) |
4. 簡易表示を消去する¶
ClearPrint()
は、画面に残っている Print
による出力をすべて消去します。
メインループの先頭で常に ClearPrint()
することで、現在のフレーム内で Print
した内容のみを画面に表示することができます。
# include <Siv3D.hpp>
void Main()
{
int32 count = 0;
while (System::Update())
{
// 古い出力(以前のフレームの出力)を消去する
ClearPrint();
Print << count;
++count;
}
}
5. 整数型を使う¶
整数を表現するときは、int32
が最も一般的です。
# include <Siv3D.hpp>
void Main()
{
int32 score = 100;
Print << score;
score = 200; // 代入
Print << score;
score += 50; // 加算
Print << score;
while (System::Update())
{
}
}
6. 浮動小数点数型を使う¶
浮動小数点数を表現するときは、double
が最も一般的です。
# include <Siv3D.hpp>
void Main()
{
double x = 1.23;
Print << x;
x = 4.56; // 代入
Print << x;
x += 7.89; // 加算
Print << x;
while (System::Update())
{
}
}
7. ブーリアン型を使う¶
ブーリアン型は bool
です。true
または false
の値を持ちます。
# include <Siv3D.hpp>
void Main()
{
bool a = true;
bool b = false;
Print << a;
Print << b;
if (a)
{
Print << U"a は true です";
}
if (not b) // not は ! と同じ意味です
{
Print << U"b は false です";
}
while (System::Update())
{
}
}
8. 文字列型を使う¶
文字列型は String
です。コード中に直接書く文字列リテラルは U
を付けてダブルクォーテーションで囲み、UTF-32 文字列とします。
# include <Siv3D.hpp>
void Main()
{
String s = U"Hello, Siv3D";
Print << s; // Hello, Siv3D
s += U"!";
Print << s; // Hello, Siv3D!
// Siv3D を C++ に置き換える
s.replace(U"Siv3D", U"C++");
Print << s; // Hello, C++!
while (System::Update())
{
}
}
9. 配列などのデータ構造¶
配列などのデータ構造は、Siv3D が提供するクラスを使うと便利です。次の表の ★ が付いたクラスは特に重要です。
型名 | 説明 |
---|---|
Array<Type, Allocator> | ★ 動的配列(C++ 標準ライブラリの std::vector の Siv3D 版) |
Grid<Type, Allocator> | 動的な二次元配列 |
HashSet<Type, Hash, Eq, Alloc> | ハッシュテーブルによる Set(C++ 標準ライブラリの std::unordered_set の Siv3D 版) |
HashTable<Key, Value, Hash, Eq, Alloc> | ハッシュテーブルによる Map(C++ 標準ライブラリの std::unordered_map の Siv3D 版え) |
Optional<Type> | ★ 無効値を表現できる型(C++ 標準ライブラリの std::optional の Siv3D 版) |
std::array<Type, size_t> | 固定長配列 |