Przycinanie tekstu w Dx9 w c#

0

Witam, zastanawiam się czy to dobry dział na taki temat, ale może ktoś pomoże, w każdym razie problem jest następujący:

Chcę za pomocą DirectX9 w C# narysować jakiś tekst, ale nie cały tylko jego fragment. Po prostu przycięty do określonego prostokąta. Zazwyczaj robiłoby się to po prostu tak:

font.DrawText(sprite, text, rect, format, color);

gdzie 'rect' to prostokąt, do którego tekst ma być przycięty. I działa, ale nie tak jak trzeba, bo tekst jest formatowany w prostokącie rect.
Chodzi mi o to, żeby sformatować tekst w innym prostokącie niż rect, a następnie narysować tekst według tego formatowania obcięty do powierzchnii 'rect'. Tylko jak?

Trochę to zawiłe, ale, innymi słowy, to ma być tak, jak przy rysowaniu tekstury. Bierzemy dowolny jej fragment, a oddzielnie manipulujemy rozmiarem obrazka na ekranie.

Z góry dzięki.

0

Od tego masz sprite właśnie - na nim piszesz z właściwym dla tekstu ograniczeniem rect, a potem obraz tego rysujesz na ekranie (lub innym sprite/teksturze) z obcięciem 'innym niż rect'.

Nie widzę z czym problem.

DOPISANE: A jak to cię nie zadowala, to możesz narpisać tekst w prawidłowym prostokącie, wyrenderować na teksturę i nią oteksturować dowolny prostokąt z własnymi współrzędnymi tekstur.

0

Dzięki za odpowiedź. Popróbuję z tą teksturą, w ten sposób pewnie się da. A jak się ma kwestia wydajności przy renderowaniu do tekstury?

A pierwsza opcja nie zadowala, a to dlatego, że jeśli zmienię parametr 'rect' w funkcji DrawText, to tekst jest formatowany dla tego nowego rect i wychodzi krzywo :) Ściślej:

Potrzebuję tego do interfejsu w DX, więc wyobraź sobie, że masz przycisk z tekstem, gdzie tekst jest rysowany w środku przycisku.

Wobec tego format = DrawTextFormat.Center, a jeśli przycisk ma jakiś swój "parent" (wszystko tak jak w popularnych windowsowych aplikacjach) i wychodzi poza jego granice, to jest przycinany.

Z tym nie ma problemu, bazę przycisku łatwo przyciąć - po prostu rysuję część tekstury do okrojonego 'rect'.

Ale kiedy zmienię 'rect', to tekst jest formatowany według DrawTextFormat.Center w nowym rect i - logiczne - przesuwa tekst zamiast go uciąć. Jeśli wyrenderuję tekst do nieprzyciętego rect (do którego powinien być formatowany), to tekst wyjeżdża poza 'parent'.

W tym tkwi problem. Mam nadzieję, że trochę rozjaśniłem...

0

Renderowanie na teksturę byłoby zatem dobrym rozwiązaniem, a szybkość zależy od zawartości renderowanej sceny i częstości renderowania - jeśli jest to tekst w miarę stały (lub rzadko zmienny), może nadawać się doskonale. Renderuj tylko po zamianie tekstu lub wymiarów i zachowuj teksturę, a nie co klatkę. Nie będziesz miał właściwie żadnej straty wydajności.

Jeśli nigdy tego nie robiłeś - jest to prosta sprawa:

  • Zachowujesz aktualny surface renderowania, tworzysz nowy surface, wyciągasz z niego teksturę, ustawiasz go jako cel renderowania, dokonujesz zwykłego renderingu, a ostatecznie przywracasz cel renderowania.

Od tego momentu dokonujesz zwykłego renderingu z użyciem nowej tekstury.

0

Sam tekst zmienia się rzadko, natomiast zmienia się kolor czcionki, np. przy najeżdżaniu myszą, klikaniu, itd.

Rozumiem, że można tekst wyrenderować na przeźroczystą teksturę i zmieniać kolor...

0

Użyłem renderowania do tekstury i rysuje się to w dobrym miejscu, ale nie widać tekstu. Tekstura jest jednokolorowa, dlaczego?

0

Nie wiem. Pokaż kod.

1 użytkowników online, w tym zalogowanych: 0, gości: 1