Hatena::Groupnadesiko

雪乃☆雫のなでしこ日和

2009-04-08

画像合成は落とし穴だったよ!

| 21:57

【せんせい】

 のお題は、背景との重ね合わせです。

 前のサイコロは、背景も白いままでしたから問題ありませんでしたが、サイコロの角を丸めているため、このままでは背景に色をつけるとサイコロの四隅に白い地がついたままで表示されてしまいます。

 のため、不要な部分を透過して、背景と重ね合わせるという処理が必要になります。これは、ゲームのプログラムの基本中の基本ってところです。

 ちなみになでしこには、標準で画像合成の命令が入っていますから、それを使えば簡単です。


【でし】

 でも、うまくいかなかったんですよね?

【せんせい】

 ぶっちゃけ、のとおりです(哀)

 うまく透過しないので、またどこか文法が違っているかといろいろ試したんですがダメで、埒が明かないので背景がべたの場合のみ使えるチート(つまり透過したい部分を背景色で塗りつぶす)でお茶を濁そうかとも思ったのですが、の矢先に黒で透過が成功! もちろん、サイコロの目も一緒に透過されてしまったわけですが(汗)

【でし】

 文法は合っていたことが分かったんですね?

【せんせい】

 ーなんです。

 わかったのは、左上の1ドットが黒であった場合にのみ、画像合成の機能が発動するということです。

 というわけで、こうなりましたよ。

#-----母艦設計------------------------------------------------
!母艦設計=「母艦の可視はオフ母艦のタイトルは「ちょぼいち」
母艦のWは640。母艦のHは480。
母艦のスタイルは「枠固定」
母艦オフに最大化ボタン有効変更。
母艦中央移動
母艦の可視はオン。
#-------------------------------------------------------------

#-----宣言----------------------------------------------------
ダイスサイズとは整数。ダイスサイズ=100
半径とは整数。半径=10

元手とは整数。元手=100
所持金とは整数。所持金=元手
賭け金とは整数。賭け金=0
配当とは整数。配当=4

裏画面とはイメージの可視はオフのWはダイスサイズ*6。のHはダイスサイズ。

処理用とはイメージの可視はオフのWはダイスサイズ。のHはダイスサイズ。

表画面とはイメージの可視はオンのWは母艦のW。のHは母艦のH。
のXは0。のYは0。
#-------------------------------------------------------------

#-----メインルーチン------------------------------------------
もし、「サイコロ.png」が存在するならば
  裏画面の画像は「サイコロ.png違えば
  サイコロ準備
所持金>0の
  サイコロ振る
  賭ける

#-------------------------------------------------------------

#-----サイコロを振る------------------------------------------
*サイコロ振る
    r=6の乱数
    x=r*ダイスサイズ。y=0。
    x2=母艦のW/4-ダイスサイズ/2。y2=母艦のH/2-ダイスサイズ/2-30。
  裏画面のx,y,ダイスサイズ,ダイスサイズを処理用の0,0へ画像部分コピー。
  表画面を$008800で画面クリア。
#-------------------------------------------------------------

#-----数当て--------------------------------------------------
*賭ける
  「いくら賭ける?(1~{所持金})」と尋ねる。
  賭け金=それ
  もし、(それ<1)または(それ)または(それ>所持金)ならば
    賭ける。
  違えば
    答える
