[#1] Konfigurowalny scroll...
Ano właśnie... tak se siedzę i myślę co tu zrobić żeby się nie narobić a zarobić i przyszedł mi do głowy mały program. Chodzi o taki programik który np. u dołu ekranu skrollowałby jakiś tekst typu: Nadeszła nowa poczta, czy Masz 6 nowych wiadomości, czy cyklicznie aktualny czas... tło i fonty konfigurowalne... ot, taki mały przypominaczo-powiadamiacz... All rights reserved.

[#2] Re: Konfigurowalny scroll...

@Dopuser, post #1

No to w czym problem? TextExtent() do sprawdzenia rozmiaru tekstu, alokujesz bitmapę i tworzysz RastPort podpinając do niego bitmapę. Teraz do tego RastPortu wypisujesz tekst (cały). Następnie otwierasz okienko o wysokości dopasowanej do tekstu (szerokość będzie mniejsza oczywiście, inaczej jaki sens ma skrolowanie?). No i główna pętla. Funkcją ClipBlit() kopiujesz kawałek tekstu od lewej krawędzi z swojego RastPortu do RastPortu okna. Potem Delay(50) powiedzmy (liczbą regulujesz szybkość scrolla). Potem znów kopiujesz kawałek tekstu, ale nie od lewego brzegu, tylko o 1 piksel w prawo. I znów Delay() i tak w kółko. Pętla troszkę się skomplikuje, gdy prawa krawędź kopiowanego fragmentu dojedzie do końca tekstu, wtedy trzeba kopiować kawałek z końca i kawałek z początku (można też dowalić pustego miejsca na szerokość okna z przodu i z tyłu tekstu...). I to tyle w skrócie.

[#3] Re: Konfigurowalny scroll...

@Grzegorz Kraszewski, post #2

Tak też przypuszczałem, że proste jak barszcz... dorzuć jeszcze do tego port ARexxa i... czekam w takim razie na wersję Beta... :)

[#4] Re: Konfigurowalny scroll...

@Dopuser, post #3

A to nie Ty miałeś napisać? ;)

[#5] Re: Konfigurowalny scroll...

@Dopuser, post #1

Mam rozwiązanie znacznie prostsze od rozwiązania pana Grzegorza Kraszewskiego. Opiszę je krok po kroku.
Wykorzystuję tylko funkcje Move() i Text()!

1. Najpierw zdefiniuj tablicę znaków (char) o szerokości będącej liczbą znaków mieszczących się w okienku oraz drugą tablicę znaków gdzie zamieścisz tekst do scrollowania., np w naszym przypadku:

char bufor[40]; // tyle znaków mieści się jednocześnie na ekranie
char tekst[80]; // tyle znaków ma Twój tekst

2. Następnie wyczyść wszystkie elementy tablicy "bufor" na spacje i wpisz swój tekst do tablicy "tekst".

3. Wywołaj teraz funkcję Move( rp, 0, 8 ), gdzie rp to RastPort okna, a wysokość czcionki to np. 8 dla topaz.font. (zakładam, że otworzyłeś okno z atrybutem BORDERLESS, w innym przypadku podaj inne parametry funkcji Move()).

4. Teraz pętla główna. Wywołuj funkcję Text(rp, bufor, 40), gdzie 40 to szerokość okienka co pewien czas (użyj do przerwy funkcji WaitTOF() lub Delay()).

5. Teraz najważniejsze: W pętli głównej wprowadzaj do tablicy "bufor" z prawej strony kolejne litery tablicy "tekst", aż do wyczerpania tablicy "tekst".

6. Potem przesuwaj litery tekstu w tablicy w lewą stronę co jedną literę,
aż cały tekst zniknie po lewej stronie.

Scrolling co prawda jest co jedną literę ale duża płynność zostanie zachowana! Można modyfikować kod, np. żeby skrolował co kilka pikseli, wystarczy wywoływać funkcję Move() w pętli głównej.



Ostatnia modyfikacja: 29.08.2008 07:06:25
[#6] Re: Konfigurowalny scroll...

@Minniat, post #5

1. W ten sposób będziemy skrolować co szerokość litery, a nie co 1 piskel - przesuw będzie szarpany, a duża płynność na pewno nie zostanie zachowana. Zwłaszcza jeżeli użyjemy czcionki większej niż topaz/8.

2. Sposób całkowicie zawiedzie przy czcionce proporcjonalnej - dla różnych liter będą różne skoki skrola, co da jeszcze gorsze szarpanie.

3. W Move() powinno się podawać jako współrzędną pionową tf_BaseLine (linia bazowa czcionki), a nie jej wysokość. W przeciwnym wypadku, jeżeli wysokość okna jest równa wysokości czcionki, dolne ogonki liter ("y", "g", "p" i tak dalej) zostaną ucięte.

4. Trzecim parametrem funkcji Text() jest ilość znaków do wydrukowania, a nie ilość pikseli. W przypadku okna "borderless" system i tak utnie to, co wyłazi poza okno, ale jak będzie to okno z ramką to tekst będzie drukowany również na ramce.

5. Przed Text() trzeba też ustawić tryb rysowania na JAM2, inaczej kolejne przesunięte napisy będą się "nadrukowywać" jeden na drugi.

6. Wbrew pozorom też, ten sposób wcale nie jest szybszy od mojego, bo Text() będzie się wykonywał dłużej niż ClipBlit().

[#7] Re: Konfigurowalny scroll...

@Grzegorz Kraszewski, post #6

W każdym razie przetestowałem mój algorytm i działa tak jak chciałem...
Łatwo można zmodyfikować mój algorytm by przesuwał tekst co jeden piksel. Mój sposób jest najzwyczajniej bardzo prosty w stosunku do Pańskiego. Dziękuję za uwagi.

[#8] Re: Konfigurowalny scroll...

@Minniat, post #7

Jak go zmodyfikujemy, żeby działał co 1 piksel i żeby poprawnie obsługiwał czcionki proporcjonalne, to już nie będzie taki prosty...

[#9] Re: Konfigurowalny scroll...

@Minniat, post #7

keee ?
pomysł krashana opiera się o pojedyczną generacje bitmapyi proste kopiowanie, tak przeciez mniej wiecej działają gry bitmapowe. nie powiesz chyba ze proste kopiowanie jest trudniejsze od wywoływaniu w pętli dość wysokopoziomowych funkcji takich jak text()

[#10] Re: Konfigurowalny scroll...

@rzookol, post #9

Z reguły procedury wysokopoziomowe są łatwiejsze od niskopoziomowych. To tak jak różnica pomiędzy asemblerem i C.

[#11] Re: Konfigurowalny scroll...

@Minniat, post #10

ale tutaj tylko kopiujemy pamięć (bitmape)

[#12] Re: Konfigurowalny scroll...

@Minniat, post #10

Tylko, że nie o to mi chodziło. Procesor będzie dłużej wykonywał Text() niż ClipBlit(), tym bardziej że ta ostatnia funkcja zostanie (po wyliczeniu niezbędnych parametrów) wykonana przez blitter.

[#13] Re: Konfigurowalny scroll...

@Grzegorz Kraszewski, post #12

Zamieszczam przykładowy kod źródłowy realizujący skrolling tekstu tak jak opisałem w wypowiedzi #5 (płynnie co jeden piksel). Jest on w formacie HTML dla atrakcyjnego wyglądu... :) Wadą jest mała uniwersalność zaś zaletą jest małe zużycie pamięci i prostota. Zamierzam też napisać metodę Krashana i przetestować ją.

http://minniatian.republika.pl/Scroll/Scroll.html

A oto program w akcji:

http://minniatian.republika.pl/Scroll/Scroll.exe

[#14] Re: Konfigurowalny scroll...

@rzookol, post #11

Masz rację, że funkcja ClipBlit() jest prostsza, ale funkcja Text() wykonuje więcej pracy za ciebie (bo jest wysokopoziomowa).

[#15] Re: Konfigurowalny scroll...

@Minniat, post #14

Jest jeszcze jedna możliwość rozwiązania problemu scrollingu tekstu. Użycie funkcji ScrollLayer() Używam jej w moim edytorze poziomów do Benefactora. Można łatwo zmodyfikować kod pana Kraszewskiego by korzystał z tej funkcji.

Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem