- ベストアンサー
DirectX8でのスプライトの切り抜き表示
DirectX8で、スプライトを任意の形で切り抜いて表示させたいのですが、どうすればよいのでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
とと・・・なるほど・・・なら再々度回答します。 とはいえ、私個人細かい定義を語るのはちょっと苦手でウソをついている場合もあります。 そこは気をつけてください。すいません。大体こんな感じであると分かっていただければ・・・ Lock() はサーフェスやテクスチャの画像の実データを編集する為に必要なメソッドのことです。 一度ロックすると画像の実データが直接編集可能になります。データは超アバウトにいえば *.bmp ファイルをヘッダを抜いてバイナリで開いた感じで格納されています。 32Bitデータなら画像左上のドットから右にα(場合によっては未使用)8Bit R 8Bit G 8Bit B 8Bit で繰り返され、一列終わったら下の列にまた左から右にαRGB・・・の順で格納されているはずです。 で、編集し終わったら UnLock() で終了させます。 データを直接いじることが可能になるメソッドなので用途は広いハズなのですが、このロックは 非常に重いメソッドです。特にビデオメモリにあるデータをロックしようとすると、パフォーマンスが 一気に落ちてしまう可能性があります。特にアクション性の高いゲームで毎ループやれる処理 ではないです。なので、No2で >あまりリアルタイムにやるのでなければロックして一回で済ませてしまった方がいい と書いています。リアルタイムで複数のスプライトを、毎ループやる場合は完全に別の方法を考えた方がいいです。 まあ、ゲームの種類や、状況にもよるとは思いますが・・・・ と・・ここまで来て思ったのですが・・・単にヌキ色を指定するだけなら「カラーキー」だけで大丈夫です。 もしかして私が難しい方に考えすぎているかも知れません。参考URLに「カラーキー」のことも書いているので それで十分だったら、私のほうのミスです。すいません。 補足に関しては、まあテクスチャでも同じようなことは出来るといえば出来ます。 後は状況やその他もろもろに左右されるんで、ココから先はがんばってくださいとしか・・・・・
その他の回答 (2)
- aho0xff
- ベストアンサー率12% (218/1771)
No1です。さすがに簡単に書きすぎましたか。すいません。 では、再度回答します。 仮に64*64の一枚の画像がスプライトがあったとして、それを星の形でくりぬきたいとします。 用意する物は白黒で書いた64*64の星の画像です。星の内側を白とし、外側を黒にします。 まず一つは両方を普通にロードした後、両方の画像をロックして1ドットずつ元画像を変えていきます。 白黒の方が黒なら、元画像の同じドットをヌキ色に変更、白ならそのまま。 それを全ドットに対して行ってください。 もう一つ、コレは後で思ったのですが、星画像を元画像にカラーキーを変えて表示させるだけでも いけますね。星の形に切り抜きたい場合、星画像の白をカラーキーとして元画像の上に表示 そうすると元画像の星型の周りが黒になるはずなので、それからカラーキーを黒に戻して通常画像を表示。 コレはサーフェスなら・・・の話ですけどね。 うーん・・・DirectX8となると、スプライトはテクスチャになるのかな?私個人は画像をロックして加工 してしまう派なので、ロックなしでテクスチャにマスク処理となると、今の時点ではパッとは出てこないですね。 基本はカラーキーの話と一緒の気もしますが・・・あまりリアルタイムにやるのでなければロックして 一回で済ませてしまった方がいいと思います。 コレでどうでしょう?ダメですかね??
お礼
ありがとうございます。 物凄く基本的な事なのですが、ロックして1ドットずつ元画像を変えていくというのは、どの様にすれば良いのでしょうか。 度々すいません。
補足
元の画像からピースの形に切り抜いてジグソーパズルを作ろうとしているのですが、その場合サーフェスを使ったやり方のほうが良いのでしょうか。 ちなみに表示はLPDIRECT3DTEXTURE8を使っています。
- aho0xff
- ベストアンサー率12% (218/1771)
マスク処理・・・で言い方あってるかな??で、いいと思います。 簡単に書けば、切り抜きたい元画像と同じサイズの切り抜いた後の形を書いた物を 白黒画像で用意して両方を1ドットずつ掛け算していけばいけます。 そこから先は工夫次第かと・・・・
補足
ありがとうございます。 やはりマスク処理ですか。 具体的にはどのようにすればよいのでしょうか?
お礼
ありがとうございます。 度々すいませんが、テクスチャーをLockしようとしたのですが、出来なかったので、サーフェスとカラーキーを使ったやり方を詳しく教えて頂けないでしょうか。