Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

Nobuyuki Nishiyama

February 20, 2019
Tweet

More Decks by Nobuyuki Nishiyama

Other Decks in Programming

Transcript

  1. $.*9
    J04ΞϓϦʮύζϞφʯͷͻΈͭ
    ΅ͬͪήʔϜσϕϩού
    ੢ࢁ৴ߦ

    View Slide

  2. w೥͔ΒձࣾΛసʑͱ͠ͳ͕ΒήʔϜ࡞Γ
    w 1$ɺՈఉ༻ήʔϜػɺΨϥέʔɺεϚϗʜ
    w೔ຊిࢠઐ໳ֶߍͰि೔ήʔϜ࡞ΓΛڭ͑ͯ·
    ͢
    w࠷ۙΞχϝ5)&*%0-.!45&3Λ؍ऴΘΓ·
    ͨ͠ʂ
    ੢ࢁ৴ߦͱ͸

    View Slide

  3. ࡢ೥຤ɺٱʑʹΞϓϦΛϦϦʔεʂ

    View Slide

  4. wͻΈͭ̍։ൃ؀ڥͷͻΈͭ
    wͻΈͭ̎ϚϧνϓϥοτϑΥʔϜͷͻΈͭ
    wͻΈͭ̏6*࣮૷ͷͻΈͭ
    wࠓ೔͍͞͝ͷͻΈͭ
    ࠓ೔͸͜ͷΞϓϦͷͻΈͭΛ࿩͠·͢ʂ

    View Slide

  5. w ్த࿩͕ݟ͑ͳ͘ͳͬͨΓɺҾֻ͔ͬͬͨࣄ͕
    ͋Ε͹ɺԕྀͳͦ͘ͷ৔Ͱ࣭໰͍ͯͩ͘͠͞
    wྫࣔ͢Δίʔυ͸ϨΠΞ΢τͷ౎߹্͡Ό͔ͬ
    Μෆਖ਼֬Ͱ͢
    ͦͷલʹ

    View Slide

  6. ͻΈͭ̍։ൃ؀ڥͷͻΈͭ
    $.*9

    View Slide

  7. w$Ͱ։ൃ
    wৗ࣌GQTͰψϧψϧಈ͘
    wҰॠͰΞϓϦ͕ىಈɻϩʔυը໘ͱ͸ແԑͰα
    ΫαΫಈ͘
    ͜ͷΞϓϦͷಛ௃

    View Slide

  8. w6OJUZ΍6&Ͱ΋͍͍Μ͚ͩͲɺઐ໳ֶߍͷڭ͑
    ࢠͨͪ΁ͷڭࡐ͕ཉ͍͠
    w$ؤݻ͓͡͞Μ͕͍͍͍ͨͬͯ͡Όͳ͍
    wJ04ͷ0CKFDUJWF$ͱซ༻Մೳ
    ͳͥ$ʁ

    View Slide

  9. ͜Ε࢖͍ͬͯ·͢

    View Slide

  10. wϏδϡΞϧσβΠϯ޲͚ͷ$ϥΠϒϥϦ
    wNBD04ɺJ04ɺ8JOEPXTʹରԠ
    w$Ͱͷͼͷͼ։ൃͰ͖Δ
    wϥΠϒϥϦͷϑϧϏϧυ͕αΫοͱͰ͖Δ
    $JOEFSͱ͸

    View Slide

  11. ͜Μͳײ͡ͷσϞͰΑ͘࢖ΘΕ͍ͯΔΒ͍͠

    View Slide

  12. wIUUQTSFTFBSDIQSFGFSSFEKQDJOEFSJOUSP
    1SFGFSSFE/FUXPSLͷதͷਓ΋ਪͯ͠Δʂ

    View Slide

  13. wެࣜαΠτ
    w IUUQTMJCDJOEFSPSH
    w(JU)VC
    w IUUQTHJUIVCDPNDJOEFS$JOEFS
    w ։ൃϒϥϯν͸EFW
    ࠷৽൛Ͱ͋ΔΛར༻

    View Slide

  14. )FMMP $JOEFSXPSME
    #include
    #include
    #include
    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)

    View Slide

  15. wް͔·͘͠ͳ͍ఔ౓ʹ0QFO(-Λϥοϓ͍ͯ͠
    Δ
    wλονೖྗͳͲΛ04ͷҧ͍Λؾʹͤͣѻ͑Δ
    wα΢ϯυपΓ΋04ͷҧ͍Λؾʹͤͣѻ͑Δ
    wࣗݾ੹೚ͰϥΠϒϥϦʹखΛೖΕΒΕΔ
    $JOEFSͷྑ͞

    View Slide

  16. wα΢ϯυͷઃܭ͕ڽΓ͗ͯͯ͢J04ͰϘτϧωο
    ΫʹͳΓ͕ͪ
    wϞσϧσʔλͷαϙʔτ͸0#+ܗࣜͷΈ
    w೔ຊޠද͕ࣔඍົɹ
    w࠷৽൛͸γΣʔμʔલఏͳͷͰॳ৺ऀʹ͸΍΍
    ͭΒ͍ʜ
    $JOEFSͷඍົ͞

    View Slide

  17. ͻΈͭ̎ϚϧνϓϥοτϑΥʔ
    ϜͷͻΈͭ
    $.*9

    View Slide

  18. wιʔεϑΝΠϧ͸65' #0.෇͖
    Ͱ
    w 7JTVBM4UVEJPͰ65' #0.ແ͠
    ͷιʔείʔυΛϏϧ
    υ͢ΔͱίϯύΠϥ͕จࣈίʔυΛ$1ͱͯ͠ѻ͏
    कΔ΂͖ϧʔϧ

    View Slide

  19. w$Λ࢖͏
    w0QFO(-΋όʔδϣϯΛܾΊΔ


    w 0QFO(-ͱ0QFO(-&4Ͱ͋Ε͹γΣʔμʔͷࠩҟ
    ͕গͳ͍
    ͋Β͔͡ΊܾΊ͓͍ͯͨࣄ
    σεΫτοϓ൛ 0QFO(-
    J04൛ 0QFO(-&4

    View Slide

  20. w0QFO(-ͱ0QFO(-&4ͷγΣʔμʔ͸
    શ͘ಉ͡Ͱ͸ͳ͍
    w $JOEFSͷαϯϓϧ΋ݸผʹ༻ҙ͍ͯ͠Δ
    0QFO(-ͷγΣʔμʔʹؔͯ͠

    View Slide

  21. w0QFO(-ͷγΣʔμʔ͸࣮ߦ࣌ʹίϯύΠϧ͢Δ
    ͷͰɺ࣮ߦ؀ڥ͝ͱʹΰχϣΰχϣͰ͖Δ
    Ͳ͏͢Δ͔

    View Slide

  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;
    }

    View Slide

  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;
    }

    View Slide

  24. w$Ҏ߱Ͱ͋Ε͹std::regexΛ࢖ͬͯαΫ
    αΫจࣈྻஔ׵Ͱ͖Δ
    wਖ਼نදݱͷจ๏͸&$."4DSJQUͷͦΕͱಉ͡
    std::regexͷग़൪ʂ
    // 正規表現のパターンに一致した全ての箇所を置き換えた
    // 新しい文字列を作成
    auto text = std::regex_replace(shader_text,
    std::regex("\\$version\\$"),
    "#version 300 es");

    View Slide

  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;
    }

    View Slide

  26. ΩʔϫʔυΛஔ͖׵͑Δ
    0QFO(- 0QFO(-&4
    $version$ #version 330 #version 300 es
    $precision$
    precision highp float;
    precision mediump sampler2DShadow;

    View Slide

  27. wۃྗnewͱdeleteΛ࢖Θͳ͍
    wแؚ͔εϚʔτϙΠϯλΛ࢖͏
    newͱdelete

    View Slide

  28. wϝϞϦ؅ཧ͸ίϯύΠϥʹ೚͓͍ͤͯͨ΄͏͕ѹ
    ౗తʹָʂ
    w੿࡞Ͱ͸࠷ޙ·Ͱnewͱdeleteͷग़൪͕ͳ͔ͬͨ
    deleteΛίʔυ͔Βdelete
    class Fuga {};
    class Piyo {};
    class Hoge
    {
    Fuga fuga; // 包含
    std::shared_ptr piyo; // スマートポインタ
    ~Hoge() = default; // デストラクタで何もしない
    };

    View Slide

  29. ͻΈͭ̏6*࣮૷ͷͻΈͭ
    $.*9

    View Slide

  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 {}
    };

    View Slide

  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 {}
    };

    View Slide

  32. wdynamic_cast࢖͍ͨ͘ͳ͍
    ͳΜ͔Πέͯͳ͍ʜ
    // テキスト
    class UIText : public UIBase
    {
    void setText(std::string text) {} // テキスト専用
    void draw() override {}
    };
    void f()
    {
    // 全てのUIを同一コンテナに格納
    std::vector widgets;
    auto* a = widgets[0];
    a->setText("ほげ"); // もちろんできない
    auto* b = dynamic_cast(a);
    b->setText("ほげ"); // aがUITextだという保証はない
    }

    View Slide

  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() {};
    };

    View Slide

  34. wجຊΫϥεΛܧঝ͢Δͷ͸ΞϦ
    w ̍ͭͷίϯςφͰҰׅ؅ཧͰ͖Δ
    wͰ΋Ωϟετͯ͠࢖͍ͨ͘ͳ͍
    ࣗ෼తʹ೉໰ͩͬͨ

    View Slide

  35. wboost::anyΛ࢖ͬͨ
    w ͲΜͳܕͷ஋΋֨ೲͰ͖Δܕ ܕ҆શͳWPJEϙΠϯλ

    Ͳ͏΍ͬͯղܾ͔ͨ͠

    View Slide

  36. wͲΜͳܕͷ஋΋֨ೲͰ͖Δܕ
    w ܕ҆શͳWPJEϙΠϯλ
    w D͔Β͸std::any͕ొ৔
    boost::anyͱ͸
    void f()
    {
    boost::any value;
    value = 1; // int型の値を格納
    auto a = boost::any_cast(value); // int型の値を取り出す
    value = 1.5; // double型の値を格納
    auto b = boost::any_cast(value); // double型の値を取り出す
    auto c = boost::any_cast(value); // 型が違うと例外が発生する
    }

    View Slide

  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) {}
    };

    View Slide

  38. w۩ମతͳܕΛҙࣝͤͣʹ৭ʑॲཧ͕ॻ͚Δ
    w ಛʹςΩετ͔ΒಡΈࠐΜͩ஋Λઃఆ͢ΔΑ͏ͳঢ়گͰָ
    ͜Μͳײ͡ʹॻ͚Δ
    void f()
    {
    std::vector 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); // 対応していれば値が設定される
    }

    View Slide

  39. ࠓ೔͍͞͝ͷͻΈͭ
    $.*9

    View Slide

  40. wIUUQTHJUIVCDPNUFLOJTIJ1V[[MF"OE.POBSDI
    ιʔείʔυެ։தʂ

    View Slide

  41. w5XJUUFS!NJOHBNF
    w'BDFCPPLNJOHBNF
    w(JU)VCUFLOJTIJ
    Ҏ্ɺJ04ΞϓϦʮύζϞφʯͷͻΈͭͰͨ͠ʂ
    ΞϓϦ޷ධ഑৴தʂ

    View Slide