Hatena::Groupnadesiko

雪乃☆雫のなでしこ日和

2016-03-06

選択肢の怪

| 01:55

 選択肢表示状態の時、何故か一部分だけ、マウスを認識せず、選択肢の色が変わらず、クリックしても次へ飛ばない部分があったり、逆に勝手に選択されてしまうなどの怪現象があり、これは当初、動的に作成した部品を壊すとエラーが出まくるために、壊さないで済ましていたことが原因で、新たに覚えた「VCL_FREE」のまじない追加したら直った! と思っていたのですが、なんかやっぱりおかしな時がある・・・?

 行き詰まった時には、現場に戻……ではなくて、初心に立ち返り、問題点を明確にすることが必要です。

 と、いうわけで――

 一体どーゆう現象かというと、以下のようなサンプルシナリオを実行すると、

#,選択肢の怪を確認するサンプルシナリオ
#,--------------------------------------------------------
#, ビジュアルノベル風
#,--------------------------------------------------------
$,テキストウィンドウサイズ,640,120
$,テキストウィンドウ表示位置,0,360
$,テキストウィンドウ半透明,0,0,640,120,50
$,テキストウィンドウ色,$000077
$,メッセージ書式,MS ゴシック|20|太字,$FFFFFF,$000000,3
$,メッセージ表示位置,15,15
$,メッセージ速度,10
$,行,0
$,ブリンク表示,600,445,300
$,選択肢表示位置固定,オン
$,選択肢表示,15,375,600,0
#,--------------------------------------------------------

!,背景,北竜.jpg
!,立ち絵ロード,立ち絵.bmp
!,立ち絵オン,,70
!,テキストウィンドウオン

!,選択肢,2
 -,1234567890,A
 -,1234567890,B

 *,A
 Aへとんだよ

 *,B
 Bへとんだよ

#,注:はてなでは、「-」や「*」が特別なヘッダーみたいで表示が変になっちゃうから頭に半角スペースを入れてるけど、実際には行頭。

 こういう画面になります。

f:id:snowdrops89:20160306162422j:image

 ここまでは、正しい。

 さて、これは選択肢なんで、マウスカーソルを合わせると、上の「1~0」のように反転し、クリックするとラベルに飛ぶわけ。

 ところが、どーゆうわけか、「4、5」の辺りだけ、マウスを認識しないんだよね。

 色も変わらないし、クリックしても反応しない

 それ以外の場所では問題なく反転もするし、ジャンプもするとゆう、まさに謎の怪現象なんだよ!

 まあ、こに目をつぶれば、ふつーに動作はするのだけど、だから、どってこと無い些細な問題と言えばそうなんだけど、一度気になったからには、どうしても気になるっ。

 ナゾ解明しないことには、気持ち悪い。

 この選択肢は、初期の頃に試行錯誤しながら作った無理矢理感満載のマウスオーバーボタンのまま流用しているから、違いが無いとも言い切れないけど、他のやつでまで問題が出たことはないんだよね。

 マウスオーバーボタンは、こんな感じ。

#--------------------------------------------------------------
# マウスオーバーボタン
#--------------------------------------------------------------

#-----母艦設計--------------------------------------------------
!母艦設計=「母艦の可視はオフ母艦のタイトルは「マウスオーバーボタン母艦を$FFFFFFで画面クリア母艦のスタイルは「枠固定」
母艦オフに最大化ボタン有効変更。
母艦のクライアント幅は640。母艦のクライアント高さは480。
母艦中央移動
母艦の可視はオン。
#--------------------------------------------------------------

#-----ボタン準備------------------------------------------------
ボタン幅とは整数=600。
ボタン高さとは整数=40。
ボタン位置Xとは整数=20。
ボタン位置Yとは整数=50。
ボタン隔とは整数=20。
ボタン数とは整数=6
文字書体は「MS ゴシック|14|標準」。

裏画面とはイメージの可視はオフの幅はボタン幅*2。の高さはボタン高さ*ボタン数

