Skocz do zawartości

O co chodzi - Wrong type of arguments to +


oLuju

Rekomendowane odpowiedzi

Hej, otóż postanowiłem wykonać w swojej grze konsole, dzięki której można zmieniać warunki danego obiektu. Sam kod w skrypcie wygląda tak:

GML
if(string_copy(keyboard_string,0,17)='szybkosc_biegania')

{

stara_szybkosc_biegania=gracz.szybkosc_biegania

gracz.szybkosc_biegania=string_replace(keyboard_string,'szybkosc_biegania ','');

keyboard_string='*** Zmiana szybkosci biegu z'+stara_szybkosc_biegania+' na '+gracz.szybkosc_biegania;

}

 

Niestety podczas wpisywania komendy wyskakuje taki błąd:

___________________________________________
ERROR in
action number 3
of Key Press Event for <Enter> Key
for object konsola:

In script konsola_komendy:
Error in code at line 15:
     keyboard_string='*** Zmiana szybkosci biegu z'+stara_szybkosc_biegania+' na '+gracz.szybkosc_biegania;
                                                    ^
at position 51: Wrong type of arguments to +.

 

Czym to może być spowodowane??

Odnośnik do komentarza
Udostępnij na innych stronach

musisz znać różnice między real, a string. GMS nie wie co robić, jak każesz mu wyświetlać zmienną liczbową.

GML
keyboard_string="*** Zmiana szybkosci biegu z"+string(stara_szybkosc_biegania)+" na "+string(gracz.szybkosc_biegania);

Dlatego trzeba zmienić real na stringa.

Odnośnik do komentarza
Udostępnij na innych stronach

Faktycznie, dzięki już działa :D

 

Mam jeszcze jedno pytanko, bo generalnie postanowiłem zrobić 2 komendy, dzięki którym będę wstanie zmieniać wszystkie zmienne bez dodawania dla każdej oddzielnej komendy w konsoli. Jak zmienić wartość zmiennej, której nazwa jest w zmiennej? Pewnie nikt nic nie wie, ale wytłumaczę to tak:

na początku do zmiennej 'warunek' podaję nazwę zmiennej w grze, czyli np.: 'szybkosc_biegania'. Następnie tworzę nową zmienna pomocniczą 'wartosc' do której przypisuje liczbe np.:3. Efektem końcowym ma być to: szybkosc_biegania=3. Użyłem czegoś takiego: warunek=wartosc ale nie działa. Da się to jakoś zrobić?

Odnośnik do komentarza
Udostępnij na innych stronach

Tablice asocjacyjne aka słowniki aka ds_map.

 

GML
mapa[?"stara_szybkosc_biegania"]

 

Ale ostrzegam. Nie rób tego. Niesamowicie Ci to spowolni grę jeżeli każda zmienna będzie pozycją w ds_map.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Ja to robię switchem właśnie. Do tego napisałem skrypt który potrafi zmieniać stringi na liczby nawet z przecinkami i znakiem minusa: http://www.gmlscripts.com/forums/viewtopic...?pid=3826#p3826

Odnośnik do komentarza
Udostępnij na innych stronach

Pomysł z używaniem ds_list wydaje mi się najlepszy, tylko nie wiem jak z tego korzystać i wyszło mi coś takiego:

GML
wartosc=string_replace(keyboard_string,'wartosc ','');

//zmienna=wartosc

ds_list_create()

ds_list_add(zmienna1, zmienna)

ds_list_insert(zmienna1, 1, wartosc)

Wcześniej ustaliłem w 'zmienna' nazwę zmiennej której wartość chce zmienić. Ten kod jest dobrze czy nie bardzo??

Odnośnik do komentarza
Udostępnij na innych stronach

Wcześniej ustaliłem w 'zmienna' nazwę zmiennej której wartość chce zmienić. Ten kod jest dobrze czy nie bardzo??

Bardzo źle. ds_list_create() zwraca ci ID struktury. Więc musisz je gdzieś zapytać i się do niego odwoływać w reszcie funkcji.

