Autor Wątek: Android, Java - Zapisywanie odblokowanych postaci.  (Przeczytany 1778 razy)

Offline KYRCooler

  • Użytkownik

# Luty 24, 2013, 18:16:05
Cześć,

kończę właśnie swoją pierwszą grę na androida. Jest pewnie trochę słabo napisana, bo jestem w tym nowy i z wieloma rzeczami miałem problem podczas pisania, ale jakoś przebrnąłem. Jednak nie mogę sobie poradzić z zapisywaniem odblokowanych skórek dla postaci. Jest ich 27 i wszystkie mają być odblokowywane za wykonywanie misji. Jako, że jest to gra typu runner. To misje wyglądają tak: Pokonaj 200metrów itd. A więc w głównej pętli gry po zakończeniu gry sprawdzam czy jaki jest wynik i jeśli odblokował użytkownik jakąś z postaci. Ale nie wiem jak zapisać stan gry. Tak by po ponownym uruchomieniu, postacie odblokowane były już gotowe.       
]boolean Locked[] = new boolean[26];
for(z=0;z>=26;z++)
{
Locked[z] = true;
}

Tak zadeklarowałem by wszystkie były zablokowane. A potem odblokowywuje pierwszą. Czy ktoś ma jakiś pomysł jak zapisać które postacie są dostępne, a które nie?

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Liosan

  • Moderator

  • +1
# Luty 24, 2013, 19:13:04
Zainteresuj się możliwościami przechowywania danych lokalnie na Androidzie. Shared preferences, internal storage i SQLite to niezłe opcje; pewnie wybrałbym shared preferences, jeśli to jest tylko prosty string albo kilka propertiesów do zapisania.

Liosan

Offline KYRCooler

  • Użytkownik

# Luty 24, 2013, 19:22:08
Od tygodnia próbuję się uporać z SharedPreferences. Nie idzie, jest to nie wykonywalne dla mnie, czy mógłbyś mi pomóc np na jakimś czacie i powiedzieć jak to zrealizować.

I jeszcze jedno pytanie jeśli postać jest zablokowana chcę wyświetlać kłódkę, lecz       if(Locked[2]==true)g.drawImage(Assets.klodka, 400, 30); coś takiego nie działa. Czy wiesz w czym leży problem?

// -- edycja żeby tekst ładniej wyglądał -Liosan
« Ostatnia zmiana: Luty 24, 2013, 20:35:35 wysłana przez Liosan »

Offline Xion

  • Redaktor
    • xion.log

# Luty 24, 2013, 19:33:09
Cytuj
Od tygodnia próbuję się uporać z SharedPreferences. Nie idzie, jest to nie wykonywalne dla mnie (...)
Huh? Może mnie pamięć myli (nie kodowałem na Androida od ponad roku), ale o ile kojarzę to wyglądało jakoś tak:

- context.getSharedPreferences() żeby dostać obiekt SharedPreferences do czytania wartości
- do zmiany: najpierw edit() żeby dostać Editor, potem set...() i w końcu commit() żeby zapisać zmiany

Gdzie tu jest coś nad czym można utknąć tydzień? o.0
« Ostatnia zmiana: Luty 24, 2013, 19:35:02 wysłana przez Xion »

Offline KYRCooler

  • Użytkownik

# Luty 24, 2013, 19:36:45
Ponieważ moja głowna pętla gry nie jest Activity i nie wiem co podać jako wczytanie jako kontext. Hm nie wiem jak to wyjaśnić, ale to jest mój kod:
public static void saveScore(Context context, int score){
    SharedPreferences sharedPreferences = context.getSharedPreferences("YOUR_PACKAGE_NAME", Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putInt("SCORE", value);
    editor.commit();
}

public static int loadScore(Context context){
    SharedPreferences sharedPreferences = context.getSharedPreferences("YOUR_PACKAGE_NAME", Context.MODE_PRIVATE);
    int score = sharedPreferences.getInt("SCORE", 0);
    return score;
}
I nie wiem jak go wywowłać w pętli gry. Co podać jako argumenty.

Offline Liosan

  • Moderator

# Luty 24, 2013, 20:40:38
I jeszcze jedno pytanie
Po pierwsze, to staraj się formatować posty trochę ładniej; poprawiłem Twoje pytanie. Po drugie, nie rób śmieciowych wątków, w które wrzucasz wszystkie swoje problemy. Po trzecie, jeśli będziesz chciał zrobić oddzielny wątek na tę kłódkę, to dostarcz trochę więcej informacji - dlaczego "nie działa" (nic nie widać? widać tylko kłódkę? null pointer exception? a może pojawia się śmieszny animowany gif z pijanym mandrylem?), no i pokaż trochę więcej kodu (w szczególności jak się ma kod renderowania postaci do kodu renderowania nakładki, czy to jest ta sama metoda użyta, który jest wołany najpierw etc).

Ponieważ moja głowna pętla gry nie jest Activity i nie wiem co podać jako wczytanie jako kontext. Hm nie wiem jak to wyjaśnić, ale to jest mój kod:
Jeśli chcesz wyjaśnić, dlaczego Twoja pętla główna nie jest w Activity (a to ciekawe pytanie), to wkleiłeś nie ten kod ;)

Liosan

Offline KYRCooler

  • Użytkownik

# Luty 24, 2013, 20:55:27
A możesz pomóc z tymi savami? Jak zapisać stan tej tablicy boolean Locked[] i najlepszego wyniku. Coś w stylu if(points>highscore) // i tutaj kod na zapis, bo kompletnie nie wiem jak za to się zabrać.

Offline Liosan

  • Moderator

# Luty 25, 2013, 13:19:12
Trochę nie ogarniam jaki jest Twój aktualny problem... co nie działa?
- zapisywanie/odczytywanie czegokolwiek do propertiesów nie daje widocznych rezultatów?
- zapisywanie/odczytywanie czegokolwiek do propertiesów rzuca jakieś wyjątki?
- nie umiesz przetworzyć informacji z tablicy Locked na formę zapisywalną w propertiesach?

Czy o co chodzi? Mogę spróbować pomóc z save'ami, tylko powiedz najpierw jaki masz problem...

To jest zresztą dobre ćwiczenie na to, żeby sobie samemu z tym poradzić - znajdź najmniejszy problem jaki masz i spróbuj go rozwiązać. Jak wiesz, że umiesz zapisać, nie wiem, highscore do propertiesów, i że potem umiesz go odczytać, to wiesz że rozumiesz ten mechanizm i możesz próbować robić odblokowywanie postaci. Małe kroczki to lepsza metoda niż łupanie jednego problemu przez tydzień :)

Liosan

Offline KYRCooler

  • Użytkownik

# Luty 25, 2013, 20:08:11
Ok to wytłumaczę od nowa, może źle przedstawiłem problem, a więc mam static boolean Locked[] = new boolean[28]; Tablicę booleanów sprawdzających, która postać jest odblokowana. Np jeśli mam odblokowaną postać nr 4 Locked[4] = false; I teraz gdy użytkownik wyjdzie z gry chcę zapisać stan tej tablicy, by po następnym uruchomieniu Locked[4] nadal był false, a nie true jak pozostałe nie odblokowane postacie. Poprostu nie wiem jak zapisać tablicę przez SharedPreferences. Liczę na pomoc ;)

Offline Xion

  • Redaktor
    • xion.log

  • +1
# Luty 25, 2013, 20:45:35
Serializuj to do jakiejś stringowej postaci (np. oddzielonej przecinkiem) i używaj putString/getString.