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


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
1211
SADOUS【hspdx】es_ex系の命令で円を描画したい8解決


SADOUS

リンク

2014/12/11(Thu) 21:14:05|NO.66415

全く検討が付きません。
画像を素材にexcopy(拡縮)使うにしてもただ単に画像を大きくしても
素材のサイズが無駄に大きくなってしまう場合もあるし、
逆にサイズが足りなくなって円の輪郭がカクカクなってしまうかもしれない。

exboxfを利用する場合は・・・計算式というか仕組みが思いつかない。
つい最近三角比について習いましたが・・・関係有るのか。
とにかく全く思い浮かばない。





標準命令のcircleよろしくアンチエイリアス?は要らないですし
楕円を描写する予定はないです。
半径の指定・色の指定・半透明合成の有無→ブレンド率の指定ができるのが望みで
このスレにて完成したマクロやその他の成果物を公開することが最終目標(解決)です。

es_ex系で円を描画する方法を考えます。
円を描写する処理が思いつきません。他は自力で何とかなると思います。
ご協力おねがいします!



この記事に返信する


暇人

リンク

2014/12/13(Sat) 05:36:16|NO.66436

塗りつぶしだけで良いなら

#include "hspdx.as" //必ずhspdx.asの後に挿入 #module //「es_excircleを使用できるように初期化」(必ずes_screenの後に実行) //es_excircle_ini siz // siz : 円の基本サイズ(省略時512) [このサイズを基本に拡縮する] //使えるサイズは2の累乗で32〜1024までにしてる #deffunc es_excircle_ini int siz mref bmscr, 67 ebs=ESB_ONE,ESB_ONE,ESB_ONE,ESB_ALPHA,ESB_ALPHA,ESB_ADD,ESB_SHADOW,ESB_MULTIPLE,ESB_NEGATIVE id=ginfo(25) size=16 if siz=0 {_siz=512}else{_siz=siz} repeat 6 size<<1 if size>=_siz { break } loop buffer id,size,size boxf color 255,255,255 circle 0,0,size,size es_buffer 63,2,,,1 buffer id,1,1 gsel bmscr(18) return //「円描画」 //es_excircle px, py, sizxy, col // px : 円の中心X座標 // py : 円の中心Y座標 // sizxy: 円の半径 // col : 円の色($RRGGBB) //gmodeのp1が0だと円の外側の矩形も描画される //1以上で円だけ描画され //3,4で半透明、5で加算、6でシャドウ、7は無し //p4でアルファ値指定 #deffunc es_excircle int px,int py,int sizxy,int col pos px-sizxy, py-sizxy es_excopy 63,0,0,size,size,sizxy*2,sizxy*2,,,,ebs(bmscr(35)),bmscr(65),col return #global screen 0,800,600 es_ini es_screen 800,600,32,2,1,1 if stat : end es_excircle_ini 1024 *main stick ky,$1f if ky&$80 : goto *owari es_cls 0,128,128 gmode 2 es_excircle 100,100,200,$ff00 gmode 2 es_excircle 500,100,300,$ff gmode 5,,,200 es_excircle 500,400,400,$888800 gmode 4,,,128 mx=mousex-400 my=mousey-300 es_excircle 400,300,sqrt(mx*mx+my*my),$ff0000 es_sync await 16 goto *main *owari end



SADOUS

リンク

2014/12/13(Sat) 22:45:02|NO.66443

僕はなんて馬鹿なんだろう、わざわざ画像ファイルを用意しなくても
hspの標準のオフスクバッファに描いて使えばよかったんだ・・・
以前自前文字画像を表示するために作ったマクロと動きが似ていて20分くらいで
ある程度読み解けました;(それでもむっさ遅い)

#module#deffunc#globalの使い方に苦しんでいたのと、
var<<nなんて使い方知らなかったのでとても参考になります!
var<<nって・・・累乗みたいな動きをするのですが・・・実際にどんな計算が・・・
ググってもそれらしい文献をみつけられなくて。






分からない場所がもう二箇所ありまいsた。

mref bmscr, 67 ebs=ESB_ONE,ESB_ONE,ESB_ONE,ESB_ALPHA,ESB_ALPHA,ESB_ADD,ESB_SHADOW,ESB_MULTIPLE,ESB_NEGATIVE
bmscrという変数が現在のウィンドウ情報(BMSCR構造体)を返すものになっているみたいですが、
プログラム中でbmscr(n)といった形で呼び出されていて困惑しています。
配列変数になっているみたいだし、18,35,65といった数値は何を示しているのやら・・・

ebsのような中身をカンマで区切るデータの扱い方自体まったく分からないので
こちらも何を意味しているのか皆目見当がつきません。
いや、合成方法を示しているようではあるのですが・・・



SADOUS

リンク

2014/12/13(Sat) 22:55:52|NO.66444

あとひとつ、大した疑問ではないようですが
素材作成時に指定するサイズを2の累乗に置換する理由がわかりません。