GML
lista=ds_list_create()

ds_list jest tak na prawdę zwykła tablicą. Więc przypisujesz jej wartości na poszczególne komórki. Nie możesz sobie wybrać żeby przypisało wartosc do zmienna. Możesz co najwyżej przypisać wartosc do którejś pozycji w tablicy. Zerowej, pierwszej, drugiej... etc. Oczywiście możesz zrobić zmienną która będzie przechowywać numer pozycji, ale nie to chcesz zrobić.

 

 

Ten przykład zapisze wartosc w komórce o numerze 1.

GML
wartosc=string_replace(keyboard_string,'wartosc ','');

lista=ds_list_create()

ds_list_insert(lista, 1, wartosc)

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Pamiętaj, żeby potem usuwac listy, bo zostaną w pamięci (nie znikają razem z obiektem jak zmienne, chociaż zmienna do której przypisałeś ID listy znika - zatem sama lista jest globalna, a zmienna w której trzyma się jej ID zależnie od ciebie - global, zwykła lub tymczasowa)

Odnośnik do komentarza
Udostępnij na innych stronach

Coś takiego?

 

GML
zmienna=string_replace(keyboard_string,'zmienna ','');

wartosc=string_replace(keyboard_string,'wartosc ','');

lista=ds_list_create()

ds_list_insert(lista, 1, zmienna)

lista=wartosc

Nie. Nie wiesz w jaki sposób działają struktury. Nie wiesz w jaki sposób działają listy i nie wiesz w jaki sposób działają zmienne. Zaprzestań tego co robisz i siądź do dokumentacji. To banalne, ale brakuje ci podstawowego zrozumienia.

 

 

Zacznijmy od początku:

 

Chcesz zrobić konsolę która pozwoli Ci zmieniać argumenty w obiekcie. Aby to zrobić musisz wyodrębnić 2 informacje: "Co" i "na ile" chcesz ustawić. Dobrze kombinujesz z keyboard_string, ale nie rozumiesz chyba jak działa string_replace(). Parsowanie stringu aby wyciągnąć z niego dwie dane to zagadnienie na osobny długi temat.

 

Mając obie informacje możesz działać. Jedynym sensownym rozwiązaniem jest porównywanie informacji wpisanej z konsoli z kluczem. Możesz to robić switch-em albo zwyczajnie if-em. Oba sposoby są równie dobre.

GML
switch (zmienna)

{

case "szybkosc biegania": szybkosc_biegania=wartosc; break;

case "szybkosc strzelania": szybkosc_strzalania=wartosc; break;

}

GML
if(zmienna="szybkosc biegania")

{

szybkosc_biegania=wartosc;

}

if(zmienna="szybkosc strzelania")

{

szybkosc_strzalania=wartosc;

}

 

I na tym powinieneś skończyć rozważania. To jest sposób w jaki powinno się to zrobić. Trzy kroki: Odczyt danych, parsowanie danych i porównanie do klucza. Później zaczęły się dywagacje na temat twojego drugiego pytania, na które od razu dostałeś odpowiedź:

Nie można tak zrobić.

 

Potem ediepl podał Ci nie kompletną odpowiedź. Jest to możliwe do zrobienia na tablicach albo listach... ale także na wiele innych sposobów. Natomiast nie powinno się tego robić. Powodów jest wiele:

Spowolnienie wykonywania kodu gry, bo zamiast odnosić się do pojedynczej zmiennej informacja musi być odnaleziona w tablicy (albo liście).

Błędy kompilacji, bo nie możesz być pewien czy dane których szukasz istnieją.

Złe zarządzanie pamięcią RAM. (Zapraszam do poznania struktur, a nawet architektury komputera na którym piszesz)

Zerowa czytelność. Bo teraz zamiast używać w swoim kodzie zmiennej musisz się odnosić do nieznanej tobie komórki w tablicy (albo liście).

 

Co jest czytelniejsze?

