Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Problem z d&d
Maciek316
post 31.03.2012, 14:28:23
Post #1





Grupa: Zarejestrowani
Postów: 93
Pomógł: 0
Dołączył: 31.03.2012

Ostrzeżenie: (0%)
-----


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ć?
Go to the top of the page
+Quote Post
tolomei
post 31.03.2012, 18:36:20
Post #2





Grupa: Zarejestrowani
Postów: 450
Pomógł: 135
Dołączył: 18.11.2010
Skąd: Wschowa

Ostrzeżenie: (0%)
-----


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


--------------------
“ Computers are good at following instructions, but not at reading your mind. ”
- Donald Knuth
Go to the top of the page
+Quote Post
Maciek316
post 25.06.2012, 16:22:47
Post #3





Grupa: Zarejestrowani
Postów: 93
Pomógł: 0
Dołączył: 31.03.2012

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
tolomei
post 27.06.2012, 08:03:46
Post #4





Grupa: Zarejestrowani
Postów: 450
Pomógł: 135
Dołączył: 18.11.2010
Skąd: Wschowa

Ostrzeżenie: (0%)
-----


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


--------------------
“ Computers are good at following instructions, but not at reading your mind. ”
- Donald Knuth
Go to the top of the page
+Quote Post
Maciek316
post 27.06.2012, 09:05:30
Post #5





Grupa: Zarejestrowani
Postów: 93
Pomógł: 0
Dołączył: 31.03.2012

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
tolomei
post 27.06.2012, 10:33:28
Post #6





Grupa: Zarejestrowani
Postów: 450
Pomógł: 135
Dołączył: 18.11.2010
Skąd: Wschowa

Ostrzeżenie: (0%)
-----


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.


--------------------
“ Computers are good at following instructions, but not at reading your mind. ”
- Donald Knuth
Go to the top of the page
+Quote Post
Maciek316
post 27.06.2012, 11:28:39
Post #7





Grupa: Zarejestrowani
Postów: 93
Pomógł: 0
Dołączył: 31.03.2012

Ostrzeżenie: (0%)
-----


Ok już wszystko zrobiłem, ale jak odróżnić przedmiot zakładany od zdejmowanego?
Go to the top of the page
+Quote Post
tolomei
post 27.06.2012, 14:07:14
Post #8





Grupa: Zarejestrowani
Postów: 450
Pomógł: 135
Dołączył: 18.11.2010
Skąd: Wschowa

Ostrzeżenie: (0%)
-----


A musisz odróżniać ?

Zarówno przy zakładaniu jak i przy zdejmowaniu musisz aktualizować wszystko w bazie.


--------------------
“ Computers are good at following instructions, but not at reading your mind. ”
- Donald Knuth
Go to the top of the page
+Quote Post
Maciek316
post 27.06.2012, 14:09:57
Post #9





Grupa: Zarejestrowani
Postów: 93
Pomógł: 0
Dołączył: 31.03.2012

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
tolomei
post 27.06.2012, 15:06:44
Post #10





Grupa: Zarejestrowani
Postów: 450
Pomógł: 135
Dołączył: 18.11.2010
Skąd: Wschowa

Ostrzeżenie: (0%)
-----


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.


--------------------
“ Computers are good at following instructions, but not at reading your mind. ”
- Donald Knuth
Go to the top of the page
+Quote Post
HgReed
post 11.07.2012, 09:37:44
Post #11





Grupa: Zarejestrowani
Postów: 59
Pomógł: 0
Dołączył: 13.11.2011

Ostrzeżenie: (0%)
-----


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...
Go to the top of the page
+Quote Post
tolomei
post 11.07.2012, 19:12:54
Post #12





Grupa: Zarejestrowani
Postów: 450
Pomógł: 135
Dołączył: 18.11.2010
Skąd: Wschowa

Ostrzeżenie: (0%)
-----


A ja myślałem, że autor pierwszego postu wykonał go sam smile.gif
Pozdrawiam prawdziwego autora smile.gif


--------------------
“ Computers are good at following instructions, but not at reading your mind. ”
- Donald Knuth
Go to the top of the page
+Quote Post
HgReed
post 11.07.2012, 20:25:21
Post #13





Grupa: Zarejestrowani
Postów: 59
Pomógł: 0
Dołączył: 13.11.2011

Ostrzeżenie: (0%)
-----


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.

Ten post edytował HgReed 12.07.2012, 15:24:59
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 25.07.2025 - 09:50