SPLでUWPアプリケーションを作成する

現時点では、UWPアプリケーション(UWP-ユニバーサルWindowsプラットフォーム、または「ユニバーサルWindowsプラットフォーム」)の作成に適したプログラミング言語は多くありません。デスクトップ、タブレット、スマートフォン、およびWindows 10を実行する他のデバイスでの実行にも同様に適しています。 。



現在、私が開発しているSPLプログラミング言語は、SPL SDKのおかげでUWPアプリケーションの作成にも使用できます。 それについて詳しく説明します。



この記事では、マンデルブロフラクタルブラウザーという簡単な例を使用して、スタンドアロンUWPアプリケーションを作成するプロセスを示します。 最初にプログラムのテキストを提供し、次に説明し、次にそれがどのようにUWPアプリケーションになるかについて説明します。



もちろん、たった1行のプログラムの例に限定することもできます。



#.output("Hello, world!")
      
      





しかし、それはあまりにも簡単でしょう:)



以下のプログラムは、移動とスケーリングのための標準的なマルチタッチジェスチャを使用してナビゲーションが実行される、マンデルブロフラクタルのシンプルなブラウザです。 また、この例では、並列フローでタスクを実行する機能、グラフィック機能用のオフスクリーンバッファの動作、およびプログラムインターフェイスを操作するマルチタッチジェスチャの使用が示されています。 この例は、SPLプログラムがスタンドアロンのUWPアプリケーションになり、Microsoft Storeにダウンロードできるようになることを示すために、主なことに焦点を当てるために追加機能で特にオーバーロードされていません。



フラクタルブラウザープログラムテキスト:



 w,h = #.scrsize() sfx = -2.5; sfy = -2*h/w; sfs = 4 #.aaoff() :again end,redo,update = 0 -> draw() '     > moved = 0 > #.pan() '  moved = 1 x,y,s = #.pan(3) x -= (s-1)/2*w y -= (s-1)/2*h #.drawoff(x,y,s) < ? moved '   sfs /= s sfx -= x*sfs/w sfy -= y*sfs/w again -> end redo = 1 . ? update & !redo '  update = 0 #.drawoff(0,0) . wn,hn = #.scrsize() ? wn!=w | hn!=h '   w = wn; h = hn again -> end redo = 1 . < draw()= :loop #.offon() '    #.scrclear(0,0,0) .redo = 0 sfx = .sfx; sfy = .sfy; fs = .sfs/.w > y, 1...h > x, 1...w fx = sfx + x*fs fy = sfy + y*fs #.drawpoint(x,y,color(fx,fy):3) < loop -> .redo .update = 1 < .end = 1 . color(x,y)= zr = x; zi = y; n = 0 maxn = #.int(200*(1-#.log10(.sfs/4))) > zr*zr+zi*zi<4 & n<maxn zrn = zr*zr-zi*zi+x; zin = 2*zr*zi+y zr = zrn; zi = zin; n += 1 < ? n=maxn; <= 0,0,0; . <= #.hsv2rgb(n/maxn*360,1,1):3 .
      
      





画像



次に、この例を詳しく見てみましょう。



 w,h = #.scrsize() sfx = -2.5; sfy = -2*h/w; sfs = 4 #.aaoff() :again end,redo,update = 0 -> draw() '    
      
      





最初の2行では、フルスクリーンでフラクタルを描画するために必要な画面サイズを取得し、フラクタルの初期位置とスケールを設定します。 3行目では、グラフィックのアンチエイリアスをオフにします(デフォルトで有効になっています)。 最後の行で、並列ストリームでフラクタルドローを計算するための関数を実行します。



この例では、メインストリームはナビゲートし、フラクタルの計算を制御し、画面に表示するのに忙しく、計算自体は別のストリームでオフスクリーンバッファに実行されます。 メインストリームは、現在カウントされている画像を取得し、画面上に徐々に描画されるフラクタルの形で単に表示するか、ユーザーがマルチタッチジェスチャで移動およびスケーリングする場合、オフセットおよびスケーリングを表示します。



プログラムの本体は無限ループで、コマンドで装飾され、条件なしで<条件なしで描画されます。これは、描画されたフラクタル画像の表示方法に沿って、ユーザーのアクションを見越して継続的に循環する必要があるからです。



 moved = 0 > #.pan() '  moved = 1 x,y,s = #.pan(3) x -= (s-1)/2*w y -= (s-1)/2*h #.drawoff(x,y,s) <
      
      





このサイクルはオンになり、ユーザーがマルチタッチジェスチャを行うと機能します。 2行目のサイクルの操作条件は、マルチタッチ操作のインジケーターです。 4行目では、マルチタッチジェスチャのパラメーター(オフセット座標とスケール)を取得します。 次に、#.drawoff関数を使用して、画像が現在のオフセットとマルチタッチスケールに一致するように、描画されたフラクタルを含むオフスクリーンバッファーを表示します。 したがって、インタラクティブなフラクタルナビゲーションを取得します。



 ? moved '   sfs /= s sfx -= x*sfs/w sfy -= y*sfs/w again -> end redo = 1 .
      
      