GML
if(keyboard_check_pressed(vk_right)) {

x+=szybksc_biegania

}

czy
GML
if(keyboard_check_pressed(vk_right)) {

x+=ds_list_find_value(lista_wszystkich_zmiennych,73)

}

73 jest numerem komórki który ty powinieneś pamiętać za co odpowiada. Tak jak każdy inny numer, każdej zmiennej jaką chcesz używać. Powodzenia.

 

 

Ja zaproponowałem użycie słowników. To rozwiązanie jest o tyle lepsze że wyklucza zapamiętywanie przez ciebie numerów komórek. Bo w słowniku nie ma komórek, zamiast tego są klucze, jak w prawdziwym słowniku. Łatwiej jest znaleźć coś w książce wiedząc że jest pod nazwą "szybksc_biegania", niż pamiętając że jest na 73 stronie. Różnica wygląda tak:

GML
if(keyboard_check_pressed(vk_right)) {

x+=ds_map_find_value(lista_wszystkich_zmiennych,"szybksc_biegania")

}

Ale to nie rozwiązuje żadnego z pozostałych problemów które opisałem. Wciąż jest to wolne, nie czytelne, będzie powodować masę błędów i nawet nie potrafisz sobie wyobrazić implementacji tego.

 

Tak więc zapomnij o tym wszystkim co opisałem, siądź do dokumentacji aby przeczytać jak działają wszystkie funkcje do obsługi stringów i zrób to na switchu. Nie kombinuj, bo to że można coś zrobić w jakiś sposób nie znaczy że powinno się to robić.

Odnośnik do komentarza
Udostępnij na innych stronach

OMG, chodzi mi oto że nie mam zamiaru tworzyć listy wszystkich zmiennych jakie są w grze bo równie dobrze mogę stworzyć dla każdej oddzielną komendę. Dlatego właśnie chcę stworzyć tylko 2 komendy: pierwszą w której wpisuje zmienną i drugą, którą ustalam wartość wyznaczonej zmiennej. Tyle. Po prostu potrzeba czegoś co przetrzyma ustali wartość zmiennej której nazwa jest zapisana w "czymś" np.: właśnie w tablicy, po to żeby się potem do niej odwołać jak do zwykłej zmiennej jak ta: to_jest_jakas_zmienna=489.

 

Nie. Nie wiesz w jaki sposób działają struktury.

Struktury tablic? Tak, nie wiem, ale się domyślam, to niczym Excel tylko, że na komendach.

 

Nie wiesz w jaki sposób działają listy...

A listy i tablice ... to to samo?? Bo ja z tego co mi się wydaje użyłem tablic.

 

...i nie wiesz w jaki sposób działają zmienne.

O realy? Udowodnij w jakiś cudowny i magiczny sposób, że nie wiem co to są zmienne i oświeć mnie Sherlocku.

 

Zaprzestań tego co robisz i siądź do dokumentacji.

Mhh... szkoda tylko, że dokumentacja podaje podstawowe informacje o działaniu danego kodu i randomowy przykład jego użycia.

 

Generalnie masz racje - zaprzestańmy dalej drążyć ten temat bo chyba do niczego już nie dojdziemy, a ponadto administracja forum zacznie się czepiać, że prowadzone dyskusje są nie na temat, bo ten został już rozwiązany 10 postów temu.

Odnośnik do komentarza
Udostępnij na innych stronach

Wszystkiego tu nie opisze ale masz chociaz listy i tablice:

 

Tablica to zmienna zawierająca wiele pozycji. Lista to struktura danych.

Tablica:

Zmienna[0] = 10;

Zmienna[1] = 20;

Zmienna[2] = 28;

 

Lista:

Zmienna = ds_list_create();

ds_list_add(Zmienna,10,20,28);

LUB

Zmienna[| 0] = 10;

Zmienna[| 1] = 20;

Zmienna[| 2] = 28;

 

