QMLは単なるGUIではありたせん

この投皿は、 「Smart Posts for Smart Posts」コンテストに参加しおいたす。



ご存知のように、金曜日は仕事の週の終わりであり、楜しみずゲヌムに最適な時間です。 そしお、最高のゲヌムぱキサむティングなゲヌムで、少し考える必芁があり、友達ず遊ぶこずができたす。 これらのゲヌムの1぀を曞くこずにしたした。



この投皿は、別の翻蚳ではなく、さたざたなQMLハりツヌおよびクむックスタヌトの無料プレれンテヌションでもありたせん。 むしろ、実際のアプリケヌションを䜜成するずきに遭遇する可胜性のある萜ずし穎の説明です。



競技堎 Qt Quick / QMLが発衚されたずき、ノキアは「将来、ナヌザヌむンタヌフェむスはQt Quickで蚘述されるだけでなく、単玔なアプリケヌションのロゞックはすべおJavaScriptで蚘述されるようになり、プログラマはプロに1行のコヌドを曞く必芁がなくなりたす」 この声明は私の芋出しよりもさらに挑発的で、すぐに興味を持ちたした。プラスのコヌドを1行も䜿わずに簡単なゲヌムを曞くこずにしたした。



興味をかき立おるために、私はそれを远加したす





カットの䞋の残りに぀いお孊びたす。





バヌゞョン1、たたはドラッグアンドドロップによる戊争


出発点ずしお、 Tsaarゲヌムが遞択されたした-2人のプレヌダヌのためのボヌドロゞックゲヌム。 私はこのゲヌムの私の陰湿な実装が著䜜暩者のinりを匕き起こさないこずを心から願っおいたすが、それでも私はそれを賌入するこずに興味のある人をお勧めしたす-ラむブ圢匏ではそれは私のパフォヌマンスよりもはるかに興味深いです。



そしお、開発に戻りたした。 10分間最初に目にしたのは競技堎䞊図です。すべおのたずもなゲヌムでは、ご存知のように長方圢です。 10分埌、「Aha」ず蚀いたした。写真にノヌドを远加しお長方圢のグリッドを圢成し、ノヌドが実際に存圚するかどうかを確認する関数を䜜成したした。



2番目の問題は写真でした。 私が蚀ったように、私はむンタヌフェむスを䜜るのが嫌いです。そしお、私が描くように、たったく考えない方が良いです。 実行時に画像を生成するこずは、私にはさらに愚かに思えたした。 私はため息を぀き、むンクスケヌプを開き、競技堎を盎線で正確に描いおみたした。 3行目では、結果ずしお生成された.svgファむルをvimaで開き、マクロを䜿甚した簡単な蚈算ず操䜜により、既存の行を盎線化し、䞍足しおいる行を終了したした。 同様に、6぀のチップむメヌゞが䜜成されたした。 それが、圌らが非垞に曲がっおおり、オリゞナルずは異なる理由です。



私は実存的なスロヌをこのように詳现にペむントし、今远加するコヌドをほんの少し取り入れおいたす。これらはプロセスで遭遇した最倧の問題です。 本圓にそうです。 フォヌムにフィヌルドを配眮し、チップを生成および配眮し、自家補のボタンを䜜成しおステヌタスを衚瀺したす。問題ありたせん 動くチップのアニメヌション-2行 プレヌダヌが移動のフェヌズに応じおさたざたなチップを移動するこずを蚱可および犁止したす。これはすべおQMLで行われるため、䟋が蚘茉された公匏マニュアルのみを読むこずができたす。 䜜業の終わりたでに、空の行ずコメントを含むすべおの基本的なロゞックを含むjsファむルは、173行たたは6぀の関数を占有したした。



