サイズを綺麗に描画したいのですが(サイズの範囲(rightとbottom)が微妙にずれている)どうしたら描画できるでしょうか?

このQ&Aのポイント
  • サイズを綺麗に描画する方法について相談です。サイズの範囲(rightとbottom)が微妙にずれている場合、どうすれば描画できるでしょうか?
  • サイズの範囲(rightとbottom)が微妙にずれている場合、描画を綺麗に行う方法について質問です。
  • 描画する際にサイズの範囲(rightとbottom)が微妙にずれている場合、どのように対処すれば綺麗に描画できるのか教えてください。
回答を見る
  • ベストアンサー

描画について

サイズを綺麗に描画したいのですが(サイズの範囲(rightとbottom)が微妙にずれている)どうしたら描画できるでしょうか? ここら辺かな?と思うところを載せます。 HRESULT ReadBMP(ID3DXSprite** g_pSprite,LPCTSTR lpszFilename,DDXTEX* g_pTexture) { HRESULT hr = S_FALSE; UINT uLevel = 0; IDirect3DSurface9* pSurface = NULL; lstrcpy(g_pTexture->m_Filename,lpszFilename); g_pTexture->m_clrAlpha=g_colorKey; g_pTexture->m_pTexture=NULL; // スプライト情報の生成 if (SUCCEEDED(hr)) hr = ::D3DXCreateSprite(g_pd3dDevice, g_pSprite); if (SUCCEEDED(hr)) hr = ::D3DXCreateTextureFromFileEx(g_pd3dDevice, g_pTexture->m_Filename, 680, 460, 1, D3DUSAGE_RENDERTARGET, D3DFMT_UNKNOWN, D3DPOOL_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, g_pTexture->m_clrAlpha, NULL, NULL, &g_pTexture->m_pTexture); if (SUCCEEDED(hr)) hr = g_pTexture->m_pTexture->GetSurfaceLevel(uLevel, &pSurface); // サーフェイス取得 if (SUCCEEDED(hr)) hr = pSurface->GetDesc(&g_sSurfaceInfo); if (pSurface != NULL) pSurface->Release(); pSurface = NULL; // 失敗したら破棄 if (FAILED(hr)) DestroySplite(*g_pSprite,g_pTexture); return hr; } よろしくお願いします。

  • 79562
  • お礼率68% (164/239)

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

  • ベストアンサー
回答No.2

 こんにちは。御礼頂きました。  タイトルバーの事です(赤い枠内)。

79562
質問者

お礼

回答ありがとうございます。わかりました。 あのまた質問なのですが、また描画されなくなりました。今度は別の方法で描画しようとしたのですが。できません。ソースはこれです。 問題と思われるところを載せます。 / レンダリング・テクスチャのフォーマット選択 static HRESULT SelectRenderTexterFormat(UINT adapter,D3DDEVTYPE device,D3DDISPLAYMODE dmode) { const D3DFORMAT c_fmtRenderTexter[]={ D3DFMT_X8R8G8B8, D3DFMT_X1R5G5B5, D3DFMT_R5G6B5 }; HRESULT hr=E_FAIL; g_fmtRenderTexterWnd=D3DFMT_UNKNOWN; for(int i=0;i<sizeof(c_fmtRenderTexter)/sizeof(c_fmtRenderTexter[0]);i++) { hr=g_pD3D->CheckDeviceFormat(adapter,device, dmode.Format,D3DUSAGE_RENDERTARGET,D3DRTYPE_TEXTURE,c_fmtRenderTexter[i]); if(SUCCEEDED(hr)) { if(FMT_DEPTHSTENCIL != D3DFMT_UNKNOWN) { hr=g_pD3D->CheckDepthStencilMatch(adapter,device, dmode.Format,c_fmtRenderTexter[i],FMT_DEPTHSTENCIL); if(FAILED(hr)) continue; } g_fmtRenderTexterWnd=c_fmtRenderTexter[i]; break; } } if(FAILED(hr)) return DXTRACE_ERR_MSGBOX(_T("SelectRenderTexterFormat Window"),hr); g_fmtRenderTexterFull=D3DFMT_UNKNOWN; for(int i=0;i<sizeof(c_fmtRenderTexter)/sizeof(c_fmtRenderTexter[0]);i++) { hr=g_pD3D->CheckDeviceFormat(adapter,device, g_D3DPPFull.BackBufferFormat,D3DUSAGE_RENDERTARGET,D3DRTYPE_TEXTURE,c_fmtRenderTexter[i]); if(SUCCEEDED(hr)) { if(FMT_DEPTHSTENCIL != D3DFMT_UNKNOWN) { hr=g_pD3D->CheckDepthStencilMatch(adapter,device, g_D3DPPFull.BackBufferFormat,c_fmtRenderTexter[i],FMT_DEPTHSTENCIL); if(FAILED(hr)) continue; } g_fmtRenderTexterFull=c_fmtRenderTexter[i]; break; } } if(FAILED(hr)) return DXTRACE_ERR_MSGBOX(_T("SelectRenderTexterFormat Full"),hr); return S_OK; } ご教授よろしくお願いします。

その他の回答 (1)

回答No.1

 こんにちは。  スケーリングがオカシイのかも知れません。  質問に乗せている以外の部分に成りますが、以前に御拝借したソース内で、  //ウィンドウサイズにスプライトの大きさをあわせる  となっている部分に  GetWindowRect()  が使用されていますが、此れだとキャプションバー等も含めてしまう為、サイズが微妙に膨らんでしまいます。  GetClientRect()  に変更して見て下さい。

79562
質問者

お礼

回答ありがとうございます。無事に処理することができました。それとキャプションバーとはなんなのでしょうか?

関連するQ&A

  • 描画について

    今DirectXでゲームを作ろうとしてるものですが、描画しようと思い打ったのですが位置が思い通りにならない(描画が範囲を下回っている)描画されなくて困っています。ソースはこれです。 HRESULT Render(void) { g_pD3DDevice->Clear(0, NULL,NULL, D3DCOLOR_XRGB(0, 255, 255), 1.0f, 0); // シーンの描画開始 if (SUCCEEDED(g_pD3DDevice->BeginScene())) { // スプライトの描画開始(アルファ・ブレンディング有効&デバイス状態を保存も復元もしない) pSprite->Begin(D3DXSPRITE_ALPHABLEND | D3DXSPRITE_DONOTSAVESTATE); // シーンの描画(2D画像の描画) RECT SrcRect = { 0,0,640,480 }; // テクスチャ内でスプライトに使う範囲(0,0)-(512,64) D3DXVECTOR3 Center(320,240,0); // スプライト内の中心の位置(256,32,0) D3DXVECTOR3 Position(320,240,0); // スプライトを表示する位置(0,0,0)+(320,240,0) static int alpha=0; pSprite->Draw(pTexture.m_texture, // スプライトに使うテクスチャ &SrcRect, // 描画範囲 &Center, // スプライト内の中心の位置 &Position, // スプライトを表示する位置 D3DCOLOR_ARGB(alpha>255?511-alpha:alpha,255,255,255)); //alpha++; alpha &= 0x1FF; //pTexture.m_colorKey); // スプライトの描画終了 pSprite->End(); // シーンの描画終了 g_pD3DDevice->EndScene(); } // シーンの表示 return g_pD3DDevice->Present(NULL, NULL, NULL, NULL); }どうしたらきちんとした位置に描画できるのでしょうか。

  • 描画を透明にする方法

    Directxの質問なのですがある色だけ透明にするにはどうしたらいいのでしょうか? void Draw(ID3DXSprite* g_pSprite,DDXTEX* g_pTexture) { // クリア g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, g_clrBackgroundColor, 1.0f, 0); // 描画開始 if (FAILED(g_pd3dDevice->BeginScene())) { g_pd3dDevice->Present(NULL, NULL, NULL, NULL); return; } // スプライトを描画 g_pSprite->Begin(D3DXSPRITE_ALPHABLEND); g_pSprite->Draw( g_pTexture->m_pTexture, // LPDIRECT3DTEXTURE9 pTexture NULL, // CONST RECT *pSrcRect &g_vCenter, // CONST D3DXVECTOR3 *pCenter NULL, // CONST D3DXVECTOR3 *pPosition g_pTexture->m_clrAlpha // D3DCOLOR Color ); g_pSprite->SetTransform(&g_mat); g_pSprite->End(); // シーン描画の終了とバックバッファからの表示 g_pd3dDevice->EndScene(); g_pd3dDevice->Present(NULL, NULL, NULL, NULL); } g_pTexture->m_clrAlphaで半透明するはずだとは思うのですが。できません。わかる方いらしたらご教授のほどよろしくお願いします。

  • 描画位置について

    描画を透明化する質問をしたものですが、もう1つ教えていただきたいことがあります。 void Draw(ID3DXSprite* g_pSprite,DDXTEX* g_pTexture) { // クリア g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, g_clrBackgroundColor, 1.0f, 0); // 描画開始 if (FAILED(g_pd3dDevice->BeginScene())) { g_pd3dDevice->Present(NULL, NULL, NULL, NULL); return; } // スプライトを描画 g_pSprite->Begin(D3DXSPRITE_ALPHABLEND); g_pSprite->Draw( g_pTexture->m_pTexture, // LPDIRECT3DTEXTURE9 pTexture NULL, // CONST RECT *pSrcRect &g_vCenter, // CONST D3DXVECTOR3 *pCenter NULL, // CONST D3DXVECTOR3 *pPosition g_pTexture->m_clrAlpha // D3DCOLOR Color ); g_pSprite->SetTransform(&g_mat); g_pSprite->End(); で描画範囲がCONST RECT *pSrcRectで、描画中心がCONST D3DXVECTOR3 *pPosition、描画位置がCONST D3DXVECTOR3 *pPositionのはずなのですが描画範囲も描画中心、描画位置も思い通りいきません。 描画範囲、中心、位置を指定するにはどうすればいいのでしょうか?

  • DirectXでの半透明PNG画像について

    半分が半透明で、もう半分は透明でない単色のPNG画像(128×128サイズ)を作成しました。 ソフトはAdobe Photoshop Elements 6.0で、アルファ設定されている「PNG-24」です。 D3DXCreateTextureFromFileEx関数で、そのPNG画像を読み込んで描画したのですが、半透明の部分は描画されず、透明にしていない片方しか描画されませんでした。 半透明の部分も描画されるようにするにはどうすればよいでしょうか? 自分でもいろいろ調べてみたのですが、原因がよく分からないので質問させていただきます。 一応、参考程度に… // スプライトオブジェクトの作成 if ( FAILED( D3DXCreateSprite( g_pd3dDevice, &m_pSprite ) ) ) {     // エラー処理 } D3DXIMAGE_INFO info; // テクスチャの読み込み if( FAILED( D3DXCreateTextureFromFileExA( g_pd3dDevice,                                FileName,                                D3DX_DEFAULT,                                D3DX_DEFAULT,                                D3DX_DEFAULT,                                0,                                D3DFMT_A1R5G5B5,                                D3DPOOL_MANAGED,                                D3DX_FILTER_NONE,                                D3DX_FILTER_NONE,                                0,                                &info,                                NULL,                                &g_pd3dTexture) ) ) {     // エラー処理 }

  • ローディング画面をマルチスレッドで動かせません。

    ローディング画面をマルチスレッドで動かせません。 DirectXとC++をVisualStudio2010でゲームを制作しています。 ローディング画面を動かせるようにマルチスレッドにしているんですが、パソコンによってはローディング画面から動かなくなってしまいます。(開発環境では、問題なく動きます) スレッドの呼び出し部分は以下のようになっています。 HANDLE thread; CScene gamen; //タイトル画面やメインゲーム画面などのシーンを管理 void Loading() { SetDrawLoading( true ); delete gamen; gamen = new CTitleGamen(); thread = (HANDLE)_beginthreadex(NULL,0,DrawLoading,NULL,0,NULL); gamen->LoadData(); //クラス内の画像や音楽データを読み込み effect->SetDrawLoading(false); WaitForSingleObject( thread, INFINITE ); CloseHandle(thread); } マルチスレッド部分は以下のように、 drawLoading変数がtrueの間、ローディング画面を描画するようにしています。 D3DXMATRIX m_world; unsigned __stdcall DrawLoading(void *p){ LPDIRECT3DTEXTURE9 pTexture; D3DXCreateTextureFromFileEx(m_pD3DDevice, TEXT("texture.png"),16, 16, 0, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_FILTER_NONE, D3DX_DEFAULT, D3DCOLOR_XRGB(255,255,0), NULL, NULL, &pTexture)) do{ m_pD3DDevice->Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,0), 1.0f, 0); if( SUCCEEDED( m_pD3DDevice->BeginScene() ) ) { D3DXMatrixIdentity( &m_world ); m_pD3DDevice->SetTransform( D3DTS_WORLD, &m_world ); m_pSprite->Begin( D3DXSPRITE_ALPHABLEND ); m_pSprite->Draw( pTexture, NULL, NULL, &D3DXVECTOR3( timeGetTime()%800), 550, 0 ), 0xffffffff ); m_pSprite->End(); m_pD3DDevice->EndScene(); } m_pD3DDevice->Present( 0, 0, 0, 0 ); }while( effect->GetDrawLoading() ); pTexture->Release(); _endthreadex(0); return 0; } どなたか、ご教授お願い致します。

  • Directxについて

    1つご教授お願い申したいのですが、 HRESULT DrowInitialize(HWND hWnd) { LPDIRECT3D9 g_pD3D; D3DPRESENT_PARAMETERS g_D3DPP; g_pD3D = Direct3DCreate9(D3D_SDK_VERSION); if(g_pD3D==NULL) { return S_FALSE; } ZeroMemory(&g_D3DPP,sizeof(g_D3DPP)); g_D3DPP.Windowed =TRUE; g_D3DPP.SwapEffect =D3DSWAPEFFECT_DISCARD; g_D3DPP.BackBufferFormat = D3DFMT_UNKNOWN; HRESULT hr = g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING,&g_D3DPP,&pd3dDevice); if(FAILED(hr)) { hr = g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING,&g_D3DPP,&pd3dDevice); if(FAILED(hr)) { hr =g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_REF,hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING,&g_D3DPP,&pd3dDevice); if(FAILED(hr)) { return S_FALSE; } } } return S_OK; } なのですが、これが通らなくて困っています。(S_FALSEを通ってしまいます)S_OKを通るにはどうしたらいいのでしょうか。わかる方いらしたらよろしくお願いします。

  • BHO-3

    いつもお世話になっています。 STDMETHODIMP CHelloWorldBHO::SetSite(IUnknown* pUnkSite) { HRESULT hr = S_OK; if (m_pSite != NULL){ m_pSite->Release(); m_pSite = NULL; } if (pUnkSite != NULL) { IHTMLDocument3 *pDocument3; HRESULT hr2 = pUnkSite->QueryInterface(IID_IHTMLDocument3, (void **)&pDocument3); if (SUCCEEDED(hr2)){ PutEventHandler(pDocument3); } ////////////////////////////// // IWebBrowser2 へのポインタをキャッシュします。 HRESULT hr = pUnkSite->QueryInterface(IID_IWebBrowser2, (void **)&m_spWebBrowser); if (SUCCEEDED(hr)) { // DWebBrowserEvents2 からのイベントをシンクに登録します。 hr = DispEventAdvise(m_spWebBrowser); if (SUCCEEDED(hr)) { m_fAdvised = TRUE; } } 上のコードの IHTMLDocument3 *pDocument3; HRESULT hr2 = pUnkSite->QueryInterface(IID_IHTMLDocument3, (void **)&pDocument3); if (SUCCEEDED(hr2)){ PutEventHandler(pDocument3); } ですが、 HRESULT hr2 = pUnkSite->QueryInterface(IID_IHTMLDocument3, (void **)&pDocument3); の部分で失敗します。 HRESULT hr = pUnkSite->QueryInterface(IID_IWebBrowser2, (void **)&m_spWebBrowser); if (SUCCEEDED(hr)) { // DWebBrowserEvents2 からのイベントをシンクに登録します。 hr = DispEventAdvise(m_spWebBrowser); if (SUCCEEDED(hr)) { m_fAdvised = TRUE; } } が、上手く動くのでまねをしたのですが上手く行きません。 すみませんが、アドバイスお願いします。

  • メモリの解放について

    C++でDirectXを用いたゲームを作成しているのですが、プログラムのコンパイルは通るのに、メモリの解放関数が行われると強制終了されエラーメッセージが出力されます。 デバッグをしてみて要因を調べてみましたが、特に強制終了するような問題があるとも思えないのです。(ただ自分の知識不足であると思いますが) ためしにエラーが出ている部分をコメントにしてみたら、そしたらヒープが壊れてるとのエラーメッセージが出るのですがどう対処したらいいでしょうか? ちなみにRELEASEする変数の中身はちゃんと入ってます。 ソース: const int MAXFONT = 16; LPD3DXFONT g_pxfonts[MAXFONT]; LPD3DXSPRITE g_ptextsprite = NULL; int d=0; void DirectGraphics::CleanupD3D(){ //フォント解放 for(d=0; d<MAXFONT; d++){ if(g_pxfonts[d]!=NULL){ g_pxfonts[d]->Release();//エラー } } if(g_ptextsprite) g_ptextsprite->Release();//エラー //メッシュ、テクスチャ解放 for(d=0; d<MAXMODEL; d=d+1){ if(g_models[d].used == TRUE){ if(g_models[d].pmaterials != NULL){ delete[] g_models[d].pmaterials; } if(g_models[d].ptextures != NULL){ for(DWORD j=0; j<g_models[d].nummaterials; j=j+1){ g_models[d].ptextures[j]->Release(); } delete[] g_models[d].ptextures; } if(g_models[d].pmesh != NULL){ g_models[d].pmesh->Release(); } } } if( g_pd3dDevice != NULL ) g_pd3dDevice->Release(); if( g_pD3D != NULL ) g_pD3D->Release(); } エラーの出ているフォントの変数の中身はこちらに入れております。 //ゲーム用のフォントを作成 int DirectGraphics::CreateGameFont(LPCTSTR fontname, int height, UINT weight){ //空いている要素を探す int idx; for(idx=0; idx<MAXFONT; idx=idx+1){ if(g_pxfonts[idx] == NULL) break; } if (idx>=MAXFONT) return -1; //フォントを作成する HRESULT hr = D3DXCreateFont( g_pd3dDevice, -height, 0, weight, 1, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, fontname, &g_pxfonts[idx]); if( FAILED( hr ) ) return -1; return idx; }

  • error C2679 がとれません><

    HRESULT hr; if( FAILED( hr = CMyD3DApplication::FrameMove(fElapsedTime))) return hr; D3DXMATRIX matWorld; D3DXMATRIX matRotY; D3DXMATRIX matRotX; m_DInput.JoyUpdate(); if(m_DInput.UP()) matRotX += fElapsedTime * 0.5f; D3DXMatrixRotationX( &matRotX, m_fWorldRotX ); D3DXMatrixRotationY( &matRotY, m_fWorldRotY ); D3DXMatrixMultiply( &matWorld, &matRotX, &matRotY ); m_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld ); リファレンスを参考に3Dを動かすコードを打ちましが、 最後次のエラーがなかなか取れません。 構文もミスはないし、あちこちを調べましたが原因が分かりません。 どうか対処方法をおしえてください。 問題のコンパイルエラー error C2679: 二項演算子 '+=' : 型 'float' の右オペランドを扱う演算子が見つかりません (または変換できません)。

  • BCCでのTexture使用に関するError?

    win2k BCC5.5 BCCDevloper DirectX9.0b で開発してるのですが。 コンパイルは通るのですが、 実行するとD3DX81ab.DLLが必要と出て終了します。 なのでsystemに追加して実行したら、 今度は起動するけどエラー終了になります。 デバッガ使用して調べてみたら、 texture使用の部分でErrorがでてしまいます。 調べたけど分からなかったので質問させていただきます。 以下関連部分ソースコード #include <tchar.h> #include <d3dx9.h> #include <dxerr9.h> (中略) LPD3DXSPRITE pSprite = NULL; LPDIRECT3DTEXTURE9 pTexture = NULL; TCHAR gl_disp[]=_T("canvas.png"); (中略) hr = D3DXCreateTextureFromFile(gl_lpD3ddev,gl_disp,&pTexture); if(FAILED(hr)) return DXTRACE_ERR("InitDXGraphics D3DXCreateTextureFromFile", hr); hr = D3DXCreateSprite(gl_lpD3ddev, &pSprite); if(FAILED(hr)) return DXTRACE_ERR("InitDXGraphics D3DXCreateSprite", hr); (以下省略) D3DXCreateTextureFromFileでErrorが出ているというのは分かったのですが、それ以降がサッパリです。 これだけでは足りないようでしたらご指摘ください。 何か参考になるURLなどでもかまいませんのでよろしくお願いします。

専門家に質問してみよう