Skocz do zawartości

Powtarzanie czynności jak REPEAT, ale co step?


ka21k

Rekomendowane odpowiedzi

Witam.

Rozmyślałem właśnie nad tym jak napisać kod podobny do REPEAT, ale żeby powtarzał mi dany blok programu co jeden step.

Wiadomo, że REPEAT czy pętla FOR wykonuje cały kod w jednym STEPie więc jeśli chciałbym żeby coś poruszyło się powiedzmy o 50 pikseli płynnie w prawo o jeden piksel co STEP to te funkcje nie zadziałają tak jak bym tego oczekiwał i przesuną obiekt o 50 pikseli za jednym zamachem.

Jak rozpisać kod który zadziała jak REPEAT (to było by najbardziej funkcjonalne i proste w użyciu dla mnie)?

Mam nadzieję, że temat nie okaże się zbyt trudny do rozgryzienia i macie jakieś pomysły na jego rozwiązanie.

Pozdrawiam.

Odnośnik do komentarza
Udostępnij na innych stronach

Tak. To rozwiązanie było by dobre tylko dla jednej czynności, ale co gdybym zechciał zrobić sekwencje ruchów obiektów? Można by za każdym razem inicjować zmienną "a", ale wtedy ten IF wykonywał by się także. Za drugiej strony mógłbym napisać kilkadziesiąt IFów dla poszczególnych obiektów tylko ile wtedy potrzebowałbym zmiennych? To stało by się niepraktyczne jeśli zechciałbym sterować w ten sposób kilkoma obiektami na raz.

Odnośnik do komentarza
Udostępnij na innych stronach

Poczytalem troche o tych Timelines i tak czy inaczej musialbym kozystac z instrukcji warunkowych zeby rozdzielic wykonywanie kodu do pojedynczych STEPow. Samo umieszczenie kodu w sekwencji timelines spowoduje tylko wykonanie go w odpowiednim czasie, ale nadal stanie sie to wszystko w jednej klatce. Musialbym napisac jakis skrypt np: REPEAT_STEP (ilosc wykonan) {instrukcje}; ktorym wykonywalby sie raz na STEP w programie az ilosc wykonan osiagnela by 0. Jak to zrobic?

Odnośnik do komentarza
Udostępnij na innych stronach

A gdzie tam, timelines działa tak samo jak image_index/speed. Co step wykonywany jest kod z jednego punktu na osi timelinów (w domyślnych warunkach, tj timeline_speed = 1). Twoim zadaniem jest tylko odpowiednia inicjalizacja osi. Nie wiem natomiast, czy timeliny są robione po wykonaniu step, czy przed.

Odnośnik do komentarza
Udostępnij na innych stronach

A gdzie tam, timelines działa tak samo jak image_index/speed. Co step wykonywany jest kod z jednego punktu na osi timelinów (w domyślnych warunkach, tj timeline_speed = 1). Twoim zadaniem jest tylko odpowiednia inicjalizacja osi. Nie wiem natomiast, czy timeliny są robione po wykonaniu step, czy przed.

 

Jak sam napisales jeden punkt z Timeline na jedna klatke wiec wracamy do punktu wyjscia. Pisac 50 punktow w Timeline z tym samym kodem chyba raczej bez sensu, a za drugiej strony mozna by wywolac 50 razy ten sam punkt w Timeline, ale do tego juz potrzeba osobnej instrukcji IF i zmiennej do zliczania tych wywolan. Wiec nadal stoimy w tym samym miejscu. Zastanawialem sie czy nie mozna by bylo napisac jakiegos dll z taka funkcja? Tym czasem pozostaje kombinowac inaczej. Swoja droga mogliby dodac taka funkcje w nastepnych odslonach GM. Co wy na to?

Odnośnik do komentarza
Udostępnij na innych stronach

GML
switch(image_index){

0:

//akcja1

break;

1:

//akcja2

break;

2:

//akcja3

break;

3:

//akcja4

break;

4:

//akcja5

break;

5:

//akcja6

break;

}

kazda kolejna akcja wykona sie co step, aby cos wykonalo sie kilka razy dodaj sobie zmienna pomocnicza i zatrzymaj klatke przez jakis czas i pusc dalej, np.

GML
[...]

break;

54:

if(a<30){

a+=1;

image_index=54;

//akcja

}

break;

55:

[...]

Odnośnik do komentarza
Udostępnij na innych stronach

Pierwszy skrypt nazwij action_system() i wywołaj go w Create:

GML
global.tab[0] = 0

global.scr[0] = ''

global.nr = 0

for(i = 0; i < 256; i += 1) { global.tab = 0; global.scr[0] = '' }

Drugi skrypt nazwij action_add(xtimes,gml), gdzie xtimes to liczba, ile razy ma być powtórzony w ciągu gry skrypt, a gml to ten kawałek kodu, który ma być wywoływany xtimes razy. Dajesz najlepiej tuż po action_system():

GML
global.tab[global.nr] = argument0

global.scr[global.nr] = argument1

global.nr += 1

Ostatni skrypt to action_perform(), który wywoła wszystkie akcje, które dodałeś funkcją action_add(xtimes,gml), daj to w Step, ale TYLKO jednego obiektu na mapie, tj. ma być wywoływany tylko raz na step:

GML
for(i = 0; i < global.nr; i += 1)

{

if(global.tab > 0) {global.tab -= 1; execute_string(global.scr)}

}

Niech ktoś dorobi do tego przykład, bo mi się nie chce :]

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ę...