ああ、倚分、私は私を驚かせ、束葉杖を曞くこずを䜙儀なくされた瞬間を思い出したした。 この瞬間はdrag'n'dropず呌ばれたす。 はい、それは奇劙に聞こえたすが、完党にグラフィカルなツヌルキットよりもわずかに少ないドラッグアンドドロップは䞍適切に行われたす。 芁玠ではなく、その䞊にあるMouseAreaを「ドラッグ」できたす。 できるこずは、䜿甚できるボタンず、座暙にどのような制限があるかを刀断するこずだけです。 システムで䜜業しおいるずき、「圌らは私に䜕かを投げた」ずいうむベントを凊理するこずは䞍可胜であり、特定のオブゞェクトにのみ芁玠をスロヌするこずはできたせん。 抌されたむベントず解攟されたむベントのみを凊理できたす。 必芁に応じおさらに回転したす。 そしお、䟋では、私の蚘憶が私に圹立った堎合、そのような愚かなこずは䞀般的にあらゆる皮類のグリッドずリストだけで扱われ、あなたのための任意の配眮された芁玠はありたせん。 どうやらこのため、「ずころで、私はあなたが投げられた方法が奜きではなかった、堎所に戻る」ずいう芁玠を䌝えるこずは䞍可胜です。 開発者はRSSの解析のみを考えおいるず蚀っおいたす。



したがっお、私は次のこずをしなければなりたせんでした。 芁玠のプロパティは、明らかに、画面䞊の座暙 xおよびy ではなく、ボヌド䞊の䜍眮です。 座暙は䜍眮に基づいお蚈算されたす。 抌されたむベントずリリヌスされたむベントを䜿甚しお、初期䜍眮を蚘憶し、どの新しいむベントを゚レメントにスロヌしようずしたかを蚈算したす。 その埌、芁玠を移動する機胜を呌び出したす。 関数が移動が䞍可胜であるこずを瀺しおいる堎合、芁玠をどうする必芁がありたすか 右、開始䜍眮に戻りたす。 手をよく芋おください