Twoja pomyłka może brać się z dostępnośći accessorów które ułatwiają nawigacje po listach. Różnica jest taka, że ponieważ lista to struktura to można wykonywać na niej inne operacje takie jak znalezienie pozycji na ktorej jest pewna wartość, lub znalezienie wartości jaka jest na pewnej pozycji, podmiana wartości, usunięcie pozycji bez zaburzenia struktury czy wstawienie wartości pomiędzy dwiema pozycjami. Jednocześnie też w GMie nie sprawdzisz wielkości tablicy, ale wielkość listy możesz za pomocą ds_list_size

 

Listy są wyraźnie wolniejsze od tablic

 

Inne rodzaje struktur w GM to: ds_map, ds_grid

Odnośnik do komentarza
Udostępnij na innych stronach

No to odpowiem na te kilka pytań.

 

OMG, chodzi mi oto że nie mam zamiaru tworzyć listy wszystkich zmiennych jakie są w grze bo równie dobrze mogę stworzyć dla każdej oddzielną komendę.
Ale właśnie o to chodzi że o wiele szybciej będzie Ci stworzyć osobną komendę dla każdej zmiennej niż podmieniać wszystkie zmienna na wartości z tablic/list/słowników. Ale jeżeli jesteś uparty i masz ochotę stracić 2 dni na próbie zrobienia tego to zapraszam na koniec posta.

 

Struktury tablic? Tak, nie wiem, ale się domyślam, to niczym Excel tylko, że na komendach.

Tablica jest półką na ksiażki. Musisz tylko wiedzieć gdzie leży książka by ją wziąć.

Tablica dwuwymiarowa jest szafką z wieloma półkami. Musisz wiedzieć gdzie i na której półce leży książka.

Tablica trójwymiarowa to kilka szafek. Musisz znać 3 dane: Szafkę, półkę i pozycję.

Tablica czterowymiarowa to biblioteka podzielona na działy. Już chyba kapujesz.

Kolejka jest dosłownie kolejką. Ktoś kto przychodzi staje na jej końcu a obsługiwany jest ten co stał najdłużej.

Stos to bałągan, albo sterta kartek. Aby znaleźć tę która cię interesuje musisz najpierw zabrać te które leżą na niej.

Tablica asocjacyjna to słownik w którym wiedząc czego szukamy znajdziemy to bez problemu.

 

GM daje nam specjalne struktury:

ds_list który jest tablicą

ds_grid czyli tablicę dwuwymiarową

ds_map który jest słownikiem

ds_queue czyli kolejkę

ds_stack czyli stos

ds_priority_list który jest gówno wart.

 

Excel jest arkuszem kalkulacyjnym. Ale najbliżej mu do tablicy trójwymiarowej a nawet czterowymiarowej o ile się nie mylę.

 

 

A listy i tablice ... to to samo?? Bo ja z tego co mi się wydaje użyłem tablic.
I am vader opisał to dostatecznie dobrze.

 

O realy? Udowodnij w jakiś cudowny i magiczny sposób, że nie wiem co to są zmienne i oświeć mnie Sherlocku.
Pokazałeś to tym kawałkiem kodu:

GML
zmienna=string_replace(keyboard_string,'zmienna ','');

wartosc=string_replace(keyboard_string,'wartosc ','');

lista=ds_list_create()

ds_list_insert(lista, 1, zmienna)

lista=wartosc

Pomijając działania na stringu które nie działają. Stworzyłeś listę, wcisnąłeś jej string na pozycję 1 (insert to nie replace! Ja się wcześniej pomyliłem, ale to tylko znaczy że nie przeczytałeś jak działa), po czym nadpisałeś wskaźnik na listę innym stringiem.

 

Chcę oczywiście zauważyć że nie jest to wskaźnik rozumiany jako wskaźnik na komórkę pamięci. To tylko zmienna przechowująca ID struktury do której chcemy się odnosić.

 

 

 