*答える
    「1~6のど~れだ?」と尋ねるもし、(それ<1)または(それ)または(それ>6)ならば
      答える
    もし(r+1=それならば
      所持金=所持金+賭け金*配当
      処理用を表画面のx2,y2へ画像合成。
      文字色白色文字サイズは48。
      表画面の302,103へ「当たり!」を文字描画。
      文字色赤色文字サイズは48。
      表画面の300,100へ「当たり!」を文字描画。
    終了確認。

    違えば
      所持金=所持金-賭け金
      処理用を表画面のx2,y2へ画像合成。
      文字色白色文字サイズは48。
    表画面の302,103へ「ハズレ!」を文字描画。
      文字色青色文字サイズは48。
    表画面の300,100へ「ハズレ!」を文字描画。
    終了確認。

*終了確認
    文字色黒色文字サイズは26。
    表画面の330,250へ「残金は{所持金}文」を文字描画描画処理反映。
    1秒待つもし、所持金=0ならば
    「破産しました」と言う。
     終わり。
  違えば
      「続ける?」と二択。
          もしそれはいならば
            戻る
          もしそれいいえならば
            m=所持金-元手
            もし、m>0ならば
            「{所持金-元手}文儲かった!」と言う。
          もし、m<0ならば
            「{元手-所持金}文すっちゃった;」と言う。
          もし、m=0ならば
            「トントンか・・・」と言う。
            終わり。

#-------------------------------------------------------------


#-----サイコロ画像の準備--------------------------------------
*サイコロ準備
  裏画面を$000000で画面クリア。
    数を0から5まで繰り返す。
    もし、数=0ならば                #1のサイコロ
      線色は$000001。塗り色は$FFFFFF        #地の色は白
      外枠。                    #ダイスの外枠
      線色は$FF0000。塗り色は$FF0000        #目の色は赤
      半径=15。                 #大き目
      中点。
    
    もし、数=1ならば                #2のサイコロ
      線色は$000001。塗り色は$FFFFFF
      外枠。
      線色は$000001。塗り色は$000001
      半径=10。
      左上点。右下点。
    
    もし、数=2ならば                #3のサイコロ
      線色は$000001。塗り色は$FFFFFF
      外枠。
      線色は$000001。塗り色は$000001
      半径=10。
      中点。左上点。右下点。
    
    もし、数=3ならば                #4のサイコロ
      線色は$000001。塗り色は$FFFFFF
      外枠。
      線色は$000001。塗り色は$000001
      半径=10。
      左上点。左下点。右上点。右下点。
    
    もし、数=4ならば                #5のサイコロ
      線色は$000001。塗り色は$FFFFFF
      外枠。
      線色は$000001。塗り色は$000001
      半径=10。
      中点。左上点。左下点。右上点。右下点。
    
    もし、数=5ならば                #6のサイコロ
      線色は$000001。塗り色は$FFFFFF
      外枠。
      線色は$000001。塗り色は$000001
      半径=9。
      左上点。左下点。右上点。右下点。左中点。右中点。

*外枠
  x=数*ダイスサイズ。y=0。
  x2=x+ダイスサイズ。y2=ダイスサイズ。
  裏画面のx,yからx2,y2へ30,30で角丸四角。

*中点
  xx=(x+ダイスサイズ/2)-半径。yy=ダイスサイズ/2-半径
  xx2=(x+ダイスサイズ/2)+半径。yy2=ダイスサイズ/2+半径。
  裏画面のxx,yyからxx2,yy2へ。

*左上点
  xx=(x+ダイスサイズ/4)-半径。yy=ダイスサイズ/4-半径
  xx2=(x+ダイスサイズ/4)+半径。yy2=ダイスサイズ/4+半径。
  裏画面のxx,yyからxx2,yy2へ。

*左下点
  xx=(x+ダイスサイズ/4)-半径。yy=(ダイスサイズ/4)*3-半径
  xx2=(x+ダイスサイズ/4)+半径。yy2=(ダイスサイズ/4)*3+半径。
  裏画面のxx,yyからxx2,yy2へ。

*右上点
  xx=(x+ダイスサイズ/4*3)-半径。yy=ダイスサイズ/4-半径
  xx2=(x+ダイスサイズ/4*3)+半径。yy2=ダイスサイズ/4+半径。
  裏画面のxx,yyからxx2,yy2へ。

*右下点
  xx=(x+ダイスサイズ/4*3)-半径。yy=(ダイスサイズ/4)*3-半径
  xx2=(x+ダイスサイズ/4*3)+半径。yy2=(ダイスサイズ/4)*3+半径。
  裏画面のxx,yyからxx2,yy2へ。

*左中点
  xx=(x+ダイスサイズ/4)-半径。yy=ダイスサイズ/2-半径
  xx2=(x+ダイスサイズ/4)+半径。yy2=ダイスサイズ/2+半径。
  裏画面のxx,yyからxx2,yy2へ。

*右中点
  xx=(x+ダイスサイズ/4*3)-半径。yy=ダイスサイズ/2-半径
  xx2=(x+ダイスサイズ/4*3)+半径。yy2=ダイスサイズ/2+半径。
  裏画面のxx,yyからxx2,yy2へ。

#-------------------------------------------------------------

【せんせい】

 あ、あとまで画像はみんな母艦コピーして表示してましたけど、母艦じゃダメみたいです。というわけで、表画面というイメージ部品を用意して、こへ画像合成を行いました。

【でし】

 $000001って(汗) これも思いっきりチート臭いですよ?

【せんせい】

 人の目には黒に見えますから問題なし!

【でし】

 でも、黒って髪とか目とか文字とかで多用するから、不便ですよね?

【せんせい】

 普通は、固定値を透過色とする場合も、あんまり使いそうも無い$00FF00とか$FF00FFを使うんですけれどね・・・と思ったら、これはどうやらなでしこの不具合のようです。

ここの情報と、正しい避方法が載っていました。すばらしい。

http://www.himanavi.net/cgi/nade-1st/cbbs.cgi?mode=one&number=4114&type=4111&space=15&no=0

 っていうか、この命令の意味が、まだ理解できない(汗)

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