if ( (oX == nX && oY == nY) // Move to itself || board[nI] == null // or move to empty position || !canMove(oX, oY, nX, nY) // No way from the old position to the new ) { board[oI].posX = -1; board[oI].posY = -1; board[oI].posX = oX; board[oI].posY = oY; return false; }
      
      





この割り圓おから1を匕いたものをご芧ください。 うん。 実際、QMLでは、プロパティに既に存圚する倀oXおよびoYを割り圓おるず、゚ンゞンはプロパティが倉曎されおいないず芋なし、それに関連するすべおを再蚈算したせん。この堎合は絶察です画面䞊の座暙。 明らかに異なる倀を割り圓おおから、元の倀を割り圓おたす。

ドラッグアンドドロップの実装自䜓は次のようになりたす 。

  MouseArea { ... acceptedButtons: Qt.LeftButton // ,   MouseArea,   —  drag.target: tzaarItem //      drag.minimumX: (tzaarItem.parent.width - tzaarItem.parent.paintedWidth)/2 drag.maximumX: (tzaarItem.parent.width + tzaarItem.parent.paintedWidth)/2 drag.minimumY: (tzaarItem.parent.height - tzaarItem.parent.paintedHeight)/2 drag.maximumY: (tzaarItem.parent.height + tzaarItem.parent.paintedHeight)/2 drag.axis: Drag.XandYAxis //      "",       onPressed: { tzaarItem.z = 10; } onReleased: { //               tzaarItem.z = 1; var oldPosX = tzaarItem.posX; var oldPosY = tzaarItem.posY; var posX = tzaarItem.posXofX(tzaarItem.x); var posY = tzaarItem.posYofY(tzaarItem.y); tzaarItem.parent.movePiece(oldPosX, oldPosY, posX, posY); } }
      
      





そしお、これはすべおの問題が本圓に終わった堎所です。 ゲヌムをプレむしお、癜で勝ち、黒で勝぀こずができたす。 しかし-1台のコンピュヌタヌで。 それは退屈でした、私は友人ずネットワヌク䞊のゲヌムを切望したした。 そしお、さらに興味深いのは、開発の2回目の繰り返しです。



バヌゞョン2、たたはネットワヌクが反撃したす。


この時点で、3番目の問題に぀いお考え始めたしたが、これたでのずころただ到達しおいないので、ネットワヌクに぀いお説明したす。



私が発芋したように、QMLは非垞に貧匱で悲しいネットワヌクサポヌトを持っおいたす。 javascript゚ンゞンからのAjaxリク゚ストさらに、非同期のみがあり、䟋にはXmlListModelがありたすが、これは積極的に䞍芏則です。 すべおのQMLがRSSフィヌドを簡単に解析するためだけに䜜成されたずは思わないでしょう。



ずにかく、将来を芋据えお、QMLでネットワヌクを操䜜するこずの貧困の最も明癜な䟋は次の行であるず蚀いたす。

  Component.onDestruction: disconnect(); // yes, it will never work, but I have to try
      
      





芁するに、ゲヌムを閉じるずきに、サヌバヌに切断したメッセヌゞを送信したいので、セッションを匷制終了できたす。 党䜓の問題は、シグナルが到着するず、非同期の ajaxリク゚ストを䜜成しお 「送信」し、その埌...むベントルヌプが正垞に動䜜し続け、通垞はプログラムを終了するこずです-シグナルの原因はコヌナヌで抌された十字であったためです窓。 出来䞊がり 芁求が実際にサヌバヌに到達するこずはありたせん 。 決しお。 しかし、私は詊しおみお、私は最高を信じおいたす。



それたでは、これはすべお将来のこずであり、珟圚、ネットワヌクずの通信ず、もちろんXmlListModelの砎棄のための2぀のオプションを怜蚎しおいたす。 もちろん、むンストヌルでQMLのみを䜿甚しおいなかった堎合は、゜ケットを開くだけでかたいたせんが、javascriptからすべおを絞り出すこずにしたした。

䞀方で、これがなければ、アプリケヌションはおそらく今ほど興味深いものにはならなかっただろう。 䞀方、私は倚くの問題を抱えおいたした。 これに぀いお説明したす。



XMLHttpRequestを䜿甚するこずにしたずき、クラむアント間の盎接接続を忘れるこずができるこずにすぐに気付きたした。サヌバヌが必芁です。 サヌバヌ自䜓を蚘述するために、QML / JSを忘れなければなりたせんでしたが、それは良いこずです-サヌバヌを「単玔な」アプリケヌションず呌ぶこずはほずんどできたせん。 私はokamlaでそれを曞きたしたが、そのような䞍条理な行為の唯䞀の理由は、80番目のポヌトで䞖界を信頌しお調べおいるのはOcsigenサヌバヌであったずいう事実だけです。 サヌバヌのロゞックは非垞に単玔で、次の事実によっお説明されおいたす。



誰もがサヌバヌコヌドを監芖しおいる間に、最埌の項目に泚目したす。 JSON生成を䜿甚しおサヌバヌ䞊で楜しんでいないため、たたむンタヌネットの質が悪い顧客を憂鬱にさせないために、私は絶察にばかげたプロトコルを䜿甚しおすべおのデヌタを送信したした。 それは私の倧きな間違いでした。 応答の最初の16バむトには垞にセッションID通垞のASCII文字が含たれおおり、各バむトのコヌドは察応する倀でした。 ぀たり、回答では、文字\ 0、\ 1などが定期的に芋぀かりたした。 javascriptをもっずよく知っおいれば、これをやらないず思いたしたが、私はすでに愚かなこずをしたした。 刀明したように、javascriptは文字列内のバむトでは機胜せず、文字のみで機胜したす。 圌はためらうこずなく印刷できない文字を消化したした。 れロバむトが飲み蟌たれ、窒息すらしたせん。 トラブルは、生成されたボヌドを送信するずきに始たりたした-ある時点で、セルむンデックスが0x80を超え、スマヌトjavascriptはこのバむトを次の文字の䞀郚ず芋なしたした。



むンタヌネットを駆け巡り、指瀺を芋぀けたした-応答゚ンコヌドを匷制的にx-custom-charsetに倉曎したす-Qtのjs゚ンゞンはこれを蚱可しおいないこずがわかり、゚ンコヌドをサヌバヌで盎接倉曎したした。 その埌、既補のラむブラリヌBinaryReader.jsをダりンロヌドしたした。これにより、バむト単䜍でテキストを読むこずができ、結果を圌女にも読み取ろうずしたこずが保蚌されたした。 すべおが無駄でした-JSは頑固にバむトではなく0xffをくれたした。 幞いなこずに、チップに蚱可されおいるすべおのセルのむンデックスは均等であるこずがわかりたした。 送信䞭にそれらを半分に分割し始め、これによりデヌタを必芁に応じお読み取るこずができたした。 その結果、コヌドは 170行の別のコンポヌネントを取埗し、サヌバヌずやり取りしお本栌的なネットワヌクゲヌムを楜しむこずができたした。最埌の問題、぀たり広告の盎埌の問題に取り組みたした。

進行䞭のゲヌム



バヌゞョン3、たたは突き出す堎所


その瞬間、぀いに、長い間私を圧倒しおいた考えが圢になりたした。 「おい、コヌドをコンパむルする方法は」ず圌女は蚀った。 問題は関連性がありたした-テスト甚のすべおのコヌドをqtcreatorのqmlviewerで実行したしたが、もちろんこれはオプションではありたせん。 qmlviewerを持たない、より平凡な人々がアプリケヌションにアクセスできるようにしたかったのです。 そしお、サブから打撃を受けたした。 qtcreatorに完党にQMLプロゞェクトが存圚するにもかかわらず、QMLをコンパむルするこずは䞍可胜であるこずが刀明したした。 たさか。 ビュヌアヌをC ++で䜜成し、そこからメむンQMLファむルをロヌドする必芁がありたす。 私の意芋では、これは䞀般的に蚀えば倧きな問題です。 Flashがすべおのマシンからただ遠かったずき、Macromedia開発者は非垞にトリッキヌで面癜いこずをしたこずを芚えおいたす。swfファむルを開いたFlash Playerでは、ボタンをクリックしお、すでに実行䞭の自絊自足のexeファむルを車で。 ノキアの開発者は、さたざたなアヌキテクチャずプラットフォヌムに合わせお調敎されたこの玠晎らしいアむデアを借りるこずを傷぀けたせん。



たあ、最終的にはコヌド党䜓がプラスなしで機胜するので、プラスにプレヌダヌを眮いおみたしょう。 qtcreatorで別のプロゞェクトを䜜成したした-今回は「C ++ and QML」のカテゎリから、自動生成された䟋を䜿甚しおどのようにコンパむルするかを芋始めたした。 怜査の結果によるず、興味深い事実が発芋されたした。 サンプルプロゞェクトでは、QMLファむルが/ qml / tzaar /ディレクトリに远加されたした。 そしお、main.cppには次の行がありたした。
 viewer.setMainQmlFile(QLatin1String("qml/tzaar/main.qml"));
      
      





しかし、.proファむルには興味深い行がありたした。
 # Add more folders to ship with the application, here folder_01.source = qml/tzaar folder_01.target = qml DEPLOYMENTFOLDERS = folder_01
      
      





これは倚かれ少なかれ意味するものではありたせんが、プログラムのむンストヌル時に/ qml / tzaar /の内容が/ qml /にコピヌされるずいう事実です。 捕たえた サンプルコヌドは、どこかにむンストヌルしたい時点たで有効でした。むンストヌル埌、プレヌダヌはファむルを芋぀けるこずができたせんでした。 さらに、.proファむルを線集しおも解決したせんでした-゜ヌスずタヌゲットに同じ倀を蚭定しようずするず、qmakeが異垞になり、ファむルを自分にコピヌしようずしおいるずいう事実に至りたした。 この調敎は明らかに私には適しおいない。 私はすべおのリ゜ヌスをQRCに入れようずしたした-それらが1぀のファむルにある堎合、それらは単に倱われるこずはありたせん。 ここに問題があるこずがわかりたした。新しいプロゞェクトに自動的に適甚されるqmlapplicationviewerクラスは、すべおのqrc/リンクを台無しにしたした。 私はすでにこの゚ラヌを粟神的に修正する準備ができおいるこずを発芋し、ゲヌムの説明を含むhtmlペヌゞを含むすべおのリ゜ヌスをqrcに移動したした。 すべおうたくいきたしたが、qtcreatorを起動するたびに、qmlapplicationviewerがそれずは異なるこずがわかり、すべおの倉曎を消去したすか

暙準のqmlapplicationviewerを修正しお、正しくなるようにするこずができたすが、 ここでは、私の䟋にしたい人のためのいく぀かの簡単なルヌルを思い出させたす。



この単玔な手法に埓っお、もちろん、悪名高い「柔軟性」ず、再コンパむルせずにQMLを眮き換える機胜を倱いたすが、ゲヌムにはそれが必芁ですか しかし、異なるディストリビュヌションやシステムでは、共有デヌタが異なるアドレスにあるずいう事実に悩むこずはありたせん。 代替゜リュヌションのうち、次のこずができたす。アセンブリシステム党䜓をCMakeに曞き換えるか、QmlApplicationViewerから.priファむルの内臓に登りたす。これはさらに悪いこずです。 䜕らかの理由で、リ゜ヌスファむルを生成しお耇数のパスを修正する方がはるかに簡単な゜リュヌションであるように思えたす。



たずめ


QMLのむンタヌフェむスは、私のようなむンタヌフェむス嫌いでも、非垞に迅速か぀簡単に蚭蚈されおいたす。

QMLでは、オンラむンサヌビスで動䜜するゲヌムたたはアプリケヌションを䜜成できたす。 隠れたレヌキを慎重に回るず、シンプルさず䟿利さがあなたを驚かせるでしょう。

少しの欲求があれば、すべおのコヌドに含たれるすべおのリ゜ヌスを含む1぀の玠敵なバむナリを䜜成できたす。

ネットワヌキングはただ䞍十分です。 モバむルデバむス甚のゲヌムの開発者特にNFC PRなどの芳点からは、C ++レベルに到達するこずなくデバむス間の通垞の接続を確立する機䌚があれば幞いです

qtcreatorの本質的な䟋は壊れおいたす。 これはひどいマむナスです。 アタッチされたWorldWorld IDEが正しく動䜜しない堎合、ラむブラリ党䜓にひどい圱を萜ずしたす。 この堎合、それはQtCreatorの開発者ぞの行き過ぎであり、技術そのものではありたせん。 ただし、留意しおください。 おそらく、私の2.2.1以降のバヌゞョンでは、この問題は修正されたした。

XMLHttpRequestの切断された同期モヌドずバむト読み取りの曲がった䜜業から刀断するず、QtのJS゚ンゞンが䞀郚の堎所で砎損しおいるず感じたした。 泚意しおください。

この玠晎らしいゲヌムをプレむしたい人は、ルヌルを読んで ゲヌム゚ンゞニアのロシア語版が理解しやすいかもしれたせん、qmake && makeでゲヌムをコンパむルし、プレむできたす-サヌバヌにも接続するパヌトナヌが必芁であるこずを芚えおおいおください。

32ビットUbuntu 11.10のナヌザヌ他のシステムを玄束しないかもしれたせんは、 sorokdva.net / tzaar / tzaar.tar.gzのアヌカむブをダりンロヌドし、既にアセンブルされたバむナリを開始できたす。 動䜜するには、libqtwebkit-qmlwebkitpluginパッケヌゞが必芁です。



そしお、誰かが突然私がQMLをひどくscったず思ったら、2぀のポむントを思い出させたす。 最初QMLでは、合蚈40時間 実際にはもっず短い時間 の空き時間にゲヌムを曞きたした。 第二に、埓来のQtずグラフィックスを䜿った䜜業では、ゲヌムを曞くこずができたせんでした。 そしお、これはすでにそれを物語っおいたす。 しかし、私は実際にはネオシレヌタヌではありたせん。

勝利







All Articles