2の累乗にするプログラムも綺麗で流石だなと感心させられますが、
変数?sizを直接sizeに渡してみてもなんら問題なく動作しました。
それともこうしないと動作が不安定になるのでしょうか...



kanahiron

リンク

2014/12/13(Sat) 23:09:44|NO.66445

暇人さんではないですが回答してみます

まずvar<<nですが、これはビットシフトを表します
2進数の話になりますが、0b0001=1、0b0010=2、0b0100=4(0bは2進数を表します)
と左に1つずれると表す数が倍になります (0b0110=4+2=6、0b1100=8+4=12です)
var<<nはvarを左方向にnbitずらすという意味です(ビットをずらす(シフト)のでビットシフト)
1ずらすと2倍、2ずらすと4倍になります
逆にvar>>nだと右方向にずれ、1/2倍、1/4倍、1/8倍…になります

次に

ebs=ESB_ONE,ESB_ONE,ESB_ONE,ESB_ALPHA,ESB_ALPHA,ESB_ADD,ESB_SHADOW,ESB_MULTIPLE,ESB_NEGATIVE
は変数ebsに配列で順番に代入しているだけです
文字じゃんと思うかもしれないですが、「hspdx.as」内で定義されたマクロになっています
具体的な数値はこれを実行してみてください

#include "hspdx.as" ebs=ESB_ONE,ESB_ONE,ESB_ONE,ESB_ALPHA,ESB_ALPHA,ESB_ADD,ESB_SHADOW,ESB_MULTIPLE,ESB_NEGATIVE repeat length(ebs) mes strf("eds(%d) %d",cnt,ebs(cnt)) loop
ebsが使われてるのは

es_excopy 63,0,0,size,size,sizxy*2,sizxy*2,,,,ebs(bmscr(35)),bmscr(65),col
です
ここで、配列変数ebsの要素はbmscr(35)となっています
bmscr()とはHSPのウィンドウ管理に使われるBMSCR構造体を指します
(具体的にはここで http://dream.freespace.jp/puma/iroiro/struct/bmscr3.htm)
bmscrの35番目の要素は「gmode gmode命令で指定した画面コピー時のモード」となっています
つまり、gmodeによる処理の切り替えを配列変数の要素を変えることで実現しています
es_excopyの11番目の引数はブレンドファクターの指定で、詳しくはhspdxのドキュメントをご覧ください



暇人

リンク

2014/12/13(Sat) 23:25:25|NO.66446

>ググってもそれらしい文献をみつけられなくて。
ビットシフトで調べれば分かると思う

>プログラム中でbmscr(n)といった形で呼び出されていて困惑しています。
↓のを参考にやってる
http://dream.freespace.jp/puma/iroiro/struct/bmscr3.htm

>ebsのような中身をカンマで区切るデータの扱い方自体まったく分からないので
配列にデータを順番に入れてるだけ
ebs(0)=ESB_ONE
ebs(1)=ESB_ONE
って書くより楽だし早い

>素材作成時に指定するサイズを2の累乗に置換する理由がわかりません。
これはDirectXと言うかハードウェア側の制限で
テクスチャに使うバッファは2の累乗じゃないと
自動でグラボ側が決めたサイズやモードになってしまう事がある



SADOUS

リンク

2014/12/13(Sat) 23:32:24|NO.66447

ビットシフトですか、なるほど。
2進数は計算がよくわからなくてほったらかしですが、感覚的には分かりました。
しかし以前にも同じようなこと質問した気がする。

hspのbmscr構造体のうちの35と65はgmodeの値だったんですね!
es_excopyの引数の場所をよく考えればわかったことだと思うとお恥ずかしい質問をしてしまったんだなと。



ただ、hspのbmscr構造体のリストを見てもピンと来ないのがbmscr(18)です。
現在の描写先ウィンドウIDが帰ってくるように見えますが
それでは暇人さんのソースの
buffer id,1,1
gsel bmscr(18)
が無意味になってしまいます。
実際にはこの部分の処理はどう動いているのでしょうか?



暇人

リンク

2014/12/14(Sun) 00:40:52|NO.66448

>現在の描写先ウィンドウIDが帰ってくるように見えますが
現在のじゃなくmref bmscr, 67した時に操作先になってるワインドウID
ウィンドウ毎にbmscrが有り操作先になってる時にmrefで配列として扱えるように出来る
一度配列としてしまえば以降他のウィンドウが操作先になってもmrefしたウィンドウ情報が読める

mref bmscr, 67 mes "id="+bmscr(18) buffer 1,1,1//ここで操作先がbufferになってしまうので(サイズ1にしてるのは一時的にしか使わないバッファ容量を縮小) gsel bmscr(18)//元のウィンドウに戻す mes "id="+bmscr(18)



SADOUS

リンク

2014/12/14(Sun) 01:57:05|NO.66449

>現在のじゃなくmref bmscr, 67した時に操作先になってるワインドウID
>ウィンドウ毎にbmscrが有り操作先になってる時にmrefで配列として扱えるように出来る
これでやっと・・・全部わかった気がします。


暇人さんkanahironさん、助かりました。
ありがとうございます!



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