Skocz do zawartości

Zablokowane Rysowanie aktywnej lini !?!?


Rekomendowane odpowiedzi

Witam. Mam drobny problem. Chciałem narysować "aktywną" linię, miała by ona wyglądać mniej więcej w taki sposób iż podczas lotu prosto wyglądała by jak zwykła prosta linia, lecz podczas lotu w górę, lub w dół leciała pod pewnym kątem w tym kierunku, nie chodzi mi o całą linię tylko o najbliższy kawałek, a reszta leciała by za nią.

Myślałem nad takim kodem ale takie bajery tylko w C++

GML
/*Dla ułatwienia całość dałem w draw*/

nY+=1

nX+=1

xx[nX] = x

yy[nY] = y

 

draw_set_color(c_white)

for (i=0;i<=150;i+=1)

{draw_point(xx,yy)}

Jak można się domyślić nie zna zmiennej w tablicy ( i )

GML
Unknown variable xx or array index out of bounds

Odrazu ostrzegam że nie będę pisał takiego kodu:

GML
draw_point(xx[nX-1],yy[nY-1])

draw_point(xx[nX-2],yy[nY-2])

draw_point(xx[nX-3],yy[nY-3])

draw_point(xx[nX-4],yy[nY-4])

draw_point(xx[nX-5],yy[nY-5])

draw_point(xx[nX-6],yy[nY-6])

draw_point(xx[nX-7],yy[nY-7])

draw_point(xx[nX-8],yy[nY-8])

draw_point(xx[nX-9],yy[nY-9])

draw_point(xx[nX-10],yy[nY-10])

draw_point(xx[nX-11],yy[nY-11])

draw_point(xx[nX-12],yy[nY-12])

draw_point(xx[nX-13],yy[nY-13])

draw_point(xx[nX-14],yy[nY-14])