Mhh... szkoda tylko, że dokumentacja podaje podstawowe informacje o działaniu danego kodu i randomowy przykład jego użycia.
Tak, nie jest idealna. Ale... W 98% podany przykład działa. Jeżeli chodzi o struktury to musisz poznać wszystkie ich funkcje. Nie ma ich dużo, ale dopiero znając pełną zasadę tworzenia struktury, zapisywania wraz z odczytywaniem z niej danych, a potem usuwania tych danych i struktury; dopiero wtedy będziesz mógł sobie wyobrazić jak działa.

Tak widziałem te 2% które nie ma prawa działać. :P

 

 

A teraz jak zrobić ten twój bezsensowny pomysł z użyciem tablic!

(spoiler: Nie spodoba Ci się bo i tak musisz stworzyć "komendę" dla każdej zmiennej. Na ds_map nie musiałbyś :P)

  1. W obiekcie kontrolerze (persistent obiekcie który zawsze będzie w grze) w create stwórz tablicę od i do 0. Tak, malejąca.
  2. Przypisz do komórek tablicy twoje startowe dane. Prędkość gracza czy co tam chcesz. W każdej komórce inna "zmienna"
  3. Na kartce papieru zapisz sobie co oznacza każda komórka tablicy. Czyli co wpisałeś w zerową, co w pierwszą, etc.
  4. Wszędzie w grze gdzie odnosisz się do tej zmiennej stwórz odwołanie do tablicy obiektu kontrolera. Najłatwiej będzie Ci nadpisywać wartość istniejących już zmiennych. Pamiętaj aby odnosić się do odpowiedniej komórki, bo inaczej to nie ma sensu.
  5. Odpal grę i sprawdź czy cokolwiek działa. Przed przejściem do kolejnego punktu wyeliminuj wszystkie błędy.
  6. Więc przejdźmy do twoich komend: Najpierw musisz w jakiś sposób parsować dane z twojej konsoli. Przejdź do kolejnego punktu gdy uda Ci się wyodrębnić 2 dane: Co i na ile ustawić.
  7. Musisz w jakiś sposób porównać to co wpisałeś w konsoli z twoimi zmiennymi. Dla tablicy i listy nie masz innego wyjścia niż to co zrobiłeś na samym początku. Musisz porównać czy twoja komenda to 'szybkosc_biegania' i przypisać wartość z komendy to odpowiedniej komórki tablicy. I tak dla każdej innej zmiennej.
  8. Gratulacje! Straciłeś kilkadziesiąt godzin, a i tak zrobiłeś to samo tylko bardziej skomplikowanie.

 

Alternatywa z ds_map.

  1. W obiekcie inicjatorze (taki który pojawia się tylko raz) w create stwórz globalne ds_map.
  2. Dodaj do ds_map twoje startowe dane. Prędkość gracza czy co tam chcesz. W każdym kluczu inna "zmienna". Nadaj im ładne nazwy jak: 'szybkosc_biegania'.
  3. Wszędzie w grze gdzie odnosisz się do tej zmiennej stwórz odwołanie do odpowiedniego klucza ds_map. W zależności jak do jakiej zmiennej przypisałeś utworzoną ds_map, coś takiego: global.slownik[?"szybkosc_biegania"]
  4. Odpal grę i sprawdź czy cokolwiek działa. Przed przejściem do kolejnego punktu wyeliminuj wszystkie błędy.
  5. Więc przejdźmy do twoich komend: Najpierw musisz w jakiś sposób parsować dane z twojej konsoli. Przejdź do kolejnego punktu gdy uda Ci się wyodrębnić 2 dane: Co i na ile ustawić.
  6. Musisz w jakiś sposób porównać to co wpisałeś w konsoli z twoimi zmiennymi. Nie ma problemu bo w konsoli możesz podawać nazwę klucza. Więc jeżeli zrobisz sobie komendę w konsoli typu: "szybkosc_biegania=12" i umiesz to sparsować to wystarczy że dla klucza "szybkosc_biegania" w mapie nadpiszesz wartość 12.
  7. Gratulacje! Działa.

 

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