-
Notifications
You must be signed in to change notification settings - Fork 1
SIGPX2
Reputeless edited this page Aug 6, 2016
·
16 revisions
2016 年 8 月 7 日 SIGPX2
#include <Siv3D.hpp>
void Main()
{
const Image image = Dialog::OpenImage();
if (!image)
{
return;
}
const int32 noiseCount = image.num_pixels / 4000;
const Array<uint8> original = image.encodeJPEG(90).asArray();
DynamicTexture texture(image);
Window::Resize(texture.size);
while (System::Update())
{
if (Input::MouseL.clicked)
{
Array<uint8> memory(original);
for (int32 i = 0; i < noiseCount; ++i)
{
memory[Random(630u, static_cast<uint32>(memory.size() - 1))] = static_cast<uint8>(Random(255));
}
texture.fill(Image(ByteArray(std::move(memory))));
}
texture.draw();
}
}
12 種類の方法で操作するブロックくずし
# include <Siv3D.hpp>
# include <Siv3DAddon/LeapMotion.hpp>
enum class InputType
{
Mouse, Keyboard, Leap, XInput, Clap, Acceleration, Arduino, Kinect, Pentab, Touch, AR, FFT
};
Array<Rect> GetWalls(InputType type, double& rotation, Recorder& r, Webcam& w)
{
const int W = Window::Width(), H = Window::Height();
static Serial arduino(7);
static int x = 180;
Array<Rect> walls;
rotation *= (type == InputType::AR);
if (type == InputType::Mouse)
{
walls.push_back(Rect(200, 20).setCenter(Mouse::Pos().x, H - 100));
}
else if (type == InputType::Keyboard)
{
x += -24 * Input::KeyLeft.pressed + 24 * Input::KeyRight.pressed;
walls.push_back(Rect(200, 20).setCenter(x, H - 100));
}
else if (type == InputType::Leap)
{
for (const auto& pointable : LeapMotion::Hands())
walls.emplace_back(int(W / 2 + pointable.pos.x * 8), H - 100, 200, 20);
}
else if (type == InputType::XInput)
{
x += (XInput(0).leftThumbX / 1500) * (abs(XInput(0).leftThumbX) > 7000);
walls.push_back(Rect(200, 20).setCenter(x, H - 100));
}
else if (type == InputType::Clap)
{
if (x == 10 && r.getMaxAmplitude() >= 0.2)
x = W + 200;
walls.push_back(Rect(x = Max(10, x - 40), 20).setCenter(W / 2, H - 100));
}
else if (type == InputType::Acceleration)
{
walls.push_back(Rect(300, 20).setCenter(W / 2 + int(KinectV1::GetAcceleration().x * (W + 200)), H - 100));
}
else if (type == InputType::Arduino)
{
uint8 data;
if (arduino.available() && arduino.read(data))
x = data / 256.0 * W;
walls.emplace_back(x, H - 100, 200, 20);
}
else if (type == InputType::Kinect)
{
std::array<Optional<KinectV1Body>, 2> bodies;
if (KinectV1::GetBodyFrame(bodies))
bodies[0].then([&](KinectV1Body b) { x = (b.joints[V1JointType::Head].depthSpacePos.x - 320) * 6; });
walls.push_back(Rect(400, 20).setCenter(x, H - 100));
}
else if (type == InputType::Pentab)
{
walls.push_back(Rect(200 + Pentablet::Pressure() * 300, 20).setCenter(Mouse::Pos().x, H - 100));
rotation = Radians(Pentablet::DegreeY());
}
else if (type == InputType::Touch)
{
for (const auto& touch : Input::GetTouches())
walls.emplace_back(Rect(200, 40).setCenter(touch.pos));
}
else if (type == InputType::AR)
{
Array<ARMarker> markers;
if (w.getMarkers(markers) && !markers.empty())
{
x = static_cast<int>((1.0 - markers[0].screenPos.x / 640.0) *W*1.2 - W*0.2);
rotation = -markers[0].rotation2D;
}
walls.emplace_back(x, H - 100, 250, 30);
}
else if (type == InputType::FFT)
{
const auto fft = FFT::Analyze(r);
const auto it = std::max_element(&fft.buffer[100], &fft.buffer[360]);
if (*it > 0.004)
x = std::distance(&fft.buffer[100], it) * 6;
walls.push_back(Rect(400, 20).setCenter(x, H - 100));
}
x = Clamp(x, 0, W);
return walls;
}
Array<Rect> InitBlocks()
{
Array<Rect> rects;
const Size size(80, 40);
const int w = Window::Width() / size.x;
for (int i : step(5 * w))
rects.emplace_back(i % w * size.x, 60 + i / w * size.y, size);
return rects;
}
void Main()
{
Window::Resize(1600, 1000);
Graphics::SetBackground(Palette::White);
LeapMotion::RegisterAddon();
Recorder recorder(5s, RecordingFormat::S44100, true);
recorder.start();
Webcam webcam(0);
webcam.start();
webcam.startAR();
KinectV1::Start(KinectV1DataType::DefaultSeated);
const Sound sound{ Wave(0.1s, [](double t) {return Fraction(t * 880)*0.5 - 0.25; }) };
const double speed = 12.0;
double rotation = 0.0, tone = 0;
Circle ball(700, 400, 16);
Vec2 ballVelocity(2.0, -speed);
Array<Vec3> effects;
Array<Rect> blocks = InitBlocks();
GUI gui(GUIStyle::Default);
gui.add(L"device", GUIRadioButton::Create({ L"マウス", L"キーボード", L"LeapMotion", L"Xbox 360",
L"手拍子", L"加速度センサ", L"Arduino", L"Kinect", L"ペンタブ", L"マルチタッチ", L"AR マーカー", L"口笛" }, 0u));
while (System::Update())
{
if (Input::KeyR.clicked)
blocks = InitBlocks();
for (auto it = blocks.begin(); it != blocks.end(); ++it)
{
if (it->intersects(ball))
{
if (it->bottom.intersects(ball) || it->top.intersects(ball))
ballVelocity.y *= -1;
else if (it->left.intersects(ball) || it->right.intersects(ball))
ballVelocity.x *= -1;
effects.emplace_back(Vec2(it->center), 0.0);
blocks.erase(it);
sound.playMulti(1, 1, Exp2(tone++ / 12.0));
break;
}
}
if ((ball.center.y<0 && ballVelocity.y<0) || (ball.y > Window::Height()))
ballVelocity.y *= -1;
if ((ball.center.x<0 && ballVelocity.x<0) || (Window::Width()<ball.center.x && ballVelocity.x>0))
ballVelocity.x *= -1;
for (auto& effect : effects)
{
const double value = Exp(-(effect.z += 0.01) * 5.0);
Circle(effect.xy(), 400.0 * (1.0 - value)).drawFrame(value * 50, 0.0, ColorF(1.0, 0.8, 0.8));
}
for (const auto& block : blocks)
block.draw(HSV((block.y - 40) * 1.2, 0.8, 1.0).toColorF(0.9));
for (const auto& w : GetWalls(InputType(gui.radioButton(L"device").checkedItem.value()), rotation, recorder, webcam))
{
const auto wall = RoundRect(Rect(-w.size / 2, w.size), 6).asPolygon().rotated(rotation).moveBy(w.center);
wall.draw(Palette::Skyblue);
if (ballVelocity.y>0 && wall.intersects(ball))
{
ballVelocity = Vec2(Clamp((ball.center.x - w.center.x) / 8, -10., 10.)
+ Random(-2., 2.), -ballVelocity.y).normalized()*speed;
sound.playMulti(1, 1, 0.5);
}
}
Erase_if(effects, [](const Vec3& effect) { return effect.z > 1.0; });
tone = ball.y > Window::Height() * 0.6 ? 0 : tone;
ball.moveBy(ballVelocity).draw(Palette::Skyblue);
gui.style.visible = Input::KeySpace.pressed;
}
}
- Siv3D の基本
- 図形を描く
- テクスチャを描く
- テキストを描く
- 文字列と数値の変換
- キーボード入力
- マウス入力
- サウンドの再生
- MIDI の再生
- ウィンドウと背景
- 図形のあたり判定
- 乱数
- ダイアログ
- ドラッグ & ドロップ
- アプリの状態
- テキストファイル
- INI, CSV, JSON
- バイナリファイル
- GUI
- アセット管理
- 画像編集
- Web カメラ
- マイク入力
- 経過時間の測定
- HSV カラー
- ファイルダウンロード
- 3D 描画
- 2D のレンダーステート
- 3D のレンダーステート
- パーティクル
- スクリーンショット
- アプリケーションの公開
- さらに学ぶには
- アプリランチャーを作ろう
- 音楽プレイヤーを作ろう
- 横スクロールゲームを作ろう
- ドット絵エディタを作ろう
- シーン遷移をサポートする SceneManager の使い方
- Siv3D ミニサンプル集
- タスクシステムを使う
- スケッチ
- 画像ビューアー
- オーディオスペクトラム
- マイク入力スペクトラム
- 文字色の反転
- 天気予報
- ドットお絵かき
- 15パズル
- ブロックくずし
- 時計
- 音楽プレイヤー
- ピアノ
- ライフゲーム
- シーン管理
- 地球
- 3Dシーン
- 3D交差判定
- Wooden Mirror
- シューティングゲーム
- Image to Polygon
- Sketch to Polygon
- 軌跡
- Plot3D
- テンポとピッチの変更
- 長方形の影
- Twitterクライアント
- Polygon to Mesh
- 3Dテキスト
- アプリ終了の確認
- 地形の生成
- アーカイブファイル
- GUIのアニメーション
- Aero Glassエフェクト
- Glitch
- リンクテキスト
- 付箋
- シーン切り替え(シルエット)
- MIDIシーケンサー
- 数つなぎ
- 画面を揺らす
- 対称定規
- aobench
- MIDIビジュアライザー
- 電卓
- 手書き文字認識
- 顔検出
- 音声合成
- Image to PhysicsBody