• ベストアンサー

DirectX8でのスプライトの切り抜き表示

DirectX8で、スプライトを任意の形で切り抜いて表示させたいのですが、どうすればよいのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • aho0xff
  • ベストアンサー率12% (218/1772)
回答No.3

とと・・・なるほど・・・なら再々度回答します。 とはいえ、私個人細かい定義を語るのはちょっと苦手でウソをついている場合もあります。 そこは気をつけてください。すいません。大体こんな感じであると分かっていただければ・・・ Lock() はサーフェスやテクスチャの画像の実データを編集する為に必要なメソッドのことです。 一度ロックすると画像の実データが直接編集可能になります。データは超アバウトにいえば *.bmp ファイルをヘッダを抜いてバイナリで開いた感じで格納されています。 32Bitデータなら画像左上のドットから右にα(場合によっては未使用)8Bit R 8Bit G 8Bit B 8Bit で繰り返され、一列終わったら下の列にまた左から右にαRGB・・・の順で格納されているはずです。 で、編集し終わったら UnLock() で終了させます。 データを直接いじることが可能になるメソッドなので用途は広いハズなのですが、このロックは 非常に重いメソッドです。特にビデオメモリにあるデータをロックしようとすると、パフォーマンスが 一気に落ちてしまう可能性があります。特にアクション性の高いゲームで毎ループやれる処理 ではないです。なので、No2で >あまりリアルタイムにやるのでなければロックして一回で済ませてしまった方がいい と書いています。リアルタイムで複数のスプライトを、毎ループやる場合は完全に別の方法を考えた方がいいです。 まあ、ゲームの種類や、状況にもよるとは思いますが・・・・ と・・ここまで来て思ったのですが・・・単にヌキ色を指定するだけなら「カラーキー」だけで大丈夫です。 もしかして私が難しい方に考えすぎているかも知れません。参考URLに「カラーキー」のことも書いているので それで十分だったら、私のほうのミスです。すいません。 補足に関しては、まあテクスチャでも同じようなことは出来るといえば出来ます。 後は状況やその他もろもろに左右されるんで、ココから先はがんばってくださいとしか・・・・・

参考URL:
http://www.c3.club.kyutech.ac.jp/~sukiyaki/index.php?%A5%AB%A5%E9%A1%BC%C8%B4%A4%AD
tomonori7
質問者

お礼

ありがとうございます。 度々すいませんが、テクスチャーをLockしようとしたのですが、出来なかったので、サーフェスとカラーキーを使ったやり方を詳しく教えて頂けないでしょうか。

その他の回答 (2)

  • aho0xff
  • ベストアンサー率12% (218/1772)
回答No.2

No1です。さすがに簡単に書きすぎましたか。すいません。 では、再度回答します。 仮に64*64の一枚の画像がスプライトがあったとして、それを星の形でくりぬきたいとします。 用意する物は白黒で書いた64*64の星の画像です。星の内側を白とし、外側を黒にします。 まず一つは両方を普通にロードした後、両方の画像をロックして1ドットずつ元画像を変えていきます。 白黒の方が黒なら、元画像の同じドットをヌキ色に変更、白ならそのまま。 それを全ドットに対して行ってください。 もう一つ、コレは後で思ったのですが、星画像を元画像にカラーキーを変えて表示させるだけでも いけますね。星の形に切り抜きたい場合、星画像の白をカラーキーとして元画像の上に表示 そうすると元画像の星型の周りが黒になるはずなので、それからカラーキーを黒に戻して通常画像を表示。 コレはサーフェスなら・・・の話ですけどね。 うーん・・・DirectX8となると、スプライトはテクスチャになるのかな?私個人は画像をロックして加工 してしまう派なので、ロックなしでテクスチャにマスク処理となると、今の時点ではパッとは出てこないですね。 基本はカラーキーの話と一緒の気もしますが・・・あまりリアルタイムにやるのでなければロックして 一回で済ませてしまった方がいいと思います。 コレでどうでしょう?ダメですかね??

tomonori7
質問者

お礼

ありがとうございます。 物凄く基本的な事なのですが、ロックして1ドットずつ元画像を変えていくというのは、どの様にすれば良いのでしょうか。 度々すいません。

tomonori7
質問者

補足

元の画像からピースの形に切り抜いてジグソーパズルを作ろうとしているのですが、その場合サーフェスを使ったやり方のほうが良いのでしょうか。 ちなみに表示はLPDIRECT3DTEXTURE8を使っています。

  • aho0xff
  • ベストアンサー率12% (218/1772)
回答No.1

マスク処理・・・で言い方あってるかな??で、いいと思います。 簡単に書けば、切り抜きたい元画像と同じサイズの切り抜いた後の形を書いた物を 白黒画像で用意して両方を1ドットずつ掛け算していけばいけます。 そこから先は工夫次第かと・・・・

