オブジェクトに「親」を適用できるメニュー システムに取り組んでいます。CLabel
フォントをレンダリングするクラスがあります。それらがすべて含まれCEditBox
ている基本クラスへのポインターを持つクラスがあります。次に、オブジェクトCControl
へのポインターを宣言し、aのコンストラクター内のa をポイントします。 CControl
CLabel
CEditBox
私が知る限り、これはすべて正しく設定されています。なぜ私はそれを言うのですか?この機能:
void CControl::RenderChildren() {
for( int i = 0; i < Children.size(); i++ ) {
//Children[i]->X(Children[i]->X()+_X); //offset child _X with parent's _X
//Children[i]->Y(Children[i]->Y()+_Y); //offset child _Y with parent's _Y
Children[i]->OnRender();
}
}
編集ボックスをレンダリングし、ラベル オフセット (_X、_Y のメンバーであるCControl
) を使用してラベルをレンダリングします。それらは 0,0 にあるため、テキストは左上隅にレンダリングされます。
ここで、2 行のコメントを外して次の関数を使用すると、テキストがレンダリングされません。
void CControl::RenderChildren() {
for( int i = 0; i < Children.size(); i++ ) {
Children[i]->X(Children[i]->X()+_X); //offset child _X with parent's _X
Children[i]->Y(Children[i]->Y()+_Y); //offset child _Y with parent's _Y
Children[i]->OnRender();
}
}
値を具体的にテストするために呼び出しを使用exit(variable)
しましたが、いくつかのことがわかります。_X と _Y は、子に対して正しく設定されています。親は目的の場所にレンダリングされるため、親の _X、_Y 値には影響しません。
次に、私が呼び出す関数を見てみましょう。
void CControl::X(int x) {
// Set Component's X coordinate
_X = x;
//if(Pappy != NULL) {
// _X = _X + Pappy->X();
//}
}
void CControl::Y(int y) {
// Set Component's Y coordinate
_Y = y;
//if(Pappy != NULL) {
// _Y = _Y + Pappy->Y();
//}
}
コメントアウトされた行は気にしないでください。これは、それが何かの子であるかどうかを確認し、_X 関数と _Y 関数のオフセットを変更するつもりだったからです。子をレンダリングするときにのみオフセットを適用します(したがって、上記の元の関数)。簡単に言えば、これらの関数は渡された整数を現在のオフセットに設定するだけです。
次に、関数の読み取りバージョン:
int CControl::X() {
// Get Component's X coordinate
//if(Pappy != NULL) return _X - Pappy->X();
return _X;
}
int CControl::Y() {
// Get Component's Y coordinate
//if(Pappy != NULL) return _Y - Pappy->Y();
return _Y;
}
また、値を返すだけで、2行がどのようになっているのかわかりません
Children[i]->X(Children[i]->X()+_X); //offset child _X with parent's _X
Children[i]->Y(Children[i]->Y()+_Y); //offset child _Y with parent's _Y
レンダリングが失敗する原因となっています。
私のCLabel::OnRender()
機能を調べても、問題を検出できません。
void CLabel::OnRender() {
if(Visible) {
SDL_Surface* Surf_Text;
Surf_Text = Font.BlendedUTF8Surface();
Text_Font.OnLoad(Surf_Text);
Text_Font.RenderQuad(_X,_Y);
SDL_FreeSurface(Surf_Text);
}
}
ここにコードが入っていることはわかっています。ステートメントexit(variable)
内で使用しました。オフセット ラインの有無にかかわらず SDL_Surface 値に違いはなく、ある場合にはレンダリングされますが、別の場合にはレンダリングされないため、テキストがレンダリングされることif
をテストSurf_Text->w
しました。Surf_Text->h
さらに、この関数で _X と _Y をテストして、実際に適切な場所にレンダリングされていることを確認しました。彼らです。
これは、レンダリング順序に問題がある可能性があることを意味しますが、この関数で dX と dY を親オフセットを適用した後の整数値に置き換えるText_Font.RenderQuad(_X,_Y);
とText_Font.RenderQuad(_X+dX,_Y+dY);
、テキストは問題なくレンダリングされます。だから私が考えることができるすべて、私はテストしました。これらの 2 つのオフセット ラインがレンダリングを無効にする理由がわかりません。
Children[i]->X(Children[i]->X()+_X); //offset child _X with parent's _X
Children[i]->Y(Children[i]->Y()+_Y); //offset child _Y with parent's _Y
[解決済み]
うん。行って、ちょっと考えてみました。
フレーム 1)
Children[i]->X(Children[i]->X()+_X) // will be 100 and exit correctly.
フレーム 2)
Children[i]->X(Children[i]->X()+_X) // will be 200 if I don't add the exit
等...
私の機能を作りました:
void CControl::RenderChildren() {
for( int i = 0; i < Children.size(); i++ ) {
Children[i]->X(Children[i]->X()+_X); //offset child _X with parent's _X
Children[i]->Y(Children[i]->Y()+_Y); //offset child _Y with parent's _Y
Children[i]->OnRender();
Children[i]->X(Children[i]->X()-_X);
Children[i]->Y(Children[i]->Y()-_Y);
}
}
完璧にレンダリングします。私が誰の時間を無駄にしなかったことを願っています。
【解決策2】
選択した回答を読んで、レンダリング中にオフセットを適用する関数を書き直すことにしました。以下に示すように、子をレンダリングする前にオフセットを計算するだけです。
void CControl::RenderChildren() {
for( int i = 0; i < Children.size(); i++ ) {
int xOff, yOff;
xOff = yOff = 0; //Initialize offsets
CControl * Kin = this; //Pointer to current parent
while( Kin != NULL ) { //Until there is no more parent container repeat
xOff = Kin->X() + xOff; //Add X of Parent to the current X offset total.
yOff = Kin->Y() + yOff; //Add Y of Parent to the current Y offset total.
Kin = Kin->GetParent(); //Get next parent.
}
Children[i]->OnRender(xOff,yOff); //Render based on parental induced offset location
}
}