HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
0807
coinゲーム中の目パチ等アニメーションの改善5解決


coin

リンク

2008/8/7(Thu) 11:29:04|NO.17949

 ADVゲームで、目パチや口パク、画面効果などのアニメーションがありますが、それを実践し
たく思い、以下のように書いてみました。
 文字表示中やクリック待ち中にwaitの数をカウントし、そのカウントの数を用いて先にdefineで
どのような表示を行うか定めておく、という方法です。

以下サンプル。

screen 0,640,480
buffer 1,640,480*3 pos 0,0:color 255,50,50:boxf 0,0,640,480 pos 0,480:color 50,50,255:boxf 0,480,640,480*2 pos 0,480*2:color 0,0,0:boxf 0,480*2,640,480*3:color 50,50,50:circle 0,480*2,300,480*2+300,1 #define RB pos 0,0:gmode 0:if (count\200=0)|(count\200=1)|(count\200=2):gcopy 1,0,480,640,480:else:gcopy 1,0,0,640,480 #define light if (count\40=0)|(count\40=1)|(count\40=2):pos 0,0:gmode 5,,,150+rnd(105):gcopy 1,0,480*2,640,480 #module //画像表示のフラグが立っている物をチェック、redraw 0のまま描画 #deffunc check if r_b@=1:RB@ if raito@=1:light@ return //文字表示命令 #deffunc tx str p1 message=p1 gsel 0 color 255,255,255 left=0 repeat strlen(message)/2 redraw 0 repeat spd@ stick click if click!0:break redraw 0 check//ここで描画 pos 60,350:mes strmid(message,0,left*2) redraw 1 wait 2 count+ loop if click!0:break pos 60,350:mes strmid(message,0,left*2) left+ redraw 1 loop stick click while(click==0) stick click redraw 0 check//ここで描画 pos 60,350 mes message redraw 1 wait 2 count+ wend return #global spd=3 r_b=1 raito=1 tx "あいうえおかきくけこさしすせそなにぬねの" tx "はひふへほまみむめもやいゆえよらりるれろ" raito=0 tx "わおん"

 このようなことになりました。背景が赤と青に変わるのが目パチ風、gmode5で円を加算して
いるのが画面効果風、のつもりです。画像(効果)を重ねる順番は、「check」命令で「if ?=1:画面表示」
としているものを、奥に置きたい順に書くことで指定できます。

 で、問題はこの「check」なのです。この↑方式だと、毎回すべての画面表示のフラグをチェックしなければ
ならなくなり(この例だと二つしか画面表示パターンが出ていませんが、実際ゲームを作るとなったらとんでも
なく多くなってしまいます)、スマートではないなあ…と悩んでいます。
 一々全部をチェックするのではなくて、呼び出した?指定した?画像表示パターンだけを表示してくれる
ようになればいいのですが、どうにもここから先に進めず。
 何か、よりよい方法は無いものでしょうか…。



この記事に返信する


ANTARES

リンク

2008/8/7(Thu) 20:30:47|NO.17974

「if r_b@=1」や「if raito@=1」のチェックのことを言っているのですよね?
 速度を問題にしているのなら解決法はないと思われます。
 スクリプト入力の手間やスクリプト量を問題にしているのなら、
フラグを配列にすることによって解決します。



coin

リンク

2008/8/8(Fri) 10:08:39|NO.17986

 ANTARESさん、ご返信ありがとうございます。
 はい、速度のことが心配で…やはりこれは毎回全部チェックする以外にはないですよね…。
 ifのチェックのどのくらい入れたらどのくらい遅くなるのかを確認しながら、パターン数と
折り合いを付けていくことにします。

 ところで、速度のことばかり気にして、スクリプトの量について考えていませんでした;
フラグを配列に、って、どのようにすればいいものでしょうか?
 A.0をフラグ1、A.1をフラグ2、A.2をフラグ3、とフラグだけを一つの変数にまとめる…
とかしか思いつかず;



ANTARES

リンク

2008/8/8(Fri) 20:45:27|NO.18003

> ifのチェックのどのくらい入れたらどのくらい遅くなるのかを確認しながら
 何百とか何千とかにならなければあまり気にする必要はないような
気がします。

> A.0をフラグ1、A.1をフラグ2、A.2をフラグ3、とフラグだけを
>一つの変数にまとめる…とかしか思いつかず;
 そういうことです。

repeat procNum if flg.cnt: func(cnt, ……) loop
 すべてのシーンですべてのフラグをチェックするのは無駄なので、
シーンの初期化で、配列に使用する処理コード(procNo)を入れとくとか。

repeat procNumInTheScene if procList.cnt<10 { on procList.cnt gosub *l_0, *l_1, …… } else: if procList.cnt<20 { on procList.cnt-10 gosub *l_10, *l_11, …… } else: if procList.cnt<30 { on procList.cnt-20 gosub *l_20, *l_21, …… ;以下略 loop



ANTARES

リンク

2008/8/8(Fri) 20:59:19|NO.18004

 速度を最優先で考えるなら、スクリプト量など気にせず、
シーンごとの専用ルーチンを書くことです。

 RPGでもアニメができるかもしれないくらいなので、
ADVのアニメくらいじゃ速度はほとんど問題になりません。
究極的にスクリプトを一般化するなら、アニメ範囲の座標、gmode、
使用する画像ファイル名・使用位置・パターン数等をデータとしてもち、
1つの処理ルーチンですべて処理できるようにすることです。
どうしても、汎用ルーチンじゃ嫌だというとこだけ
特別な処理コードを割り当てます。



coin

リンク

2008/8/11(Mon) 17:07:58|NO.18054

 お返事遅くなりましてすみません、すごく勉強になります!

 自分で「配列変数にフラグを〜」と書いていたときには、どういう効果があるとも思えなかったの
ですが、実際に拝見させていただくと、すごく感銘を頂きました。
 「repeat procNumInTheScene」の方では、変数の配列一つ一つを最初から一つ一つの画面表示パタ
ーンに対応させるのではなく、必要な数だけ必要なものを前の配列から詰め込んでいく、という物
ですよね。そのシーンで使うパターンを毎回指定しなければならないのは大変ではありますが、こ
の方法ならすごく省エネできるんですね…。今までonを使ったことが無かったのですが、すごく有用に
用いられるものなんですね…。

 速度も気になるけれども毎回専用ルーチンというのは面倒くさい、という中途半端な心境です;
人にモジュールなどとして使っていただくようになったら、すごく一般化しなければと思いますが、
 今のところは自分だけが使うので、微妙な一般化に留めておこうと思います。一つのパターンで複数の
画像を使うときなど、細かいことはやはりdefineで決めると痒いところまで手が届きそう、という
腹積もりもありつつ。
 ADVでのアニメくらいならそこまで速度を気にすることは無い、というお言葉はとても力強いです…!

 もっと色々試行してみます、お答えくださいましてありがとうございました!



ONION software Copyright 1997-2023(c) All rights reserved.