#なんか画像を用意すればかっこいいんだけど、とりあえずボタンの画像を書いている。
#左側が通常時のボタンで、右側がマウスオーバー時のボタンとなる。
(ボタン数)
  塗り色は$AAAAAA
  裏画面の0,(回数-1)*ボタン高さからボタン幅,回数*ボタン高さへ四角。
  裏画面の25,(回数-1)*ボタン高さ+10へ「マウスオーバーボタン{回数}」を文字描画塗り色は$FFAAAA
  裏画面のボタン幅,(回数-1)*ボタン高さからボタン幅*2,回数*ボタン高さへ四角。
  裏画面のボタン幅+25,(回数-1)*ボタン高さ+10へ「マウスオーバーボタン{回数}」を文字描画。
#--------------------------------------------------------------

#-----ボタンを設定----------------------------------------------
選択肢とは配列。 #0ボタン表示位置X、1ボタン表示位置Y、2ボタン幅、3ボタン高さ
(ボタン数)
  選択肢¥回数,0はボタン位置X
  選択肢¥回数,1はボタン位置Y+(回数-1)*(ボタン高さ+ボタン隔)
  選択肢¥回数,2はボタン幅
  選択肢¥回数,3はボタン高さ
#--------------------------------------------------------------

#-----ボタンを描画------------------------------------------------------
裏画面の0,0を選択肢で母艦へマウスオーバーボタン表示
#-----------------------------------------------------------------------

#----マウス入力待ち----------------------------------------------
母艦マウス移動した時は~
  裏画面の選択肢を母艦へマウスインアウト反映。

母艦のマウス押した時は~
  もし、前選択ボタン=0でなければ
    「ボタン{前選択ボタン}をクリック」と言う
#--------------------------------------------------------------

#--------------------------------------------------------------
●マウスオーバーボタン表示({グループ=?}OBJ1のX,YをAで{グループ=?}OBJ2へ)
  A\0,0=X。A\0,1=Y
  (Aの要素数-1)
    OBJ1のX,Y+(回数-1)*(A¥回数,3),(A¥回数,2),(A¥回数,3)をOBJ2の(A¥回数,0),(A¥回数,1)へ画像部分コピー。

●マウスインアウト反映({グループ=?}OBJ1のAを{グループ=?}OBJ2へ)
  (Aの要素数-1)
    もし、((OBJ2→マウスX)>(A¥回数,0))かつ
      ((OBJ2→マウスX)<(A¥回数,0)+(A¥回数,2))かつ
      ((OBJ2→マウスY)>(A¥回数,1))かつ
      ((OBJ2→マウスY)<(A¥回数,1)+(A¥回数,3))ならば
        選択ボタン回数。
    違えばもし、(回数=Aの要素数)かつ(選択ボタン=0)ならば
      選択ボタンは0。
    ここまで

  もし、前選択ボタン<>選択ボタンならば
    もし、前選択ボタン>0ならば
      OBJ1の(A\0,0),(A\0,1)+(前選択ボタン-1)*(A¥(前選択ボタン),3),(A¥(前選択ボタン),2),(A¥(前選択ボタン),3)をOBJ2の(A¥(前選択ボタン),0),(A¥(前選択ボタン),1)へ画像部分コピー。
    もし、選択ボタン>0ならば
      OBJ1の(A\0,0)+(A¥(選択ボタン),2),(A\0,1)+(選択ボタン-1)*(A¥(選択ボタン),3),(A¥(選択ボタン),2),(A¥(選択ボタン),3)をOBJ2の(A¥(選択ボタン),0),(A¥(選択ボタン),1)へ画像部分コピー。
  前選択ボタン=選択ボタン
  選択ボタン=0
  描画処理反映
#--------------------------------------------------------------

 要するに、左側に通常時のボタン画像、右側にマウスオーバー時のボタン画像を並べた裏画面を用意して、配列に指定したボタン設定に基づいて画像部分コピーしてるんだよね。

 いちおう、ノベルの選択肢に合わせて、ボタンの幅を長~くしてみて色々ためしたけど、このサンプルプログラムではマウスの認識に問題のある箇所は見当たらなかった。

 というとはやっぱり、なこノベルの方に問題があるんだー><

 選択肢として表示したものをコピーして、都度ボタン化したりしていて、確かにこのサンプルとは少し変わっている部分もあるんだけど、それにしても肝心の、マウスの出入りは、「マウス移動した時~」の座標を単純に取って、「ボタン表示位置X、ボタン表示位置Y、ボタン幅、ボタン高さ」から、ボタンの中にマウスが入ったかどうかを判断しているだけで、どう考えても、ボタンの中の一部分にだけ抜けが生じるようなものには思えないんだけど・・・むむむ。

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20160306