draw_point(xx[nX-15],yy[nY-15]

I do tego deklaracja wszystkiego. MASAKRA!!!!!!

 

Może znacie sposób na zrobienie tego o co mi chodzi, bez pisania 5040 LINIJEK KODU. Od razu uprzedzam niektórych podajcie sposób np w postaci kodu, a nie pisania

Ja znam!

Proszę o szybką pomoc.

Odnośnik do komentarza
Udostępnij na innych stronach

Dzisiaj dopiero znalazłem mój błąd. Chodzi mi o linię która miała by 640 px. Pierwszy pixel latał by w pozycji x i y, a kolejne leciały by za nim powtarzając to co on zrobił ale 640 razy i każdy z tych punktów leciał by 1 klatkę wcześniej. Ten kod na pewno mi działał jak chciałem, ale jak go powtórzyć żeby nie pisać tego 640 razy, a takich lini zrobię 4.

GML
draw_point(xx[nX-1],yy[nY-1])

draw_point(xx[nX-2],yy[nY-2])

draw_point(xx[nX-3],yy[nY-3])

draw_point(xx[nX-4],yy[nY-4])

draw_point(xx[nX-5],yy[nY-5])

draw_point(xx[nX-6],yy[nY-6])

draw_point(xx[nX-7],yy[nY-7])

draw_point(xx[nX-8],yy[nY-8])

draw_point(xx[nX-9],yy[nY-9])

draw_point(xx[nX-10],yy[nY-10])

draw_point(xx[nX-11],yy[nY-11])

draw_point(xx[nX-12],yy[nY-12])

draw_point(xx[nX-13],yy[nY-13])

draw_point(xx[nX-14],yy[nY-14])

draw_point(xx[nX-15],yy[nY-15]...

Odnośnik do komentarza
Udostępnij na innych stronach

Ehh dzisiaj nie myślę. Taki kod napisałem wcześniej ale wyskakiwał mi błąd "Negative array index", zapomniałem że w tablicy trzeba zainicjować nie samo nX ale jeszcze -i xx[nX-i].

Nie ma sensu robić to w ten sposób, tylko Ci spowolni grę.

Wiem ale inny sposób mi nie przychodzi do głowy, napisałem że taki sposób działa tak jak chcę.

Jeszcze nie zamykam. Jeśli zna ktoś sposób na zrobienie bardziej efektywnego kodu który by nie wymagał 1.6 GHz procka to proszę pomoc. O ile dobrze pamiętam gdzieś widziałem przykład właśnie na to ale nie mogłem teraz znaleźć.

Odnośnik do komentarza
Udostępnij na innych stronach

Hmm powiem ci szczerze iż sam zastanawiam się czy nie lepiej było by tego zrobić na listach ub jakiejś innej strukturze danych, popróbuj zamiast tablic może bedzie to szybsze.

to akurat można sprawdzić. Napisz najpierw na tablicach, potem powtórz kod 1000 razy (repeat(1000)) i mierz czas wykonania, np przez porównanie current_time przed i po powtórzeniu. Analogicznie zrób na listach i zmierz czas, będzie wiadomo co szybsze.

Odnośnik do komentarza
Udostępnij na innych stronach

Sprawdziłem. Listy są nieznacznie szybsze od tablic. Ale to i tak niewiele przyśpiesza. Mam idealny komputer do testów (Gry w Flashu się zawieszają xD) Na listach średnie 27 fps na tablicach 22 fps. Myślałem nad czymś bardziej wydajnym. Najlepiej by było gdyby nie rysować punktów tylko kilka Lini. Było by to bardziej oszczędnie ale takie wyczyny są już dla mnie za trudne. Gdyście podali mi dobry pomysł na podstawie którego napisał bym kod było by świetnie. Chodzi mi o pseudokod, albo sam kod xD Linia ta ma tylko 4 proste wymagania.

1. Musi mieć wielkość 1px

2. Musi mieć długość 640px

3. Musi mieć możliwość szybkiej zmiany koloru, jak i możliwość klonowania na 4 sztuki.

4. Cała linia musi latać za 1 punktem.

 

Takie proste a tyle problemów.

Odnośnik do komentarza
Udostępnij na innych stronach

Wygląda to co chcę mniej więcej tak.

Nowy_Obraz_bitowy.jpg

I co teraz macie jaśniejszy obraz???

 

EDIT: Daje linka z przykładem, dla tych co jeszcze nie rozumieją o co mi w tym chodzi.

https://gmclan.org/up4308_12_Przyk_ad.html

Przykład w GM8, ale pod starsze też powinno działać.

UWAGA: Przykład ten ma pewnego buga. Całość ujawni się dopiero po przeleceniu przez cały room!!!!

Edytowane przez Muchaszewski
Odnośnik do komentarza
Udostępnij na innych stronach

  • 3 tygodnie później...

a nie można by zamiast 640 pixeli narysowac tylko kilka lini, których punktami granicznymi będą załamania 'wykresu'

zapisujesz załamania wykresu do tablic, ostatni punk będzie wyliczany dynamicznie (ten co się przesuwa).

 

E: Tak zapisaną tablice łatwo jest zdoublować bądź nawet ztriplować, tak jak jest w Twoim przykładzie, choć nie wiem czy to jest oczekiwany efekt =p

 

jutro dam Ci przykład.

Odnośnik do komentarza
Udostępnij na innych stronach

Twój przykład wygląda ciekawie ale nie oto mi chodziło xD Musiał bym się bardziej wgłębić w twój przykład żeby wiedzieć co tam narobiłeś i usunąć niepożądane efekty.

choć jak teraz patrzę na Twój przykład to wydaje mi się, że nie do końca skumałem Muchaszewskiego =p

Natomiast twój jest idealny w działaniu. Jeszcze przejże twój kod w dokończeniu do i dopasowaniu, lecz jest idealny do moich potrzeb.

 

Wielkie dzięki wszystkim zaangażowanym w pomoc mi xD

Odnośnik do komentarza
Udostępnij na innych stronach

Teraz też jest dobry. Zasada działania dokładnie ta sama. Czemu ja na to nie wpadłem xD

 

Mam jeszcze jedno pytanie. Jeżeli tak ta linia leci i zrobiłem ok. 800pkt to zaczyna się przywieszać(Mam słaby komp). Dlatego co zrobić żeby usunąć wartości z tabeli. Jeżeli zmieniam ją na 0 to do chodzę do 1200 pkt i lagi. Myślałem żeby zaczął używać ponownie tych samych pkt, lecz wtedy może wystąpić błąd taki jak nagłe znikanie lin z planszy.

Odnośnik do komentarza
Udostępnij na innych stronach

Oczywiście te które są najdalej, nie widać ich w roomie

 

E:

Nie obraź się Tymon korzystam z przykładu Marka.S

GML
if line_count =50

{line_count = 1

line_x[ line_count ] = line_x[ 50 ];

line_y[ line_count ] = line_y[ 50 ];

Przy takim czymś linia wyprostowuje się. Jej wszystkie poprzednie wartości wracają do początkowej. Nie powinny poprzednie zachować kształtu?

Odnośnik do komentarza
Udostępnij na innych stronach

No... Tak.

Trochę przerobiłem to i teraz linia zamiast lecieć, to jej główny punt stoi w miejscu, ew. poruszanie przez gracza, a reszta lini, dalsze punkty "uciekają" poza room. Chodzi mi o to aby te linie które są poza tym roomem "nie istniały". Nie przyjmowały żadnej wartości, gdyż ich i tak nie widać a tylko zajmują miejsce w pamięci komputera.

Odnośnik do komentarza
Udostępnij na innych stronach

Link do tego co chcę. Już przerobiony. https://gmclan.org/up4308_12_linie.html

 

I jeszcze coś. Porównałem oba przykłady Tymona i Marka. Twój Tymon jest strasznie pamięcio-żerny. Dlatego też go nie użyję. Szczegóły niżej. I co do tego linku. Jak usunąć będące w tabeli wartości.

Mamy w tabeli z 1600 wartości, z czego tylko 50-300 jest używane. Co można zrobić żeby nie używał tych wcześniejszych. Może nie jest to trochę po polsku dlatego pokaże na przykładzie.

GML
line[0] = 10

line[1] = 13

line[2] = 4

line[3] = 5

W roomie wiać tylko wartości (line[2] = 4 line[3] = 5), reszta wartości jest używana, lecz do czegoś czego gracz nie widzi. Co zrobić z tymi 2 pierwszymi wartościami żeby ich nie używał, nie przechowywał w pamięci itd!!!

 

Tymon:

U ciebie po naciśnięciu przycisku obiekt tworzy nowy punkt i kolejny i kolejny. Jeżeli polatamy w górę i w dół i tak z 30s będziemy mieli 900 punktów i z 10 linii. Dużo zmiennych, a tego chcę uniknąć.

Odnośnik do komentarza
Udostępnij na innych stronach

O, rzeczywiście. :) Nie zmodyfikowałem warunków, 3 linia:

GML (Step)
if( lines[linesCount - 1,1] != -1 )
i 13
GML
if( lines[linesCount - 1,1] != 1 )
Niedopatrzenie.

 

https://gmclan.org/up152_12_130410_gm8_lines_break.html

https://gmclan.org/up152_12_130410_gm8_lines_continue.html

Odnośnik do komentarza
Udostępnij na innych stronach

Tymon twój przykład to nie było to o co mi w 100% chodziło ale wpadłem na pomysł i sam sobie poradziłem.

GML
if line_count = 250

{for (l=0;l<50;l+=1)

{line_count = 50

line_x[line_count - l] = line_x[250 - l]

line_y[line_count - l] = line_y[250 - l]}}

U ciebie to by trochę inaczej wyglądało, ale no cóż xD

 

Dzięki wam wszystkim :thumbsup:

 

Zamykam

Odnośnik do komentarza
Udostępnij na innych stronach

Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.
  • Ostatnio przeglądający   0 użytkowników

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