Save 37% off PRO during our Black Friday Sale! »

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. $ .*9 J04ΞϓϦʮύζϞφʯͷͻΈͭ ΅ͬͪήʔϜσϕϩού ੢ࢁ৴ߦ

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

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

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

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

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

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

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

  9. ͜Ε࢖͍ͬͯ·͢

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

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

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

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

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

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

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

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

  19. w$ Λ࢖͏ w0QFO(-΋όʔδϣϯΛܾΊΔ
 
 w 0QFO(-ͱ0QFO(-&4Ͱ͋Ε͹γΣʔμʔͷࠩҟ ͕গͳ͍ ͋Β͔͡ΊܾΊ͓͍ͯͨࣄ σεΫτοϓ൛ 0QFO(-

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

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

  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; }
  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; }
  24. w$ Ҏ߱Ͱ͋Ε͹std::regexΛ࢖ͬͯαΫ αΫจࣈྻஔ׵Ͱ͖Δ wਖ਼نදݱͷจ๏͸&$."4DSJQUͷͦΕͱಉ͡ std::regexͷग़൪ʂ // 正規表現のパターンに一致した全ての箇所を置き換えた // 新しい文字列を作成 auto

    text = std::regex_replace(shader_text, std::regex("\\$version\\$"), "#version 300 es");
  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; }
  26. ΩʔϫʔυΛஔ͖׵͑Δ 0QFO(- 0QFO(-&4 $version$ #version 330 #version 300 es $precision$

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

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

    class Hoge { Fuga fuga; // 包含 std::shared_ptr<Piyo> piyo; // スマートポインタ ~Hoge() = default; // デストラクタで何もしない };
  29. ͻΈͭ̏6*࣮૷ͷͻΈͭ $ .*9

  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 {} };
  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 {} };
  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だという保証はない }
  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() {}; };
  34. wجຊΫϥεΛܧঝ͢Δͷ͸ΞϦ w ̍ͭͷίϯςφͰҰׅ؅ཧͰ͖Δ wͰ΋Ωϟετͯ͠࢖͍ͨ͘ͳ͍ ࣗ෼తʹ೉໰ͩͬͨ

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

  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); // 型が違うと例外が発生する }
  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) {} };
  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); // 対応していれば値が設定される }
  39. ࠓ೔͍͞͝ͷͻΈͭ $ .*9

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

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