ここでは、ユーザーがナビゲーションジェスチャを終了したときに条件がトリガーされます。 新しいフラクタルパラメーターが再計算されます:sfs scaleとsfx、sfy座標。 5行目では、フラクタルの計算が既に完了している場合、つまり変数endがゼロに等しくない場合、プログラムは再びラベルに移動してフラクタルの計算を再開します。 フラクタルがまだ考慮されている場合、変数redoを1に設定することにより、再計算のために送信されます。



 ? update & !redo '  update = 0 #.drawoff(0,0) .
      
      





この条件は、フラクタルが単に計算を続行し、表示するものがすでにある場合、つまり更新変数がゼロに等しくない場合に機能します。 3行目は、画面上のオフスクリーンバッファの内容を表示します。



 wn,hn = #.scrsize() ? wn!=w | hn!=h '   w = wn; h = hn again -> end redo = 1 .
      
      





この条件の目的は、画面サイズが変更されていないかどうかを判断することです-ユーザーはウィンドウを全画面に拡大し、ウィンドウのサイズを変更するか、タブレットを別の方向に回転させることができます-その後、新しいウィンドウの幅と高さの値wn、hnは古いw、hと一致しません



これが発生した場合、それは以前に行ったことに似ています。4行目のフラクタル計算でストリームを再起動するか、5行目で計算を再開する必要があることをこのストリームに通知します。



 draw()= :loop #.offon() '    #.scrclear(0,0,0) .redo = 0 sfx = .sfx; sfy = .sfy; fs = .sfs/.w > y, 1...h > x, 1...w fx = sfx + x*fs fy = sfy + y*fs #.drawpoint(x,y,color(fx,fy):3) < loop -> .redo .update = 1 < .end = 1 .
      
      





これがメインのフラクタル描画サイクルです。 3行目では、グラフィックコマンドのフローがオフスクリーンバッファーにリダイレクトされるため、インタラクティブナビゲーション中に現在のオフセットとスケールを考慮して、そこからフラクタルが表示されます。 この例からわかるように、グラフィックの操作は、SPLのマルチスレッド計算にとって安全です。



ここでの主な描画関数は#.drawpoint関数です。これは、色引数として、色関数から渡された3つの値を取ります。



さらに、グローバル変数.redoがゼロでない場合、ループラベルに移動して計算が新たに開始されることがわかります。



さらに、グローバル変数.updateの値を単一に設定すると、フラクタルに表示できるものがすでにあることをメインストリームに示します。



フラクタル計算が終了すると、グローバル変数.endの値は1に設定されます。 これを知って、フラクタルを再計算する必要がある場合、フラクタルを計算するフローを再開します。



 color(x,y)= zr = x; zi = y; n = 0 maxn = #.int(200*(1-#.log10(.sfs/4))) > zr*zr+zi*zi<4 & n<maxn zrn = zr*zr-zi*zi+x; zin = 2*zr*zi+y zr = zrn; zi = zin; n += 1 < ? n=maxn; <= 0,0,0; . <= #.hsv2rgb(n/maxn*360,1,1):3 .
      
      





これは、この例の最後の関数であり、最も重要なことを実行します-画面上の各ポイントでフラクタルの色を返します。 入力パラメーターx、yとして、カラー関数はフラクタル内のポイントの座標を受け入れます。



サイクルの次のステップは、マンデルブロフラクタルの計算です。関数の最後の2行では、得られたフラクタル計算に応じてポイントの色が返されます-フラクタルが設定限界maxnを超えていない場合は0、0、0、またはHSV色空間の色得られたフラクタル値で。



ここで、記事の歌詞部分は終了し、技術部分に進みます。 SPLのプログラムから独立したUWPアプリケーションを作成します。



実際、SPLインタープリターは最初に中間バイナリコードを生成し、それを既に実行しています。 これはすべて舞台裏で行われ、ユーザーはこの中間コード(CODファイル)の存在について手がかりさえも持たないかもしれません。 ただし、プログラムで適切なオプションを有効にすると、このCODファイルを表示してSPLからコピーできます。 次に、既製のVisual Studio 2017プロジェクトの形式で作成されたSPL SDKを使用し、このCODファイルをリソースとしてコピーします。







次に、最初の行にプログラムの名前を示します。 私たちの場合、これは「fractal.txt」です。 .cod CODファイル拡張子は不要です。







SPL SDK自体は単にCODファイルの「エグゼキューター」であり、起動時にSPLでプログラムを自動的に起動します。



一般に、それですべてです。 スタンドアロンUWPアプリケーションの準備ができました! これで、Windows 10上の任意のデバイスでコンパイルおよび実行できます。必要に応じて、このアプリケーションをMicrosoft Storeに送信できます。



SPLプログラミング言語は現在活発に開発されています。 SPL(Simple Programming Language)の目的は、趣味としてのアマチュアプログラミングです。 SPLは、私が個人的に発明および開発したプログラミング言語です。 また、「SPL」はWindows 10向けの私のアプリケーションであり、現在クローズドベータ段階にあります。 SPLプログラミング言語に興味があり、テストを通じてその開発に参加したいユーザー、およびそれらの提案は、 SPL言語のWebサイトに歓迎されています 。 ここには、SPLのドキュメントとその他の有用な情報があります。



プログラミングのすべての成功!



All Articles