Witamy w Nieoficjalnym polskim support'cie AMX Mod X
Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
|
Odrzucenie ciała po strzale, w tym od lotu kuli
#1
Napisano 21.09.2012 10:35
Kiedyś pisałem tutaj 2 razy chyba z prośbą, a dokładniej pytaniem jak zrobić, że gdy 'kule lecą w ofiarę od wschodu.. to on odlatuje na zachód', nie biorąc pod uwagi gdzie on się patrzy. Chodzi o typowy odrzut ciała jak to w filmach z strzelbami, ciało odrzuca. Najlepiej zilustruje to ten schemat (sorry za jakość, w painc'ie dobry nie jestem).
http://desmond.image...jpg&res=landing
(dałbym w znaczniki, ale nie obsługuje tego formatu..)
Chodzi mi o jakieś wydarzenie, jakąś funkcję.. najlepiej z wyjaśnieniem po polsku, a jeśli można to o zrobienie tego, a ja na tym zasadzie się nauczę po części operować tym łapaniem vektora od kul i przenoszenie bytu o xx unitow odwrotnie względem tych kul. Każdy po części gotowiec nie został na ślepo przeze mnie wklejony, tylko przeanalizowany, stestowany pod wieloma przypadkami i tak się edukuję. Z góry wielkie dzięki, minęło kilka dobrych miesięcy.. a ja dalej tego nie umiem, a jest mi to potrzebne do zrealizowania mojego projektu ; x
Irytuje mnie nieczytelny kod, jeśli oczekujesz ode mnie pomocy - zmień to !
#2
Napisano 21.09.2012 13:15
Chcesz wysłać do mnie PW ? użyj nazwy GoQ zamiast G[o]Q
Chcesz Kupić moduł płatności via Pukawka,Tserwery, Gamesol, Zabijaka do mojego sklepu? napisz PW cena to tylko 10 zł/sztuka
GG:6022845 (nie pomagam za free osobom ponizej rangi MoD)
#3
Napisano 21.09.2012 13:18
Irytuje mnie nieczytelny kod, jeśli oczekujesz ode mnie pomocy - zmień to !
#4
Napisano 21.09.2012 13:50
public odrzuc(attacker,victim){ new Float:vOrigin[3],Float:aOrigin[3]; new Float:Vec[3]; pev(attacker,pev_origin,aOrigin); pev(victim,pev_origin,vOrigin); for(new i=0;i<3;i++) Vec[i]=vOrigin[i]-aOrigin[i]; Vec[2]=100.0; set_pev(victim,pev_velocity,Vec); }
sprobuj taką funkcje wywołać odpowiednie w dmg'u i powiedz czy działa albo raczej jak działa
Chcesz wysłać do mnie PW ? użyj nazwy GoQ zamiast G[o]Q
Chcesz Kupić moduł płatności via Pukawka,Tserwery, Gamesol, Zabijaka do mojego sklepu? napisz PW cena to tylko 10 zł/sztuka
GG:6022845 (nie pomagam za free osobom ponizej rangi MoD)
#5
Napisano 21.09.2012 15:59
#6
Napisano 21.09.2012 16:19
Chcesz wysłać do mnie PW ? użyj nazwy GoQ zamiast G[o]Q
Chcesz Kupić moduł płatności via Pukawka,Tserwery, Gamesol, Zabijaka do mojego sklepu? napisz PW cena to tylko 10 zł/sztuka
GG:6022845 (nie pomagam za free osobom ponizej rangi MoD)
#7
Napisano 21.09.2012 16:22
Irytuje mnie nieczytelny kod, jeśli oczekujesz ode mnie pomocy - zmień to !
#8
Napisano 21.09.2012 16:51
Vec[2]=100.0;
zwiększ sobie tą liczbe i ewentualnie mozesz w tej pętli dać
Vec[i]=(vOrigin[i]-aOrigin[i])*liczba_float;
Chcesz wysłać do mnie PW ? użyj nazwy GoQ zamiast G[o]Q
Chcesz Kupić moduł płatności via Pukawka,Tserwery, Gamesol, Zabijaka do mojego sklepu? napisz PW cena to tylko 10 zł/sztuka
GG:6022845 (nie pomagam za free osobom ponizej rangi MoD)
#9
Napisano 21.09.2012 17:10
Irytuje mnie nieczytelny kod, jeśli oczekujesz ode mnie pomocy - zmień to !
#10 Gość_21977_*
Napisano 21.09.2012 18:49
Ten temat został zamknięty przez moderatora.
Powód: Pomoc udzielona
Jeśli się z tym nie zgadzasz, raportuj ten post, a moderator lub administrator rozpatrzy go ponownie.
Z pozdrowieniami,
Zespół AMXX.PL
#11
Napisano 23.12.2014 10:03
Ten temat został otwarty przez moderatora.
Powód: Temat otwarty na prośbę użytkownika.
Z pozdrowieniami,
Zespół AMXX.PL
Chcąc napisać do mnie prywatną wiadomość, wpierw zapoznaj się ze stroną "O mnie" w moim profilu użytkownika [ radim ] !
#12
Napisano 23.12.2014 12:03
Tak sobie patrzę na ten kod i wydaje mi się, że jeśli np. rzucę granata między siebie a gracza, pobiegne z jego drugiej strony to jego odrzuci wybuch, ale w strone granata, czy mam rację ?
\_O_/ \_O_/
| --. |
/ \ \ O / \ ^
\--------------------'
\_O_/ \_O_/
<------ | |
O / \ / \
Użytkownik grankee edytował ten post 23.12.2014 12:04
#13
Napisano 23.12.2014 14:35
Teoretycznie tak, ale ja teraz mam pewną zagadkę.
Ogólnie kod działał 'średnio', ale kombinowałem i tak:
public odrzuc(attacker,victim){ new Float:vOrigin[3],Float:aOrigin[3]; new Float:Vec[3]; pev(attacker,pev_origin,aOrigin); pev(victim,pev_origin,vOrigin); for(new i=0;i<3;i++) Vec[i]=(vOrigin[i]-aOrigin[i]) * 15.0 //Vec[2]=100.0; set_pev(victim,pev_velocity,Vec); }
Ale, jaki jest 'efekt' ? Zmieniłem kod na taki, aby gdy strzelam w gracza wyraźnie go odrzucało do tyłu (efekt osiągnąłem właśnie pomnożeniem różnic originów przez '15.0' <- taka wartość mnie zadowala), ale jest pewien problem.. Opiszę to w kilku słowach i zrobie schemat różnego typu sytuacji - co się dzieje.
1. attacker stoi na ziemi, victim też - odrzuca na odpowiednią odległość (na taką byłą dostosowany mnożnik różnic originów)
2. attacker stoi na ziemi, victim jest w powietrzu, spada / skoczyl wlasnie - odrzut jest nie zawsze w dobrą stronę, ale przewaznie tak, ale leci.. daleko bardzo
3. attacker stoi na ziemi, victim też, ale po przesunięciu o kilkanascie unitów.. bedzie w sytuacji 'wyskoczni' - leci bardzo bardzo daleko i szybko, przewaznie spadajac w koncu na ziemie - ginie.
sytuacja 4 (nie mam jej na screenie - zapomnialem), jesli agresor jest nad victimem i w niego strzela gdy victim na ziemi - również działa prawidłowo.
długość strzałki symbolizuje moc (dystans) jaki pokonuje ofiara podatna na odrzut w różnych sytuacjach
Ogólnie syt 2 i 3 rzadziej się powinna pojawiać, ale nie mogę tego olać bo chodzi o serwer surf, gdzie takich 'wyskoczni jest mnóstwo', a gracze przeważnie (ALE NIE ZAWSZE) są w powietrzu.
Może ma to coś z fizyką ? Nie ma tarcia o podłogę i dlatego odrzut jest znacząco większy ? Nic na ten temat nie wiem, a jeśli tak.. jak zrobić, by odrzut w sytuacji 2 i 3 byl podobny do tego z sytuacji 1 ? Żeby we wszystkich sytuacjach pracując na jednym kodzie, odrzut był zbliżony. ?
Pozdrawiam i z góry dzięki za pomoc.
Irytuje mnie nieczytelny kod, jeśli oczekujesz ode mnie pomocy - zmień to !
#14
Napisano 23.12.2014 18:56
1. W zależności od tego, w jakim stanie jest victim, zwiększaj lub zmniejszaj mnożnik. Np gdy jest w powietrzu, myślę że mnożnik ok 2-3 będzie w sam raz. Gdy kuca również możesz zmniejszyć mnożnik, będzie bardziej realnie
2. Jeśli victim znajdzie się w powietrzu tuż po odrzuceniu go, wyhamuj go lekko. Do tego chyba będziesz musiał określić mniej więcej jak długo trwa odrzut i w thinku sprawdzać, czy minęło X czasu od odrzucenia i gracz nie zmienił swojego stanu.
NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
#15
Napisano 23.12.2014 19:32
1.
w powietrzu
stock bool:is_user_jumping(id){ new Float:fVelo[3]; pev(id, pev_velocity, fVelo); return fVelo[2] ? true : false; }
gdy kuca
stock bool:is_user_crouching(id){ new Float:fMinsize[3]; pev(id, pev_mins, fMinsize); if(fMinsize[2] == -18.0) return true; return false; }
2. nie ogarniam thinków itd.. mogę zrobić taska z odpowiednim czasem (potestuje), w ktorym bedzie sprawdzenie czy gracz jest w powietrzu (uzyje znow is_user_jumping(index)), ale jak go wyhamować ? Wpływ fizyki w amxx to dla mnie magia, przeważnie szukam kodów w sieci i tylko ich wartości odrobine zmieniam. Nie wiem jak działają wektory, kąty etc (jak na nie wpłynąć) - chociaż jestem technikiem geodetą
Irytuje mnie nieczytelny kod, jeśli oczekujesz ode mnie pomocy - zmień to !
#16
Napisano 23.12.2014 23:17
new flags=pev(id, pev_flags) if(flags&FL_ONGROUND || flags&FL_PARTIALGROUND)//ew. FL_PARTIALONGROUND jak tego kompilator nie przepusci-nie pamiętam jak jest prawidłowo. { //kod gdy stoi na ziemi }
tak sprawdzisz czy jest na ziemi, velocity sprawdzanie nie jest do końca dobre, bo moze podskoczyc na schodku itp i nie jest w stanie lotu, a wykryjesz ze jest, ponadto w momencie zmiany velocity czyli w najwyzszym punkcie przez moment jest 0.00
Ja bym tu się czepił innej rzeczy niż tego w jakim stanie jest victim, to może i jest problem, ale żeby go rozwiązać najpierw trzeba rozwiązać inną sprawę.
Załóżmy, że odległość atakera od ofiary to 10 we wszystkich plaszczyznach, wtedy nadamy mu predkosc 10*15=150 w kierunku przeciwnym do atakera, ok, ale jesli victim stoi w odleglosci 200 od atakera to nadamy mu velocity 200*15 czyli 3000, spora rozbieżność co nie?
Moim zdaniem trzeba tu raczej zastosować proporcje. Trzeba tylko pomysłu jak przelozyc 3 wymiarowe velocity na predkosc, potem ustalic z jaka predkoscia ma odrzucac i nadac proporcjonalnie odpowiednie velocity w trzech kierunkach. Chory jestem i nie mam pomyslu jak to ugryzc.
#17
Napisano 23.12.2014 23:55
Wiem, że rozwiązaniem byłoby skorzystanie z tracelinu, ale nie ogarniam tego.. Wcale Wtedy tylko można by było wydłużyć ten tracelin (tez nie wiem jak) i dodac mu stałą wartość do odrzutu (predkosci/velocity)
Ale + za rozkmine, bo bym nawet nie pomyślał o tym
Irytuje mnie nieczytelny kod, jeśli oczekujesz ode mnie pomocy - zmień to !
#18
Napisano 24.12.2014 03:06
Postaram się coś naskrobać tożto tylko matematyka.. Nie mam jak sprawdzić więc odpisz jakby co.
//Edit
Ok po kilku chwilach rozkminy obczaiłem, że twierdzenie pitagorasa działa w dowolnej ilości wymiarów:D Pewnie mówili w szkole, ale byłem w kafejce i grałem w cs'a i teraz sam muszę takie wnioski wyciągać
odrzut(attacker,victim,Float:value) { new Float:vOrigin[3],Float:aOrigin[3]; new Float:Vec[3]; pev(attacker,pev_origin,aOrigin); pev(victim,pev_origin,vOrigin); for(new i=0;i<3;i++) Vec[i]=(vOrigin[i]-aOrigin[i]) new Float:odleglosc odleglosc=floatsqroot(Vec[0]*Vec[0]+Vec[1]*Vec[1]+Vec[2]*Vec[2]) new Float:przelicznik=value/odleglosc for(new i=0;i<3;i++) Vec[i]*=przelicznik set_pev(victim,pev_velocity,Vec); }
Spróbuj różne wartości i zobacz czy będzie za każdym razem odrzucało z tą samą siłą przy jednej wartości, ale zmieniaj odległość od atakowanego gracza. W ogóle porób testy. Najpierw skup się czy dobrze działa na ziemi, a dopiero dalej testuj w powietrzu.
Użytkownik grankee edytował ten post 24.12.2014 04:50
#19
Napisano 24.12.2014 13:26
Pierwsza sytuacja, którą dostrzegłem to bardzo duże wartości, próbowałem 15..0, 30.0, 50.0, dopiero po kilku setkach zacząłem zauważać coś Ale przyjrzałem się potem temu i miało to sens, tak więc na kilku tysiącach efekt był taki
#edit: tak patrze na tego screena i dalej testuje, niebieska linia mi nie wyszła, dużo bliżej 'północy' - środka.. jakby azymuty się zmniejszały w 1 ćwiartce i powiększały w 4..
Irytuje mnie nieczytelny kod, jeśli oczekujesz ode mnie pomocy - zmień to !
#20
Napisano 24.12.2014 22:46
new Float:przelicznik=value/odleglosc
Przy takim przeliczniku gdy gracze stoją tuż obok siebie to odrzut będzie tak duży, że roztrzaska nim o ścianę
Proponuję:
new Float:przelicznik=(value+1)/odleglosc
to już wyeliminuje ten problem. Pamiętajmy też, że przy takim liczeniu odrzutu przy dużych odległościach różnica będzie bardzo znikoma.
NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
Użytkownicy przeglądający ten temat: 0
0 użytkowników, 0 gości, 0 anonimowych