コミュニティアイコン プチコン 非公式コミュニティ トピック

アバター
bはかせ ◆xuo9vR6wBkGC
2020/12/9 0:13
質問
画面から一部を切り出してスプライトとして扱いたい
画像のようなかんじで
sp1とsp2を画面に表示させ、
それを画面から切り出したものをsp3として個別に扱うような処理はできないでしょうか

spchrで画面上のuvwhを指定して切り出せないかなと考えていましたがディスプレイに表示したものとなるとどうしたものか

コメント

アバター
bはかせ 2020/12/9 0:17 ◆xuo9vR6wBkGC
多分ディスプレイ上をいじることはできない気がするので
どうにかしてグラフィックページとかにディスプレイの状態を再現する...?
アバター
さすらいの名無し 2020/12/9 7:44 ◆LWMA5UzCJb3e
過去に同じような質問をしたことがあったので、参考程度に
http://petitverse.hosiken.jp/community/petitcom/topic/?read=1555&ukey=1
アバター
こういち 2020/12/9 10:56 ◆.Id/aHiU36hu
拡大、縮小が必要ないならスプライトページにCOPYが簡単。
拡大、縮小が必要ならおちゃめさんのGPUTSPが使えそう。(速度は遅め)
http://ochameclub.web.fc2.com/petitcom3/lecture/grp.htm#7
回転まで必要なら…頑張って作ります。

DirectXなら一発なのにな…って思ってしまう自分がいる。(最近DirectXでプチコンを再現するのが流行ってるらしい)
アバター
あんちもん 2020/12/9 13:02 ◆8qCJSJ1bKTIQ
思いつきで組んだものですがどうでしょうか。ディスプレイに表示されているスプライト管理番号0と1の絵や位置をGRP0上に再現し、GRP0から切り出した画像で新たにスプライト2を作っています。
(こういちさんが初めに挙げてる方法かな)
アバター
あんちもん 2020/12/9 13:03 ◆8qCJSJ1bKTIQ
実行結果。画面中心に写っているのはスプライト0、1ではなくGRP0の画像です。
左上に写っているのがGRP0の画像から切り出して作ったスプライト2です。
アバター
Na 2020/12/9 17:33 ◆QoELVrBXBQCI
bはかせさんの説明を読んで、つまりsp1やsp2を動かしたら自動でsp3の絵も動くようにしたいということかと思いました。
なのでGRPにコピーする方法だと毎フレームコピーしなきゃいけないことになる気がします。

GRPにコピーしなくても、sp1とsp2の情報(SPCHRとかSPSCALEとか...)をsp4とsp5にコピーして、透明のsp3にSPLINKして表示すればいいと思います。
spの情報を読み取るだけならそんなに時間かからなさそうですし、これをSPFUNCで毎フレームやればよさそうです。

左がsp1とsp2、右がsp3,4,5です。
sp1,sp2やsp3を動かすと右のsp4,5も連動して動きます。
指定範囲(左の黄色い枠)外は非表示になります。
アバター
bはかせ 2020/12/9 20:58 ◆xuo9vR6wBkGC
たくさんの回答、ソースコードまで貼っていただいて有り難いです
質問では、sp1とsp2が合わさったsp3を一度つくることだけが目的でしたが
更にそれらをGRPを使わず連動させる処理まで...

それぞれ試してみてスマートな方法を見つけようと思います
アバター
こういち 2020/12/9 22:29 ◆.Id/aHiU36hu
回転とかのあるやつ。ARYOPで高速化できないかな…
パレット配列を使えば…
アバター
こういち 2020/12/13 22:37 ◆.Id/aHiU36hu
グローバルな空間に8*8の座標の変数を作って、回転の式を掛ける(8*8なのは、32単位でARYOPすると効率が良いから)
dim x[]=[0,1,2,3,4,5,6,7,0,1…]
dim y[]=[0,0,0,0,0,0,0,0,1,1,…]

これをARYORで回転させる。

問題は、はみ出た要素をどうするか…FILLとARYOPで端を透明で埋めて、CLIPでどうにか…
少々厄介だな…
計算量は端の処理にO(W+H)
回転にO(WH)
合計O(WH)
アバター
こういち 2020/12/13 22:45 ◆.Id/aHiU36hu
ただ、回転の式だとX,Yの拡大率が等しくないといけない。スプライトはX,Yの拡大率を独立に設定できる。
これは内積をつかうか…
(x方向のベクトル、y方向のベクトルを用意し、内積をとれば、x,yのベクトルに投影される)
アバター
こういち 2020/12/13 23:04 ◆.Id/aHiU36hu
とりあえずマスク処理
DIM MAP[(H+2)*(W+2)]
GLOAD 4,X-1,Y-1,W+2,H+2,MAP,0
DIM MASK[H+2]
FILL MASK,1,H,1 '0,1,1,1,…,1,0みたいな
FILL MAP,0,H+2,0 'W=0の列を0埋め
FILL MAP,(H+2)*(W+1),H+2,0
ARYOP 2,MAP,MAP,MASK

これO(WH)じゃね?
アバター
こういち 2020/12/17 15:21 ◆.Id/aHiU36hu
内積のやつ。少し厄介かもしれない。
変換時に逆行列求めないといけない。
ついでに原点とか考えるとさらにややこしくなる。
アバター
bはかせ 2020/12/17 23:35 ◆xuo9vR6wBkGC
とりあえず自分が困っていた処理に関しては、GCLIPで張り付ける方法で動かすことができました!

更に高度な処理のソースなども今後有益な情報なので助かります、ありがとうございます

コメントを書く

  • こちらは「プチコン3号」「プチコンBIG」など、プチコンシリーズに関する話題を扱ったコミュニティです
  • プチコンシリーズにまったく関係ない書き込みはご遠慮下さい。削除の対象となります
  • こちらにはその他のゲームや雑談のコミュニティはなく、作る予定もありません (ひとりで管理できないため)。ごめんなさい
  • ユーザー登録なしで書き込みができます
  • 秘密の合い言葉は成りすましの防止 (トリップ機能)、書き込みの編集時の本人認証に使用します
  • 秘密の合い言葉に他人に推測されやすい言葉、他サービスと同じパスワードは入力しないでください。
  • 書き込むと、投稿時に入力したお名前と秘密の暗号が記憶され、ログイン状態になります

- WEB PATIO -