補足資料
Siv3D くん LINE スタンプ
ライフゲームの世界
チュートリアル 1 章
Siv3D ドキュメントの GitHub リポジトリ
LT 資料
おすすめ C++ 本
mac 15 パズル
code:cpp
# include <Siv3D.hpp>
bool Swappable(int32 a, int32 b)
{
return (a / 4 == b / 4 && Abs(a - b) == 1) || (a % 4 == b % 4 && Abs(a - b) == 4);
}
void Main()
{
Scene::SetBackground(ColorF(0.8, 0.9, 1.0));
constexpr int32 cellSize = 100;
constexpr Point offset(60, 40);
// ダイアログから画像を選択
const Image image(U"example/bay.jpg"); // ここを変える!
// 正方形に切り抜く
const Texture texture(image.squareClipped(), TextureDesc::Mipped);
Optional<int32> grabbed;
// ランダムな操作でパズルをシャッフル
Array<int32> pieces = Range(0, 15);
{
int32 pos15 = 15;
for (int32 i = 0; i < 1000; ++i)
{
const int32 to = pos15 + Sample({ -4, -1, 1, 4 });
if (InRange(to, 0, 15) && Swappable(pos15, to))
{
pos15 = to;
}
}
}
while (System::Update())
{
Rect(offset, 4 * cellSize)
.drawShadow(Vec2(0, 2), 12, 8)
.draw(ColorF(0.25))
.drawFrame(0, 8, ColorF(0.3, 0.5, 0.7));
if (!MouseL.pressed())
{
grabbed = none;
}
for (auto i : step(16))
{
const int32 pieceID = piecesi; const Rect rect = Rect(i % 4 * cellSize, i / 4 * cellSize, cellSize).movedBy(offset);
if (pieceID == 15)
{
if (grabbed && rect.mouseOver() && Swappable(i, grabbed.value()))
{
grabbed = i;
}
continue;
}
if (rect.leftClicked())
{
grabbed = i;
}
rect(texture.uv(pieceID % 4 * 0.25, pieceID / 4 * 0.25, 0.25, 0.25))
.draw()
.drawFrame(1, 0, ColorF(1.0, 0.75));
if (grabbed == i)
{
rect.draw(ColorF(1.0, 0.5, 0.0, 0.3));
}
if (rect.mouseOver())
{
Cursor::RequestStyle(CursorStyle::Hand);
}
}
texture.resized(180)
.draw(offset.x + cellSize * 4 + 40, offset.y)
.drawFrame(0, 4, ColorF(0.3, 0.5, 0.7));
}
}
mac 音楽プレイヤー
code:cpp
# include <Siv3D.hpp>
void Main()
{
// 音楽
Audio audio;
// FFT の結果
FFTResult fft;
// 再生位置の変更の有無
bool hasChanged = false;
while (System::Update())
{
// 再生・演奏時間
const String time = FormatTime(SecondsF(audio.posSec()), U"M:ss")
+ U'/' + FormatTime(SecondsF(audio.lengthSec()), U"M:ss");
// プログレスバーの進み具合
double progress = static_cast<double>(audio.posSample()) / audio.samples();
if (audio.isPlaying())
{
// FFT 解析
FFT::Analyze(fft, audio);
// 結果を可視化
for (auto i : step(800))
{
const double size = Pow(fft.bufferi, 0.6f) * 1000; RectF(Arg::bottomLeft(i, 480), 1, size).draw(HSV(240 - i));
}
// 周波数表示
Rect(Cursor::Pos().x, 0, 1, Scene::Height()).draw();
ClearPrint();
Print << U"{} Hz"_fmt(Cursor::Pos().x * fft.resolution);
}
// 再生
if (SimpleGUI::Button(U"Play", Vec2(40, 500), 120, audio && !audio.isPlaying()))
{
audio.play(0.2s);
}
// 一時停止
if (SimpleGUI::Button(U"Pause", Vec2(170, 500), 120, audio.isPlaying()))
{
audio.pause(0.2s);
}
// フォルダから音楽ファイルを開く
if (SimpleGUI::Button(U"Open", Vec2(300, 500), 120))
{
audio.stop(0.5s);
audio = Audio(U"example/test.mp3"); // ここを変える (mac) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
audio.play();
}
// スライダー
if (SimpleGUI::Slider(time, progress, Vec2(40, 540), 130, 590, !audio.isEmpty()))
{
audio.pause(0.1s);
// 再生位置を変更
audio.setPosSample(static_cast<int64>(audio.samples() * progress));
// ノイズを避けるため、スライダーから手を離すまで再生は再開しない
hasChanged = true;
}
else if (hasChanged && MouseL.up())
{
// 再生を再開
audio.play(0.1s);
hasChanged = false;
}
}
}