-
Notifications
You must be signed in to change notification settings - Fork 1
マウスで円をつかんで動かす
Reputeless edited this page Mar 14, 2017
·
5 revisions
# include <Siv3D.hpp>
void Main()
{
Circle circle(200, 200, 50);
// つかんでいたら true, そうでない場合は false
bool grabbed = false;
while (System::Update())
{
if (circle.leftClicked)
{
// 円をクリックしたらつかむ
grabbed = true;
}
else if (Input::MouseL.released)
{
// マウスの左クリックが離されたら離す
grabbed = false;
}
else if (grabbed)
{
// つかんでいる間はマウスの移動量分だけ円を動かす
circle.moveBy(Mouse::Delta());
}
circle.draw(Palette::Skyblue);
}
}
# include <Siv3D.hpp>
void Main()
{
Circle circle(200, 200, 50);
bool grabbed = false;
while (System::Update())
{
if (circle.leftClicked)
{
grabbed = true;
}
else if (Input::MouseL.released)
{
grabbed = false;
}
else if (grabbed)
{
circle.moveBy(Mouse::Delta());
}
// カーソルのアイコンを手の形にするなら true, そうでない場合は false
const bool handCursor = circle.mouseOver;
Cursor::SetStyle(handCursor ? CursorStyle::Hand : CursorStyle::Default);
circle.draw(Palette::Skyblue);
}
}
# include <Siv3D.hpp>
void Main()
{
// 背景色を白に
Graphics::SetBackground(Palette::White);
Circle circle(200, 200, 50);
bool grabbed = false;
while (System::Update())
{
if (circle.leftClicked)
{
grabbed = true;
}
else if (Input::MouseL.released)
{
grabbed = false;
}
else if (grabbed)
{
circle.moveBy(Mouse::Delta());
}
const bool handCursor = circle.mouseOver;
Cursor::SetStyle(handCursor ? CursorStyle::Hand : CursorStyle::Default);
if (grabbed)
{
// つかんでいる場合、円の影を描く
circle.drawShadow({ 0,2 }, 12, 3);
}
circle.draw(Palette::Skyblue);
}
}
# include <Siv3D.hpp>
class GrabCircle
{
private:
Circle m_circle;
Color m_color;
bool m_grabbed = false;
public:
GrabCircle() = default;
explicit GrabCircle(const Circle& circle)
: m_circle(circle)
, m_color(RandomColor()) {}
const Circle& getCircle() const
{
return m_circle;
}
void update()
{
if (m_circle.leftClicked)
{
m_grabbed = true;
}
else if (Input::MouseL.released)
{
m_grabbed = false;
}
else if (m_grabbed)
{
m_circle.moveBy(Mouse::Delta());
}
}
void draw() const
{
if (m_grabbed)
{
m_circle.drawShadow({ 0,2 }, 12, 3);
}
m_circle.draw(m_color);
}
};
void Main()
{
Graphics::SetBackground(Palette::White);
GrabCircle circle(Circle(200, 200, 50));
while (System::Update())
{
circle.update();
circle.draw();
const bool handCursor = circle.getCircle().mouseOver;
Cursor::SetStyle(handCursor ? CursorStyle::Hand : CursorStyle::Default);
}
}
# include <Siv3D.hpp>
class GrabCircle
{
private:
Circle m_circle;
Color m_color;
bool m_grabbed = false;
public:
GrabCircle() = default;
explicit GrabCircle(const Circle& circle)
: m_circle(circle)
, m_color(RandomColor()) {}
const Circle& getCircle() const
{
return m_circle;
}
void update()
{
if (m_circle.leftClicked)
{
m_grabbed = true;
}
else if (Input::MouseL.released)
{
m_grabbed = false;
}
else if (m_grabbed)
{
m_circle.moveBy(Mouse::Delta());
}
}
void draw() const
{
if (m_grabbed)
{
m_circle.drawShadow({ 0,2 }, 12, 3);
}
m_circle.draw(m_color);
}
};
void Main()
{
Graphics::SetBackground(Palette::White);
Array<GrabCircle> circles =
{
GrabCircle(Circle(100, 100, 50)),
GrabCircle(Circle(300, 100, 50)),
GrabCircle(Circle(500, 100, 50)),
GrabCircle(Circle(300, 300, 50)),
};
while (System::Update())
{
for (auto& circle : circles)
{
circle.update();
}
for (const auto& circle : circles)
{
circle.draw();
}
bool handCursor = false;
for (const auto& circle : circles)
{
if (circle.getCircle().mouseOver)
{
handCursor = true;
break;
}
}
Cursor::SetStyle(handCursor ? CursorStyle::Hand : CursorStyle::Default);
}
}
# include <Siv3D.hpp>
class GrabCircle
{
private:
Circle m_circle;
Color m_color;
// 最後につかまれた時刻(ミリ秒)
uint32 m_lastUpdateTimeSec = 0;
bool m_grabbed = false;
public:
GrabCircle() = default;
explicit GrabCircle(const Circle& circle)
: m_circle(circle)
, m_color(RandomColor()) {}
const Circle& getCircle() const
{
return m_circle;
}
bool update()
{
if (m_circle.leftClicked)
{
m_grabbed = true;
m_lastUpdateTimeSec = Time::GetMillisec();
return true;
}
else if (Input::MouseL.released)
{
m_grabbed = false;
}
else if (m_grabbed)
{
m_circle.moveBy(Mouse::Delta());
}
return false;
}
void draw() const
{
if (m_grabbed)
{
m_circle.drawShadow({ 0,2 }, 12, 3);
}
m_circle.draw(m_color);
}
uint32 getLastUpdateTime() const
{
return m_lastUpdateTimeSec;
}
};
void Main()
{
Graphics::SetBackground(Palette::White);
Array<GrabCircle> circles =
{
GrabCircle(Circle(100, 100, 50)),
GrabCircle(Circle(300, 100, 50)),
GrabCircle(Circle(500, 100, 50)),
GrabCircle(Circle(300, 300, 50)),
};
while (System::Update())
{
for (auto& circle : circles)
{
// 1 つの円がつかまれたら、それ以外の円は処理しない
if (circle.update())
{
break;
}
}
// 最後につかんだ円が配列の先頭にくるようにソートする
std::sort(circles.begin(), circles.end(),[](const GrabCircle& a, const GrabCircle& b)
{
return a.getLastUpdateTime() > b.getLastUpdateTime();
});
// 下の円から順に描く
for (auto it = circles.rbegin(); it != circles.rend(); ++it)
{
it->draw();
}
bool handCursor = false;
for (const auto& circle : circles)
{
if (circle.getCircle().mouseOver)
{
handCursor = true;
break;
}
}
Cursor::SetStyle(handCursor ? CursorStyle::Hand : CursorStyle::Default);
}
}
- 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