2016-02-21

スピンエディタって・・・

| 02:02

 突然ですが、サイコロです。

 遊んでいたら、件の「→壊す」の問題で、エラーが出てしまうことが分かったので、「VCL_FREE」に直した。

 ついでに、微妙にレイアウトを変更し、胴元のセリフを増やしたりなどして、ゲームっぽさをUPさせてみたりしているw

 それでもって表題だけど、スピンエディタって、▼▲を押して変化する値って、1以外に変更出来ないんですかねえ?

 できれば、例えば10ずつ増減させたりするようにしたかったんだけど・・・

 エディタボタンを組み合わせて、自力で実現するしかないのかな? むむむ。

 でっ、ノベルはどうなったのかと言えば・・・

 ものすごく些細なことっぽいことに引っかかって、はまっている。

 何故か、選択肢の時に、マウスを認識しない場所があるんだよね;

 クイズや、サイコロでも使っている、マウスオーバーボタン関数を流用してるだけなのに、おっかしいなあ(@_@)

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20160221

2016-02-13

ノベル用関数の修正

| 21:12

 ノベルテキスト描画は、んなには変わってないけど、それまで関数内で決め打ちだった文字色、影色、文字と影との距離を引数で指定出来るようにした。

 引数を増やした結果(?)引数の省略が出来なくなってしまった。省略しようとすると「引数『X』が不足しています。」と言われてしまうよ! 省略してるのはこじゃないんだが。どうゆうことかよくわからん。

 でも、まあ、プログラム中で全部きっちり指定するつもりだから、別にいいけどね。

 ところでこれまで、文字の高さを(「あ」の文字高さ取得)としていたんだけど、影を大きく取ると重なったり、特に選択肢の時のネガポジが良くないので、(「あ」の文字高さ取得+メッセージ影)に直した。

 文字書体関数内で決め打ちしていたのをやめて、外で指定されている値をのまま使用することにした。

