Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z d&d
Forum PHP.pl > Forum > XML, AJAX > AJAX
Maciek316
Witam, mam taki problem, ponieważ zrobiłem skrypt przenoszenia i upuszczania z pomocą poradnika, i tu się pojawił problem. Mogę założyć 2 zbroje oraz 2 bronie, próbowałem to naprawić i faktycznie na pierwszy rzut oka, działa. Tu dam kod:
http://jsfiddle.net/SWu3B/2/
Ale załóżcie 1 broń i 1 zbroje, a potem poprzenoście zbroje nr 2 i bron nr 2 w inne miejsce, niech się pozamieniają kolejnością i spróbujcie je założyć, u mnie zakłada 2 zbroje i 2 bronie;/ Jak to naprawić?
tolomei
Witaj.

Trochę przetestowałem Twój skrypt i znalazłem błąd w drugiej linii JavaScriptu.

Kod
$(slot).find('id', 'class');


Szczerze to nie wiem czemu są dwa parametry, w każdym razie szukasz w tej linijce odpowiednio elementów <id> oraz <class>, a jak wiadomo takie elementy nie istnieją i nie będą istnieć.
Zamiast powyższego - ustaw jeden parametr tak jak tutaj:

Kod
$(slot).find('div');


Wtedy sprawdzamy czy nasz slot zawiera jakiś przedmiot.

Z grubsza to by rozwiązywało Twój problem wymieniony w poście, lecz ja zauważyłem kolejny błąd.
Mianowicie po wykonaniu akcji jakie opisałeś w poście - czasami udaje się >>podmienić<< przedmioty.
Mam na myśli sytuację, gdy slot broni zawiera broń1 i przeciągniemy na niego broń2 to one zamieniają się miejscami.
Dzieje się tak czasami, lecz nie zawsze.

Nie wiedziałem na jakim efekcie Ci zależy więc zrobiłem w dwóch wariantach:
Wariant Pierwszy - brak podmiany:
- link: http://jsfiddle.net/SWu3B/12/
- zmiana: dodane linie 21 oraz 22
Wariant Drugi - włączona podmiana:
- link: http://jsfiddle.net/SWu3B/14/
- zmiana: dodane komentarze w liniach
- od 28 do 31
- od 34 do 37

Jeśli, tak jak piszesz, uczysz się tego wszystkiego - postaraj się zrozumieć dlaczego wprowadziłem takie, a nie inne zmiany.
Niestety nie jest to realnie możliwe do wytłumaczenia w tym poście, ale w razie chęci kontaktu - zapraszam na priv.

Dodatkowo podpowiem, abyś do testowania swoich skryptów wykorzystywał:
- podgląd na żywo zmieniających się elementów oraz atrybutów html,
- konsoli JavaScriptu, gdzie możesz sprawdzać wartości zmiennych w trakcie działania skryptu,
- polecenia console.log(text), dzięki któremu możesz wypisywać zmienne do konsoli w celu sprawdzenia wartości.

To wszystko osiągniesz przy wykorzystaniu Chrome Tools lub Firebug w Firefoxie. Ja polecam opcję pierwszą.

Pozdrawiam smile.gif
Maciek316
Dzięki Ci wielkie, właśnie o taki efekt mi chodziło żeby było bez podmiany smile.gif

A może mi ktoś powiedzieć jak zrobić żeby po upuszczeniu przedmiotu do ekwipunku, lub potem do inwentarza robiło update do bazy danych?
Czytałem coś na ten temat, lecz niestety wiele z tego nie zrozumiałem.
tolomei
Witaj ponownie po tak długim czasie smile.gif

Fajnie, że nie porzuciłeś tego skryptu - fajna zabawa.

Odpowiadając na Twoje pytanie ustalmy co dokładnie chcesz zrobić.
Po przeniesieniu/zdjęciu elementu z ekwipunku powinieneś pobrać zawartość całego ekwipunku.
Sprawdzasz jakie elementy zawierają div.slot.weapon oraz div.slot.armor.
Jednak w takim przypadku na wierzch wychodzi jeden problem - przy przenoszeniu elementów kasowane jest ich id.
Poprawione tutaj: http://jsfiddle.net/SWu3B/18/

Dalej potrzebujemy przesłać dane za pomocą funkcji $.ajax() do serwera.
Przesyłamy dane za każdym razem, gdy zawartości Twoich slotów zmieniają się.
Tak się składa, że możemy tę funkcję podpiąć do bloku na samym dole:
http://jsfiddle.net/SWu3B/21/

Jeśli nie miałeś styczności z funkcją $.ajax(), w internecie na pewno znajdziesz jakiś kurs.
Polecam: http://www.altcontroldelete.pl/artykuly/aj...-json-w-jquery/

Odbierając dane po stronie PHP będziesz miał odpowiednie dane w tablicy post:

  1. (
  2. [bron] => 51121
  3. [zbroja] => 0
  4. )


