Skocz do zawartości

Scrollowanie tekstu


TO_mek

Rekomendowane odpowiedzi

Witam!

Potrzebuje zrobić przesuwany tekst w kilku wariantach. Tekst ma się wyświetlać na sprajcie telewizora (o wielkości 100x60) lub w wersji trudniejszej na matrycy lcd (większej). Jak zrobić następujące warianty:

 

Wariant 1

Tekst przewija się od prawej do lewej, gdy dotyka krawędzi ekranu tv znika - czyli standardowy scroll tekstu jakie nie raz widać w serwisach informacyjnych.

 

Wariant 2

Tekst przewijany na funkcji sinus, litery cały czas w pionie

 

Wariant 3

Jak w wariancie 2 ale litery "pochylają" się pod odpowiednim kątem

 

Wariant 4

Jak w wariantach 2 i 3 ale tekst przewija się nie po funkcji sinus a po ścieżce (path)

 

Wariant 5

Wyświetlanie na ekranie tego tv animacji flash zrobionej w swishu

 

 

W wersji na "matrycę LCD" teksty powinny składać się z punktów.

Odnośnik do komentarza
Udostępnij na innych stronach

Surfacey!

GML (Create)
lcdScreen = surface_create( 100, 100 );

lcdScreenWrapX = 10;

lcdScreenWrapY = 10;

lcdTextWrap = 0;

 

surface_set_target( lcdScreen );

draw_clear( $4080FF );

surface_reset_target();

 

GML (Step)
var _x, _y;

 

surface_set_target( lcdScreen );

draw_clear( $4080FF );

 

_x = (mouse_x-x) - lcdScreenWrapX;

_y = (mouse_y-y) - lcdScreenWrapY;

 

// Taka sobie strzałeczka

draw_arrow( _x+10, _y+14, _x, _y, 10 );

 

// Tekst na LCD

draw_set_font( fLCD ); // Jakiś font przypominający LCD - Monospace!

draw_text_color( floor(lcdTextWrap/10)*10, 50, "Simple test", c_green, c_green, c_green, c_green, 1 );

surface_reset_target();

 

lcdTextWrap -= 0.5;

if( lcdTextWrap < -110 )

lcdTextWrap = 110;

 

GML (Draw)
draw_surface( lcdScreen, x+lcdScreenWrapX, y+lcdScreenWrapY );

draw_sprite( sprite_index, 0, x, y );

 

Co do pozostałych pytań, wystarczą przemiany dot. rysowania na surface (lcdScreen)

Odnośnik do komentarza
Udostępnij na innych stronach

GML
_x = (mouse_x-x) - lcdScreenWrapX;

_y = (mouse_y-y) - lcdScreenWrapY;

 

// Taka sobie strzałeczka

draw_arrow( _x+10, _y+14, _x, _y, 10 );

 

Zarówno współrzędne myszy jak i strzałka są niemal niezbędne w przykładzie ;)

 

Ok. To rozwiązuje wariant 1 i przy zastosowaniu odpowiedniego fontu LCD na upartego wersje na matrycy LCD (ale nie o to mi chodziło a o rysowanie punkt po punkcie - coś jakby tablica 100x60 a najlepiej większa i włączanie/wyłączanie odpowiednich punktów w celu uzyskania napisu bądź grafiki czyli efektu takiego jak na prawdziwych reklamach LCD)

 

Co do wariantów 2-5 nadal nie wiem jakby się za to zabrać, tzn. już nie o samo wyświetlanie bo akurat Twój przykład to rozwiązuje, ale o samo rysowanie tekstu na sinusoidzie czy na ścieżce. Wariant 5 to przypuszczam zupełnie odrębna historia (czy GM ma wbudowaną obsługę flasha?)

Odnośnik do komentarza
Udostępnij na innych stronach

Co do 5.

O ile to zwykła animacja to wyrenderuj ją jako gifa czy avi. Ja używam Adobe Flash Proffesional CS5 i wiem, że jest taka możliwość.

 

Kurcze dałbym sobie rękę uciąć że kilka dni temu czytałem jakiś wątek w którym Gnysek pisał o animacjach flash w GMie tylko że problem był pełny ekran (że działało tylko na full screen albo odwrotnie) ale teraz nie potrafię tego znaleźć.

Odnośnik do komentarza
Udostępnij na innych stronach

5. GM nie obsługuje flasha, może istnieje jakiś DLL... ;p

 

Co do 2, wystarczą funkcje.

GML
//f(x) = sin(x)*10;

var _x, _y;

_x = degtorad( jakas_wartosc /*x*/ );

_y = sin(_x)*10;

 

draw_...( x, y+_y, ... )

 

Powyższe powoduje tylko, że tekst w całości przesuwa się w górę/dół w rytm sinusoidy. Ja potrzebuje efektu gdzie każda z liter będzie traktowana osobno i na ekranie uzyskam "wykres sinusoidy z liter" -wariant 2. W wariancie 3 dodatkowo litery powinny się pochylać pod odpowiednim kątem (czyli ich podstawa powinna być "doklejona" do niewidocznej linii sinusoidy).

Odnośnik do komentarza
Udostępnij na innych stronach

Spróbuj każdą literę rysować z osobna za pomocą funkcji 'draw_text_transformed', oraz pokierować owe na funkcji 'f(x) = sin(x)*10'. Co do obrotu, musisz 'przewidzieć' jaka będzie następna wysokość 'x+1', następnie funkcją 'point_direction' pobrać kierunek oraz warto wiedzieć iż funkcja 'draw_text_transformed' przyjmuje parametr 'angle'.

Odnośnik do komentarza
Udostępnij na innych stronach

Spróbuj każdą literę rysować z osobna za pomocą funkcji 'draw_text_transformed', oraz pokierować owe na funkcji 'f(x) = sin(x)*10'. Co do obrotu, musisz 'przewidzieć' jaka będzie następna wysokość 'x+1', następnie funkcją 'point_direction' pobrać kierunek oraz warto wiedzieć iż funkcja 'draw_text_transformed' przyjmuje parametr 'angle'.

 

Już wcześniej myślałem o draw_text_transformed z parametrem angle. Czyli pozostaje mi odczytywać ze stringa znak po znaku i rysować każdy z osobna.

A w jaki sposób mogę odczytać długość stringa ale nie chodzi mi o ilość znaków (string_length(str)) tylko o rzeczywistą długość w pikselach przy wybranym foncie.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...