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

アバター
bはかせ ◆xuo9vR6wBkGC
2020/9/24 17:22
質問
文字をスプライトとして扱いたい
現在、入力した文字をアニメーションさせるDEFを作ろうとしているのですが、入力した文字(列)をスプライトとして扱う方法はないでしょうか?

追記
環境はプチコン4です

コメント

アバター
bはかせ 2020/9/24 17:25 ◆xuo9vR6wBkGC
TANIMを使えばテキストスクリーン上の文字をアニメーションさせることはできるのですが、スクリーン全体で扱われるので文字毎に個別の動きをさせることができないのが歯がゆいです
アバター
SatoshiMcCloud 2020/9/24 18:46 ◆Z1qfV11i63Jr
素直にやるなら、まずグラフィックページに適当な空白を用意します。そこにGPUTCHARを使って、表示したい文字列を書き込みます。
そのあとスプライトを生成し、先ほどのグラフィックページの文字を書き込んだ範囲をスプライトのUVWHに指定してあげます。
4ではスプライトごとに参照グラフィックページを選択できるので、このやり方で大体なんとかなります。3号はちょっとグラフィックページの余裕がなくなる可能性あるかも?
アバター
bはかせ 2020/9/24 19:55 ◆xuo9vR6wBkGC
そんなことが...!!
試してみます。
アバター
bはかせ 2020/9/24 22:54 ◆xuo9vR6wBkGC
その方法でしたいことはできたのですが、
スプライトがグラフィック画面の状態とリンクしているようで、GCLSなどして文字を消すとスプライトも透明になってしまい、SPDEFで定義などしてみても同じでした。

定義したスプライトの状態を保存することはこの方法ではできないのですかね?
アバター
bはかせ 2020/9/25 1:00 ◆xuo9vR6wBkGC
とりあえず、GPUTCHRは画面から見えないところに隠しておくことにしました
トピックは開けたままにしますので、
何かいい方法があれば書きこんでくださいませ
アバター
キルル2 2020/9/25 1:59 ◆rGE712Ruejv7
スプライトなのだから消すのはgclsではなくspclrでは?
スプライトのアニメーション情報を保持するならspstop、sphideを使うと出来ます(多分)
アバター
SatoshiMcCloud 2020/9/25 8:14 ◆Z1qfV11i63Jr
gclsが必要ということは、そのグラフィックページを1枚まるごと別の何かに使ってるのだと推察しました。
であれば、そのページとGPUTCHARのページを別にしたらいいかと思います。
具体的な例を言うと、gclsしたいページが0ページなら、GPUTCHARするページを1ページとします。スプライトは1ページを参照するようにSPPAGE命令で指定します。
アバター
bはかせ 2020/9/25 11:58 ◆xuo9vR6wBkGC
GCLSとか書いたのは、このDEFを作って他のプログラムに組み込むつもりだったので、もしそのプログラムでGCLSを使った時にアニメーション文字まで消えてしまうのが気に入らなかったからです。字足らずでした

どれにせよ、グラフィックページの文字は残しておく必要がありそうなので、このDEF専用のグラフィックページを作ることにします。
アバター
bはかせ 2020/9/25 12:05 ◆xuo9vR6wBkGC
spstopは使うとアニメーションの状態が消えて素のスプライトに戻ってしまうので、上手く使えなさそうです...
sphideはなんかアニメーションに使えそうでビビっときました
アバター
SatoshiMcCloud 2020/9/25 13:34 ◆Z1qfV11i63Jr
この問題は、あらゆるオブジェクトにプログラムのどこからでもアクセスできるSmileBASICの設計に起因するものです。
この問題はグラフィックページだけではありません。例えば、DEFでスプライトを生成したとして、プログラムの他の箇所で同じスプライトIDにSPCLRしてしまう可能性は十分にあります。
この場合、プログラムの書き方ルールやテクニックで乗り切るのがセオリーです。
例えば、今回作ろうとしているDEFで、関数側がグラフィックのどこを使うのか決めるのではなく、関数を呼び出す側で指定するように設計してはどうでしょう?
DEF StrAnimSpr string$,u,v,w,h
という風に引数を作ってあげるのです。
アバター
bはかせ 2020/9/25 16:15 ◆xuo9vR6wBkGC
なるほど呼び出す時に指定...
アバター
しんいち 2020/9/25 21:01 ◆lHy.hAWXbthn
1文字1スプライトでの例(フォントは16):

DEF SPUTCHR(X,Y,S,C)
VAR P=SPPAGE(),F=16,L=LEN(S)
DIM D%[L]
VAR U,V,I,N
SPPAGE #GRPF
FOR I=0TO L-1
FONTINFO S[I],F OUT U,V
N=SPSET(U,V,F,F,0,0)
SPOFS N,X,Y
SPCOLOR N,C
SPSHOW N
D%[I]=N
X=X+F
NEXT
SPPAGE P
RETURN D%
END

#GRPFを直接SPPAGEにしているので、別途このDEF用にGRP領域を確保する必要はない。そのかわりスプライト枚数はたくさん使う。
アバター
bはかせ 2020/9/25 23:06 ◆xuo9vR6wBkGC
すごい...
自分の今の思考では組めないプログラムでした、参考にさせていただきます
アバター
bはかせ 2020/9/26 1:16 ◆xuo9vR6wBkGC
今の時点でとりあえず動くようになったので公開しました。
アバター
ツララ 2020/9/27 8:18 ◆ArUdBYOYME1V
文字列としまとめて動かしたいのなら
しんいちさんのサンプルにSPLINKまで組み込んでみたらいいんじゃないんです?
アバター
bはかせ 2020/9/27 10:39 ◆xuo9vR6wBkGC
確かに一文字ずつ動かしやすく、sprinkを使えばまとめて動かすこともできるのでこの処理のほうが色んな面白い動きさせられそうなんですよね
結構今のプログラムから書き換える必要がありそうなので、しんいちさんのソースを参考にしたバージョン違いのものを作ろうかなと考えています。

コメントを書く

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

- WEB PATIO -