Wystarczy odebrać i zapisać do bazy.

W razie problemów - daj znać.
Maciek316
Od razu dziękuje za pomoc.
Możesz mi to jeszcze trochę objaśnić, żebym w przyszłości nie miał nie jasności?
  1. $.ajax({
  2. url: 'user/ekw.php',
  3. type: 'post',
  4. data: {
  5. bron: bronid,
  6. zbroja: zbrojaid
  7. }
  8. });

Domyślam się że link wtedy będzie wyglądał tak:
  1. user/ekw.php?bron=51121?zbroja=0

Jeśli tak, to muszę to przechwycić w pliku php a następnie ułożyć zapytanie. Czy tak?
I o co chodzi z tablicą, mam ją zrobić, czy to służyło jako podpowiedź.
Z góry dzięki.
tolomei
W momencie takiego użycia funkcji ajax() uzyskasz połączenie jak po wysłaniu formularza z danymi.
Jest to połączenie POST więc wyciągasz dane z tablicy $_POST - tak jak odbiera się formularz.

Tablica, którą Ci wypisałem jest właśnie tą przykładową tablicą $_POST z danymi przychodzącymi z ajaxa.

Mam nadzieję, że jasno wyjaśniłem.
Maciek316
Ok już wszystko zrobiłem, ale jak odróżnić przedmiot zakładany od zdejmowanego?
tolomei
A musisz odróżniać ?

Zarówno przy zakładaniu jak i przy zdejmowaniu musisz aktualizować wszystko w bazie.
Maciek316
No tak, ale przy zakładaniu robię update do tabeli users w kolumnie dajmy na to weapon z 0 na 1 (id broni), a potem jak ją przerzucam do bp to chcę zrobić update żeby znowu było 0.
tolomei
Dane są przesyłane do serwera zarówno przy zdejmowaniu jak i zakładaniu ekwipunku.
Przy każdym wywołaniu kryptu php aktualizujesz dane. Czyli masz i zakładanie, i zdejmowanie.
HgReed
Nie wierzę - wy jeszcze mój skrypt maglujecie? Nie sądziłem, że komukolwiek się przyda biggrin.gif Nawet CSS i rozmiar pozostał...

Co do tematu - nie wiem, jak łączysz się z bazą, ale najlepszym wyjściem będzie tu ORM jakiś. Będziesz mieć wtedy klasę (u mnie np. Inventory), w której masz slot (atrybut) na każdy założony przedmiot i x slotów na "plecak". Takie wyjście jest bardzo wygodne - możesz napisać np. metodę do sprawdzania, czy postać ma dany przedmiot (foreach slot i sprawdzasz ID).

Wstawiłbym kawałki kodu - tak "dla pokoleń", ale piszę to w pythonie...
tolomei
A ja myślałem, że autor pierwszego postu wykonał go sam smile.gif
Pozdrawiam prawdziwego autora smile.gif
HgReed
Znaczy się tak... Skrypt już dawno temu gdzieś "zaginął" na tym forum, a pierwszym "problemem" był wszędzie-stawialny item... Potem tak poszło i poszło... Teraz tak myślę, żeby do niego wrócić i udoskonalić go...

Mam taki pomysł: zrobić listę (js to będzie []) dostępnych klas przedmiotów (wszystkie zakładalne + używalne i wszelaki crap), z której to będzie (nie)możliwe przesunięcie/założenie czy użycie danego przedmiotu. Oto "zamysł":
Kod
var classes = ['weapon', 'armor']; #i 1000 innych
#i zamiast
$('.slot.weapon').droppable({
        accept: '.item.weapon',
        drop: function() {
            $(this).droppable('disable');
        }
});
#dla każdej klasy
#zrobić jedno
$.each(classes, function(key, value) {
    $('.slot.' + value).droppable({
        accept: '.item.' + value,
        drop: function() {
            $(this).droppable('disable');
        }
    });
});

I jeszcze to samo w funkcji $('#bagpack').droppable({drop ...});. Takie rozwiązania, to dopiero anty-hard-code (hard code'owanie, to najgorsze co może być - wiem z własnego doświadczenia).


#EDIT:
Jak pomyślałem, tak i zrobiłem - link do fiddle'a: LINK
By zrobić więcej klas (typów przedmiotów), to dopisujemy je do zmiennej classes.

#EDIT 2:
Jeżeli ktoś chce z tego korzystać "przemysłowo" - korzystajcie. Tylko mała rada - zamiast ID w postaci cyfry, lepiej dać im jakiś prefix (np. id="item_1") - zmiana dosłownie kosmetyczna (uwzględnić ją tylko w JS!), a pozwoli zaoszczędzić nerwów.

#EDIT LAST:
No i tak - pomysł mnie wciągnął z powrotem. Tu podaje link do fiddle'a: LINK. Tam jest cała klasa DnD (którą będę rozwijał) oraz przykład z 9 klasami przedmiotów.
Wymaga ona jQuery i jQuery UI.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.