C++MIX#2 「パズモナのひみつ」

C++MIX#2 「パズモナのひみつ」

C++ MIX #2 で発表した資料です!!

https://cppmix.connpass.com/event/115640/

アプリ「パズル&モナーク」
https://apple.co/2SkC2Pc
ソースコード
https://github.com/tek-nishi/PuzzleAndMonarch

010b92be8b6508ea7da9a0fa5ce3040b?s=128

Nobuyuki Nishiyama

February 20, 2019
Tweet

Transcript

  1. 14.

    )FMMP $JOEFSXPSME #include <cinder/app/App.h> #include <cinder/app/RendererGl.h> #include <cinder/gl/gl.h> class CinderProjectApp

    : public ci::app::App { public: CinderProjectApp() = default; void mouseDown(ci::app::MouseEvent event) override; void update() override; void draw() override; }; void CinderProjectApp::mouseDown(ci::app::MouseEvent event) { } void CinderProjectApp::update() { } void CinderProjectApp::draw() { ci::gl::clear(ci::Color( 0, 0, 0 )); } CINDER_APP(CinderProjectApp, ci::app::RendererGl)
  2. 22.

    γΣʔμʔྫ 0QFO(- // // Field描画(Fragment shader) // #version 330 out

    vec4 oColor; void main(void) { oColor = vec4(1); } // // Field描画(Vertex shader) // #version 330 uniform mat4 ciModelViewProjection; in vec4 ciPosition; void main(void) { vec4 p = ciPosition; gl_Position = ciModelViewProjection * p; }
  3. 23.

    γΣʔμʔྫ 0QFO(-&4 // // Field描画(Fragment shader) // #version 300 es

    precision highp float; precision mediump sampler2DShadow; out vec4 oColor; void main(void) { oColor = vec4(1); } // // Field描画(Vertex shader) // #version 300 es uniform mat4 ciModelViewProjection; in vec4 ciPosition; void main(void) { vec4 p = ciPosition; gl_Position = ciModelViewProjection * p; }
  4. 25.

    ॻ͖׵͑ΔՕॴʹΩʔϫʔυΛࢦఆ // // Field描画(Fragment shader) // $version$ $precision$ out vec4

    oColor; void main(void) { oColor = vec4(1); } // // Field描画(Vertex shader) // $version$ uniform mat4 ciModelViewProjection; in vec4 ciPosition; void main(void) { vec4 p = ciPosition; gl_Position = ciModelViewProjection * p; }
  5. 28.

    wϝϞϦ؅ཧ͸ίϯύΠϥʹ೚͓͍ͤͯͨ΄͏͕ѹ ౗తʹָʂ w੿࡞Ͱ͸࠷ޙ·Ͱnewͱdeleteͷग़൪͕ͳ͔ͬͨ deleteΛίʔυ͔Βdelete class Fuga {}; class Piyo {};

    class Hoge { Fuga fuga; // 包含 std::shared_ptr<Piyo> piyo; // スマートポインタ ~Hoge() = default; // デストラクタで何もしない };
  6. 30.

    wجຊΫϥεΛܧঝ࣮ͯ͠૷͢Δײ͡Ͱ Α͘ݟ͔͚Δ6*࣮૷ͷύλʔϯ // 全てのUIの基本クラス class UIBase { virtual void setPosition(int

    x, int y) {} virtual void draw() {}; }; // ボタン class UIButton : public UIBase { void draw() override {} }; // テキスト class UIText : public UIBase { void draw() override {} };
  7. 31.

    wͦΕͧΕͷΫϥεʹద࣌௥Ճ͢Δ ಛఆͷΫϥεͰͷΈඞཁͳ஋ͷઃఆ΍औಘ // ボタン class UIButton : public UIBase {

    void setSize(int width, int height) {} // ボタン専用 void draw() override {} }; // テキスト class UIText : public UIBase { void setText(std::string text) {} // テキスト専用 void draw() override {} };
  8. 32.

    wdynamic_cast࢖͍ͨ͘ͳ͍ ͳΜ͔Πέͯͳ͍ʜ // テキスト class UIText : public UIBase {

    void setText(std::string text) {} // テキスト専用 void draw() override {} }; void f() { // 全てのUIを同一コンテナに格納 std::vector<UIBase*> widgets; auto* a = widgets[0]; a->setText("ほげ"); // もちろんできない auto* b = dynamic_cast<UIText*>(a); b->setText("ほげ"); // aがUITextだという保証はない }
  9. 33.

    wҎલͷΞϓϦ͸͜ͷ࣮૷ʹͳͬͯ͠·ͬͨ ͦͯ͠ਆϕʔεΫϥεͷ஀ੜʜ // 全てのUIの基本クラス class UIBase { virtual void setPosition(int

    x, int y) {} virtual void setSize(int width, int height) {} // ボタン専用 virtual void setText(std::string text) {} // テキスト専用 virtual void draw() {}; };
  10. 36.

    wͲΜͳܕͷ஋΋֨ೲͰ͖Δܕ w ܕ҆શͳWPJEϙΠϯλ w D ͔Β͸std::any͕ొ৔ boost::anyͱ͸ void f() {

    boost::any value; value = 1; // int型の値を格納 auto a = boost::any_cast<int>(value); // int型の値を取り出す value = 1.5; // double型の値を格納 auto b = boost::any_cast<double>(value); // double型の値を取り出す auto c = boost::any_cast<int>(value); // 型が違うと例外が発生する }
  11. 37.

    w஋ͷઃఆͱऔಘʹؔͯ͠ந৅ԽͰ͖ͨ w $ ͷʮܕ҆શʯ͸ࣦΘΕͯ͠·ͬͨʜ boost::anyΛ࢖ͬͯ͜Μͳײ͡ʹ࣮૷ class UIBase { virtual void

    draw() {} // 値の設定 virtual void setParam(std::string name, boost::any values) {} // 値の取得 virtual boost::any getParam(std::string name) {} };
  12. 38.

    w۩ମతͳܕΛҙࣝͤͣʹ৭ʑॲཧ͕ॻ͚Δ w ಛʹςΩετ͔ΒಡΈࠐΜͩ஋Λઃఆ͢ΔΑ͏ͳঢ়گͰָ ͜Μͳײ͡ʹॻ͚Δ void f() { std::vector<UIBase*> widgets; auto*

    a = widgets[0]; // 具体的な型は不明 vec2 pos(0, 0); a->setParam("position", pos); // 対応していれば値が設定される std::string text("ほげ"); a->setParam("text", text); // 対応していれば値が設定される float r = 10.0f; a->setParam("radius", r); // 対応していれば値が設定される }