tomonori7
質問者

補足

ありがとうございます。 やはりマスク処理ですか。 具体的にはどのようにすればよいのでしょうか?

関連するQ&A

  • DIRECTXのスプライト描画で質問です

    いつもお世話になってます。 DIRECTX9.0、VC++6.0を使っています。 DIRECTXでLPDIRECT3DTEXTURE9(テクスチャ)とLPD3DXSPRITE(スプライト)を使って描画しています。 ですが、テクスチャの縦と横のサイズが256*256を超えたものが正常に表示できません。 色々調べてみると、縦と横のピクセル数が2の乗数以外の中途半端なサイズのテクスチャは、キリの良いサイズに変換されるみたいですが、一応縦横共に2の乗数のテクスチャなのにうまく表示できません。 例:768*512ピクセルのTGA形式のファイル 大きな画像ファイルを表示する方法はないでしょうか? どうぞ宜しくお願いします。

  • DirectXでのスプライトの開始(終了)宣言に関して質問があります

    DirectXでのスプライトの開始(終了)宣言に関して質問があります スプライトを使用する場合 sprite->Begin(0); スプライトA描画 スプライトB描画 スプライトC描画 sprite->End(); といった感じで囲うと、ある本に書いてあったのですが これって sprite->Begin(0); スプライトA描画 sprite->End(); sprite->Begin(0); スプライトB描画 sprite->End(); sprite->Begin(0); スプライトC描画 sprite->End(); と記載しても問題ないでしょうか?(動作負荷的な問題で) 負荷が変わらないなら、後者の書き方で書こうかと思っているので・・・

  • スプライト

    スプライト こんにちは 「スプライト」と「ジンジャエール」は違うのですか? 教えてください。 よろしくお願いいたします。

  • スプライト、好きですか?

    スプライト、好きですか? 1.好き 2.好きではない 僕は、1の「好き」です。 皆さんはスプライト、好きですか?

  • スプライトの人形

    先日おもちゃ屋で見かけた8種類のフィギア(各3500円)で、スプライトと表示してあったものなのですが、一体なんなのでしょうか??おまけ?それとも、スプライトのマスコット??

  • DirectXのスプライト機能で3D回転

    http://oshiete1.goo.ne.jp/qa4484924.html 前回この質問をした者です。 疑問を整理して、もう一度質問させて貰います。 DirectX9.0cのスプライト機能で、X軸やY軸の回転のような3Dの変換は可能でしょうか? また前回での回答して頂いた事について一つ。 sprite->Begin(D3DXSPRITE_OBJECTSPACE)というフラグを指定した所、確かに3Dの回転を実現できました。 しかし今度はテクスチャの画像が表示されなくなり、白いポリゴンが表示されるようになってしまいました。これを解決する方法をご存じの方、どうかご教示下さい。 あるいはD3DXSPRITE_OBJECTSPACEを使ったサンプルソースなどが掲載されたHPや書籍をご存じでしたら、紹介して頂きたく思います。

  • ボタンでスプライトを動かす方法

    ボタン1をクリックしたらスプライト1が動き、 ボタン2をクリックしたらスプライト2が動くようなFlashを作るには どうしたらいいですか? スプライトの動きとしては画面端から現れて中央で止まるというものです。 ボタン1をクリックしスプライト1を動かしたあとに ボタン2をクリックしたら表示されているスプライト1が消えて スプライト2が現れるような動きをしたいです。 使っているのはフリーソフトのSuzukaです。 なにか良い方法がありましたら教えてください。 お願いします。

  • スプライト

    今、コカコーラの自販機にスプライトって置いてますか?

  • DirectXの文字表示について(int型をLPCTSTR型に変換した

    DirectXの文字表示について(int型をLPCTSTR型に変換したい) ある本を読みDirectXでのスプライトを使用しての文字表示をプログラムに組み込みました。 ですが、そこで文字表示に使われている関数の引数の型がLPCTSTR型なのですが、 プログラム内の変動的な数値を表示するためにはint型も同時に表示したいです 文章だと分かりにくいので例を書きます <プログラム> int point=100; 文字表示の関数(point + "ポイントです"); <実際の画面上の表示> 100ポイントです というようにしたいのですが、どなたかご教授お願いします

  • DirectX テクスチャの拡大

    こんばんは。最近DirectXを始めたばかりの初心者です。 開発環境はWindows XP + Visual Studio 2005です。 テクスチャを読み込んでスプライトで表示しているのですが、 拡大・縮小をする場合に指定した位置に行かずずれて表示されてしまいます。 色々なサンプルを見てもよくわかりません。 方法をご回答頂けると嬉しいです。

専門家に質問してみよう