●ノベルテキスト描画({グループ=?}OBJのX,Yへ{数値=$FFFFFF}表示色,{数値=$000000}影色,{数値=2}影,{数値=200}速度でSを)
	XXは整数。
  もし、速度=0ならば
    文字色は影色。
    OBJのX+影,Y+影へSを文字描画。
    文字色表示色。
    OBJのX,YへSを文字描画。
    描画処理反映
     
  違えば、
    XX=X
    (Sの文字数
      Sの回数から1文字抜き出す。

      もしそれ=「{CHR(10)}」ならば
        X=XX
        Y=Y+(それ文字高さ取得+メッセージ影)
        続ける

      文字色は影色。
      OBJのX+影,Y+影へそれ文字描画。
      文字色表示色。
      OBJのX,Yへそれ文字描画。
      描画処理反映
      (速度/1000)秒待つ。
   
      X=X+(それ文字幅取得


 キャラ合成は、立ち絵を背景に重ねるためのもの。

 なでしこの画像合成の不具合が直ったかどうかは試してないけど、とにかく画像合成の場合、左上のドットの色を取得して透過色として扱うことになっていましたが、指定したカラーを透過色として扱うようにしています。

 して、透明度を指定して、サウンドノベルの立ち絵っぽい表示ができるようにした。

●キャラ合成({グループ=?}コピー元を{数値=$00FF00}透過色,{数値=100}透明度で{グループ=?}コピー先のX,Yへ)
	キャラ透過用をイメージとして作成。キャラ透過用の可視はオフ。
	# コピー元を保存
	キャラ透過用の画像はコピー元→名前
	
	# マスクの作成(キャラの透過部分が白、表示部分が黒の画像)
	マスク画像をイメージとして作成。マスク画像の可視はオフ。
	マスク画像の画像はコピー元→名前
	マスク画像を透過色で画像マスク作成
	
	# 背景と立ち絵を半透明合成したものをキャラ画像とする
	# 背景の方を半透明合成しているので、透明度の値を逆にしている。
	# キャラ透過用に背景を重ねたいがどういうわけかエラーになる
 	コピー先をコピー元のX,Yへ(100-透明度)で画像半透明コピー

	キャラ画像をイメージとして作成。キャラ画像の可視はオフ。
	キャラ画像の画像はコピー元→名前

  # コピー元を元に戻す
	キャラ透過用をコピー元の0,0へ画像コピー。
	
	# キャラの透過色部分を黒に変換
	# はじめからキャラの透過色を黒にすると髪や目や文字に黒が使用出来なくなる
	# また、先にマスクを作ってあるので背景と半透明合成したキャラ画像も使える
	マスク画像を画像ネガポジ
	マスク画像をキャラ画像の0,0へ画像ANDコピー
	マスク画像を画像ネガポジ

	# 合成実行
	マスク画像をコピー先のX,Yへ画像ANDコピー		#背景にマスクを重ねる
	キャラ画像をコピー先のX,Yへ画像ORコピー			#背景にキャラを重ねる

	VCL_FREE(マスク画像)
	VCL_FREE(キャラ画像)
	VCL_FREE(キャラ透過用)

 以前の、「→壊す」でエラー出まくる件は、いまだに直っていないみたいなんだけど、のかわりに「VCL_FREE」とゆうまじないを覚えた!



 テキストウィンドウ合成は、矩形指定した範囲は半透明にし、それ以外のところは指定した透過色を透過し、普通に合成するもの。

 全体的には、画像部分透過コピーとかいういまいち分かりづらかった関数名を改めただけですが;

 キャラ合成を使っているので、キャラ合成とセットです。

●テキストウィンドウ合成({グループ=?}コピー元のX,Y,W,Hを{数値=$00FF00}透過色,{数値=50}透明度で{グループ=?}コピー先のX2,Y2へ)
  透過処理用をイメージとして作成。透過処理用の可視はオフ。
  透過処理用の幅はW。透過処理用の高さはH。

  # 半透明にしたい部分を透過処理用に移す
  コピー元のX,Y,W,Hを透過処理用の0,0へ画像部分コピー

  # コピー元の半透明にしたい部分以外をコピー先へ合成
  塗り色は透過色。線色は透過色。線太さは0。
  コピー元のX,YからX+W,Y+Hへ四角。
  コピー元を透過色,100でコピー先のX2,Y2へキャラ合成。
  
  # 半透明にしたい部分を透過コピー
  透過処理用をコピー先のX+X2,Y+Y2へ透明度で画像半透明コピー

  # コピー元を元に戻す
  透過処理用をコピー元のX,Yへ画像コピーVCL_FREE(透過処理用)

 キャラ合成の方の「透過色,透明度」は省略しても動くのに、テキストウィンドウ合成の方は、エラーになってしまうんだよね。なんでだ(?_?)

 そういえば、キャラ合成と書式を合わせたんだけど、以前画像部分透過コピーだったときには、({グループ=?}コピー元のX,Y,W,Hを{数値=$00FF00}透過色で{グループ=?}コピー先のX2,Y2へ{数値=50}透明度で)という感じに、透過色と透明度が分かれていて、の時は透過色の省略が出来てたような気がする。

 まだまだいろいろと深遠な謎が多いね。

 省略しないからいいんだけどさ。

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20160213

2016-01-17

トランジョンの実験

| 23:45

 トランジョンとゆうのは画像と画像(動画も)を切り替える際に、何らかのエフェクトをかけてつなぎ合わせる処理のことで、スライドショーとか動画編集ソフトとか見ると、多彩なトランジョンが実装されていますけど、無能なワタシには、どーいう仕掛けになっているのかさっぱりわからないのであります

 でも、なでしこにはもともと、いろいろ便利な画像処理関数が実装されているので、助かりますね。

 前に作ってみた時のまんまで、大して良いとも思えないけど、とりあえず、あると無いとではゲームっぽさが全然違う♪

母艦のクライアント幅は640。母艦のクライアント高さは480。
母艦の可視はオン。

裏画面とはイメージの可視はオフの幅は母艦のクライアント幅。の高さは母艦のクライアント高さ。
の画像は「背景1.jpg」
	
裏画面保持用とはイメージの可視はオフの幅は母艦のクライアント幅。の高さは母艦のクライアント高さ。
の画像は「背景2.jpg」

トランジョン用とはイメージの可視はオフの幅は母艦のクライアント幅。の高さは母艦のクライアント高さ。


表画面とはイメージの可視はオン。
表画面について
	幅は母艦のクライアント幅。高さは母艦のクライアント高さ。
	Xは0。Yは0。画像は「背景2.jpg」
	マウス押した時は~
		フェードイン
		#縦スリット
		#横スリット
		#ブラック
		#モザイク

*フェードイン
	25
  	裏画面保持用を表画面の0,0へ画像コピー
		裏画面を表画面の0,0へ回数*4で画像半透明コピー描画処理反映
		0.01秒待つ
	
*縦スリット
	20
  	コピー幅=回数
    32
      裏画面の20*(回数-1),0,コピー幅,母艦のクライアント高さを表画面の20*(回数-1),0へ画像部分コピー。
    描画処理反映
    0.02秒待つ

*横スリット
	15
    コピー幅=回数
    32
      裏画面の0,15*(回数-1),母艦のクライアント幅,コピー幅を表画面の0,15*(回数-1)へ画像部分コピー。
    描画処理反映
    0.03秒待つ

*ブラック
    トランジョン用の0,0から母艦のクライアント幅,母艦のクライアント幅へ四角。
    25
      裏画面保持用を表画面の0,0へ画像コピー
      トランジョン用を表画面の0,0へ回数*4で画像半透明コピー。
      描画処理反映
      0.01秒待つ
    25
      トランジョン用を表画面の0,0へ画像コピー
      裏画面を表画面の0,0へ回数*4で画像半透明コピー。
      描画処理反映
      0.01秒待つ

*モザイク
    表画面をトランジョン用の0,0へ画像コピー。
    50
      トランジョン用を表画面の0,0へ画像コピー。
      表画面に回数画像モザイク。
  	  描画処理反映
  	  0.01秒待つ
  	50
      裏画面を表画面の0,0へ画像コピー。
  	  表画面に50-回数画像モザイク。
  	  描画処理反映
  	  0.01秒待つ

・背景1

f:id:snowdrops89:20160117232938j:image

・背景2

f:id:snowdrops89:20160117232937j:image

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20160117

2016-01-10

とりあえずシナリオの仕様の変更から

| 19:41

 なでしこで作るんだから、シナリオは、なでしこで直接書くよりはるかに、ずっと、ものすごく簡便に書けなかったら意味ないよね!

 というわけで――

①ただの文字列は全部、普通のメッセージとして扱い、行末に『。』『」』『?』『!』があれば自動的に改行、行頭に「/」(半角スラッシュ)で改ページとする。

改行コードのみで、中身のない行は飛ばす。(従ってメッセージ内に白行を入れたい場合は、行頭にスペースを入れる)

 ……という感じにした。

 これで、とりあえず文章だけをどんどん表示していくなら、簡単なはず♪

③シナリオファイルが二次元配列CSVなのは変わってないので、メッセージ内に「,」(半角カンマ)は使用不可。基本的にメッセージは全角に統一する方向にしたい。

④二次元配列の0列目が「#」の行をコメント行、「!」をコマンド、「*」をラベル、「-」を選択肢として扱う。(全て半角のみ)

⑤1列目を実際の命令として動作を振り分け、2列目以降はファイル名とかジャンプ先のラベルとかパラメーターとか。

 結局、0列目の扱いを変えて、メッセージの記載が簡単になっただけで、あんまり変わってないですかね;;;

 ともあれ、例えば、背景の表示は、

!,背景,背景画像ファイル名,トランジョン番号

 みたいな。

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20160110