プチコンBIG専用 簡易地球儀 for BIG

初出公開日 2016年12月17日
【3号動作不可】【BIG専用】 プチコン3号では動作しません

 これはスライドパッドでぐりぐり回転できる簡易的な地球儀プログラムです。
 プチコンBIGの高解像度画面専用となっているためプチコン3号では動作しません。プチコン3号を使用の人はプチコン3号用のQSP「簡易地球儀QSP」を使ってください。

《 メニュー 》



実行画面スクリーンショット




 ※クリックで拡大


プログラムリスト、公開キー



《 プログラムリスト 》
OPTION STRICT
BGMPLAY 24
VAR U=512,V=512,G%[0]
VAR P,Q,R=64,A,B,G,I,J,K,M,Y
GPAGE 0,0
LOAD"GRP0:WORLD_MAP",0
GSAVE 0,0,U,V,G%,0
ACLS
XON WIIU
XSCREEN 5,6
WIDTH 16,16

WHILE B-768
 B=BUTTON()AND 1023
 IF B THEN GPAGE G,0:GCLS:GPAGE G,1:GCLS:R=R*!B+B
 G=!G
 GPAGE G,!G
 M=MILLISEC
 STICK OUT P,Q
 I=I-P*32+U*32
 FOR J=-R+.5 TO R-.5
  A=SQR(R*R-J*J)>>0
  Y=ATAN(A,J)*V/PI()MOD U
  FOR K=-A TO A
   GPSET 427-K,240-J,G%[Y*U+(ATAN(SQR(A*A-K*K),K)*U/2/PI()+I)MOD U]
  NEXT
 NEXT
 KLS
 ?"簡易地球儀 for BIG"
 ?"R=";R
 ?MILLISEC-M;"msec
WEND
ACLS:BGMSTOP

公開キー【 MKA3N3KF 】、プロジェクトフォルダ名「OCHAME_GLOBE」(ファイル名「OCHA_GLOBE」)


使用方法



 回転速度はスライドパットで微調整できます。(左右回転のみに対応)
 デフォルトでは半径64ドットの地球儀ですが、動作中にボタンを押すと「押しているボタン情報」によってサイズを任意に変えることができます。Aボタンならば半径16ドット、Bボタンならば半径32ドット、Xボタンならば半径64ドット、Yボタンならば半径128ドットに変更できます。(ボタンを同時押しした場合にはその合計値となる)
 なお、Lボタン+Rボタンの同時押しで終了できます。

 ちなみに表示サイズを大きくすればするほど処理は重くなります。
デフォサイズ(R=64)ではプチコン3号ではNew 3DSでも9fps程度の速度でしたが、プチコンBIGでは30fps以上で動作します。そんな高速なBIGでさえR=192(動作時にXボタン+Yボタン)だと4fps弱の速度しか出ません。

 実はこのプログラムはテクスチャサイズは自由に変えることができます。
 デフォルトでは512x512のテクスチャになっていますが、変数U(横方向のサイズ)、V(縦方向のサイズ)の設定値を変えることで様々な大きさのテクスチャに対応できます。
 U=320:V=240に設定して読み込むファイル名をフォルダに同梱の "KIRBY" に変更すると可愛いピンクの球体をぐりぐり回転が可能になります。
 要するに球体に自由なテクスチャを貼り付けて回転できるプログラムなので地球儀だけではなくいろいろなテクスチャ画像を作りスライドパッドで回転させて楽しんでください。


プログラムの仕組み・改造点



 このプログラムの仕組みをごく簡単に説明するとあらかじめ用意された世界地図のテクスチャ画像(512x512pixel)を球面に貼り付けているだけです。テクスチャ画像を普通に貼り付けるだけだと512x512の画像を変形する必要があり(262144回のループが必要)すごく重くなるし、場合によっては画像に隙間が出来てしまいます。そのため私はオリジナルの方法(といってもごくシンプルな方法であり誰でも考えつきそうなもの)で解決を行っています。
 その方法とは画面表示するドットがテクスチャのどのピクセルを参照しているかを緯度、経度を計算して求めるというものです。この方法ならば画面上のドット数のループ回数(R=64ならば12844回)で済むという速度面のメリットがあるだけではなく隙間が絶対に空かないというメリットもあります。この方法は基本的にGRP2軸回転プログラムの高速画像回転処理と根本部分は同じです。

 Y=ATAN(A,J)*V/PI()MOD Uで世界地図における緯度(正しくはテクスチャ画像におけるY座標)を求めています。同じく(ATAN(SQR(A*A-K*K),K)*U/2/PI()+I)MOD Uで世界地図における経度(正しくはテクスチャ画像におけるX座標)を求めています。あらかじめ配列に世界地図のGRPのデータを入れておいているためX座標とY座標が分かればその配列から情報を読み出してGPSETするだけで解決できます。配列に入れておかなくてもGSPOITで読み出せば良いのですが、激遅の配列変数よりもGSPOITの方が少し遅いためこれによって少し高速化が可能になります。
 プチコン3号版の方はQSPに収めるため多少遅くなりますが、GSPOITで読み出しています。

 とはいえ、この方法が最速というわけではなくまだ様々な高速化の方法があります。1ドットずつGPSETするのではなく配列に入れてGLOADするという方法があります。配列に入れるならばうまくARYOPを使えば演算はかなり高速化が可能になります。
 限界まで高速化しようと思ったらあらかじめ少しずつ回転した状態のものを配列に入れておいてその配列をスプライトのGRPへとGLOADして「スプライトで地球儀を表示する」という方法もあります。この方法ならば演算処理は事実上ゼロになりスプライトで表示するため画面表示も桁違いに速くなります。その反面メモリ消費量が極めて大きくなるし実行前に演算処理をすべて終わらすため開始前処理に時間がかかるという問題があります。Miiverseにおいてしんいちさんがこの改造を行っているのでそのプログラムを参考にしてみてください。(該当プログラムのトピックスへのリンク)


RETURN (プチコン3号/BIGプログラムのページにもどる) RETURN *MAIN (トップページにもどる)

inserted by FC2 system