Skocz do zawartości

Rudy

Użytkownicy
  • Postów

    154
  • Dołączył

  • Ostatnia wizyta

Treść opublikowana przez Rudy

  1. Ok, mój błąd :D . Żeby nie ujawniać szczegółów projektu wpisałem tutaj kod, który powoduje ten sam problem, lecz to nie ten sam kod, co u mnie. W konstruktorze kopiującym dałem po prostu zły znak w pętli kopiowania ;) . Dzięki za pomoc, temat uważam za zamknięty ;) .
  2. Nie rozwiązuje problemu. Dane klasy - wyniku tracą się wraz z wyjściem z funkcji dodawania.
  3. Faktycznie, Visual odpala (bez zmiany konstruktora kopiującego, ale jednak go wymaga), C::B wciąż ma problemy. Będę kontynuował na Visualu, trzeba tylko jeszcze rozwiązać problem przekazania lokalnego wyniku dodawania. Jak to można zrobić?
  4. Kompilator: GCC (MinGW) w Code::Blocks (we Visualu nie wykrył błędu, ale wysypał się) Dodałem coś takiego: Array(Array& aRight) : dwCount(aRight.GetCount()) { dwValue = new DWORD[dwCount]; for (DWORD dwIndex = 0; dwIndex < dwCount; ++dwIndex) dwValue[dwIndex] = aRight[dwIndex]; } Myślę, że dobrze, błąd jednak się powtarza.
  5. Witam. Mam pewien problem, otóż chcę zrobić klasę (coś w rodzaju tablicy) z własnymi operatorami. Kod wygląda mniej więcej tak: #include <cstdio> using namespace std; typedef unsigned char BYTE; typedef unsigned int DWORD; template <typename T1, typename T2> inline T1 min(T1 v1, T2 v2) { return (v1 > v2) ? v2 : v1; } template <typename T1, typename T2> inline T1 max(T1 v1, T2 v2) { return (v1 < v2) ? v2 : v1; } class Array { private: DWORD* dwValue; const DWORD dwCount; public: Array(DWORD dwNumber = 1) : dwCount(dwNumber) { dwValue = new DWORD[dwCount]; } Array(Array& aRight) : dwCount(aRight.GetCount()) // edycja { dwValue = new DWORD[dwCount]; for (DWORD dwIndex = 0; dwIndex < dwCount; ++dwIndex) dwValue[dwIndex] = aRight[dwIndex]; } ~Array() { delete[] dwValue; } DWORD GetCount() const { return dwCount; } DWORD& operator[](DWORD dwIndex) { return dwValue[dwIndex]; } Array& operator=(Array& aRight) { if (this != &aRight) { DWORD dwCopy = min(dwCount, aRight.GetCount()); for (DWORD dwIndex = 0; dwIndex < dwCopy; ++dwIndex) dwValue[dwIndex] = aRight[dwIndex]; } return *this; } }; Array operator+(Array& aLeft, Array& aRight) { Array aRet; DWORD dwAdd = min(aLeft.GetCount(), aRight.GetCount()); for (DWORD dwIndex = 0; dwIndex < dwAdd; ++dwIndex) aRet[dwIndex] = aLeft[dwIndex]+aRight[dwIndex]; return aRet; } int main() { Array value1(1); Array value2(1); value1[0] = 8; value2[0] = 25; value1 = value2; value1 = value1+value2; return 0; } Kompilator wypisuje coś takiego: In function `int main()': error: no match for 'operator=' in 'value1 = operator+(Array&, Array&)(((Array&)(&value2)))' note: candidates are: Array& Array::operator=(Array&) === Build finished: 1 errors, 0 warnings === Problem, jak zakładam będzie w miejscach występowania referencji (gdzieś powinna/nie powinna być). Przy okazji chciałbym się spytać, czy wymagany jest tu konstruktor kopiujący i jaka powinien być jego prototyp. Wszelkie dodatkowe rady również mile widziane :)
  6. A no faktycznie jest :) . Tylko tutaj pojawia się problem, jak trzymać jednocześnie Ctrl, Num- i myszkę :P (da się korzystając z prawego ctrl, ale nie jest to wygodne)
  7. Rudy

    [c++] 4 pytania

    Nie napisałem, że się nie da, tylko że domyślnie on czegoś takiego nie ma. Pętla w konsoli pracuje tak szybko, jak potrafi, nie jest przez nic kontrolowana (domyślnie). Trafienie z wartością twoim sposobem graniczy z cudem. Chyba, że inna funkcja będzie kontrolowała fps, wtedy ok (pod warunkiem, że jest, ale osobiście rzadko się z czymś takim spotykam)
  8. Rudy

    [c++] 4 pytania

    Platyna: Nie da rady, Konsolowy C++ nie ma żadnych ograniczeń co do fps. 1. Zależy z jakich bibliotek korzystasz. Nie wiem, czy na iostream się da, ale wiem na pewno że cstdio potrafi coś takiego. Pisałeś już w bibliotece we/wy dla C? 2. Potrzebne będzie biblioteka ctime, i zmienna clock_t alarm: int main() { clock_t alarm; alarm = clock() + 10 * CLOCKS_PER_SEC; // ustawiamy alarm na 10s // jakieś operacje w pętli programu if (alarm <= clock()) { printf("Wykonuje alarm\n"); // to samo przez strumienie: // cout << "Wykonuje alarm" << endl; } // ciąg dalszy operacji return 0; } Ten kod działa tylko, gdy program posiada pętlę główną (ale wtedy nie zatrzymuje pracy programu), jeśli nie masz czegoś takiego zmień if na while, a znak <= na > . Jeśli chcesz zrozumieć funkcje, odsyłam TUTAJ. 3. Nie wiem, jak w standardzie, ale na WinAPI można to zrobić. Miałeś z nim kiedyś styczność? Edit: o to mi chodziło, co napisał PsichiX. 4. Tutaj Platyna ma rację. Możesz jednak kombinować z zapisem bitowym, nie za pomocą tekstu, uzyskasz podobną do game_save() "nieczytelność" pliku :) .
  9. To ja też napiszę co nieco o MS Paint. W starszych jego wersjach (Win98) była możliwość powiększania i pomniejszania obiektów z pomocą Num+ i Num-. Chodzi o to, że teraz ma sie tylko 5 grubości linii, 3 wielkości spraya itd, a w starszych wersjach można było ustalić własną wielkość, np spray o średnicy 200px. Swoją drogą nie wiem, czemu to usunęli, ja w każdym razie przechowuję na kompie starą wersję painta ;D .
  10. Ten kod rozwiązuje to inaczej. Nie powoduje wyznaczenia jednego punktu każdemu obiektowi i teraz "pchajcie cie wszyscy" (chociaż ten spósób też jest niezły :) ). Z pewnością grałeś w Kozaki, czy którąś z serii Earth... albo jakąkolwiek strategię ;) . W większości gier strategicznych jest możliwość ustawienia jednostek w formacji. Ten kod na to ci pozwala. Pisałem go z głowy, dlatego jest tam parę błędów, ale całość działa. TUTAJ MASZ LINK DO PRZYKŁADU EDIT: Niestety nie mam siódemki, dałem więc w kodzie z osiem. Lepsze to niż nic. Spróbuj jeszcze otworzyć kopię zapasową: TUTAJ
  11. Miałem podobny problem, rozwiązałem go przez tworzenie formacji :) . Trochę to może być skomplikowane i wymaga obiektu kontrolnego i tablicy zaznaczonych obiektów, ale wszystko da sie zrobić. Ogólnie to wyglądało tak: Obiekt kontrolny: Create GML // Tworzymy jakąś formację, np linię // Każdy obiekt formacji (indeks) posiada inne współrzędne względem pierwszej pozycji // Nie wpisujemy tutaj odległości, tylko jakby taki mnożnik, żeby działało i na duże i małe obiekty // Zauważ, że formacja obsługuje maksymalnie 5 jednostek, musisz dopisać resztę (ewentualnie wymyślić funkcję) formation_line_num = 5; formation_line_x[0] = 0; formation_line_y[0] = 0; formation_line_x[1] = 0; formation_line_y[1] = 1; formation_line_x[2] = 0; formation_line_y[2] = -1; formation_line_x[3] = 0; formation_line_y[3] = 2; formation_line_x[4] = 0; formation_line_y[4] = -2; //Tworzymy tablicę zaznaczonych obiektów // select_size_max będzie wyznaczało wielkość największej jednostki. Każda jednostka musi mieć // stworzoną zmienną size, która będzie mówiła, jak wielki jest promień wokół jednostki select[0] = -1; select_num = 0; select_size_max = 0; // Tworzymy zmienne potrzebne do zaznaczania. Od teraz wszystkie operacje // zaznaczania (najlepiej również odrysowanie pasku życia nad obiektem) będą // należały do tego obiektu xx = 0; yy = 0; zaznacz = false; Obiekt kontrolny: Global Left Pressed GML // Zaczynamy zaznaczenie xx = mouse_x; yy = mouse_y; zaznacz = true; Obiekt kontrolny: Global Left Release GML // Obiekt kontrolny powinien być pierwszą instancją. Musi wyzerować tablice zaznaczeń zanim // obiekty zaczną się do niej "wpisywać". Chyba, że chcesz dodanie do zaznaczenia. W sumie nic trudnego :D if (!keyboard_check(vk_shift)) { select_num = 0; select_size_max = 0; zaznacz = false; // EDIT: dopisałem tutaj zmianę znacznika, zapomniałem o tym } Wszystkie obiekty do zaznaczenia: Create GML // Musimy dodać parę zmiennych potrzebnych do chodzenia des_x = 0; des_y = 0; action = "stój"; des_speed = 5; // akcje lubię pisać w ciągu znaków. Więcej zajmuje, ale wiadomo, co obiekt robi :) . // Można również skorzystać ze stałych // Dodajemy również zmienną size size = 50; Wszystkie obiekty do zaznaczenia: Global Left Release GML // Samo zaznaczenie będzie wykonywane przez obiekt, który może być zaznaczony. // Sprawdzanie, czy obiekt znajduje się w środku zaznaczenia if (x >= min(obiekt_kontrolny.xx, mouse_x) && y >= min(obiekt_kontrolny.yy, mouse_y) && x <= max(obiekt_kontrolny.xx, mouse_x) && y <= max(obiekt_kontrolny.yy, mouse_y)) { obiekt_kontrolny.select[obiekt_kontrolny.select_num] = id; obiekt_kontrolny.select_num += 1; obiekt_kontrolny.select_size_max = max(size, obiekt_kontrolny.select_size_max); } Obiekt kontrolny: Global Right Release GML // Wyznaczamy każdemu obiektowi z osobna inną współrzędną for (i = 0; i < select_num || i < formation_line_num; i += 1) { select.des_x = mouse_x + formation_line_x*select_size_max; // EDIT select.des_y = mouse_y + formation_line_y*select_size_max; // EDIT select.action = "ruch"; } /* Jeżeli interesuje cie obrót formacji tak, aby linia była prostopadła do kierunku przyjścia, spróbuj tego: var select_direction; if (select_num > 0) select_direction = point_direction(select[0].x, select[0].y, mouse_x, mouse_y); for (i = 0; i < select_num || i < formation_line_num; i += 1) { select.des_x = mouse_x + (formation_line_x*cos(degtorad(select_direction))+formation_line_y*sin(degtorad(select_direction)))*select_size_max; select.des_y = mouse_y + (formation_line_x*sin(degtorad(select_direction))+formation_line_y*cos(degtorad(select_direction)))*select_size_max; select.action = "ruch"; }*/ Wszystkie obiekty do zaznaczenia: Step GML // Wykonujemy ruch if (action == "ruch") { move_towards_point(des_x, des_y, des_speed); if (point_distance(x, y, des_x, des_y) < 5) // EDIT: Zapomniałem wyzerować prędkości po skończonym ruchu { action = "stój"; speed = 0; } } Troche tego jest, ale zapewniam cię, że będzie działać. Poza tym można ten kod udoskonalać na wiele sposobów, tworzyć nowe formacje (zapisać je w dwuwymiarowej tablicy, żeby można było wybrać), stworzyć obrót formacji... myślę, że będzie działac ;) EDIT: jeżeli chciałbyś zrobić funkcję, która by wyznaczała miejsca, możesz to zrobić dodając nowe funkcje: formation_line_x i formation_line_y (lub formation_x i formation_y, jeżeli będzie więcej formacji): formation_line_x(index) GML // Funkcja musi być, choćby nawet zwracała 0, wiadomo, co z czego się bierze return 0; formation_line_y(index) GML if (argument0 mod 2 == 0) return -ceil(argument0/2); else return ceil(argument0/2); Usuwasz wtedy wszystkie formation_line z Create obiektu kontrolnego, a w Right Release zamieniasz [ ] na ( ) (i usuwasz warunek przerwania pętli). I tyle ;) EDIT2: Dodałem w kodzie dopiski EDIT, w tych miejscach pozmieniałem błędy, które mogły powodować błąd działania (w końcu pisałem z głowy)
  12. Jak narazie WinAPI mnie nie zawiódł, zawsze znajdowałem jakieś wyjście i oferuje naprawdę dużo funkcji. Na chwilę obecną nie chce się przesiadać ;) Tak też myślałem, tylko widząc za każdym razem a++ zacząłem się zastanawiać... Anyway dzięki za odp. Opcje edytora w porządku, bardziej chodziło mi o listę możliwych dokończeń "słowa", tzn wpisujesz dwie pierwsze litery funkcji, a program pokazuje ci wszystkie możliwości. Coś takiego mi się nie wyświetla.
  13. Rudy

    WM_DESTROY - blokowanie

    To nie jest dobry pomysł, traci wszystkie dane związane z oknem głównym (okna potomne, kontrolki) Możesz jakkolwiek wpływać na ten przycisk? Spróbuj przejąć komunikat kliknięcia na przycisk (BN_CLICKED przy zwykłych buttonach), lub kliknięcia samej myszki (MB_LBUTTONDOWN).
  14. Witam wszystkich zagorzałych fanów aplikacji okienkowych pod C++ :D Niedawno zacząłem pisać pewien program pod WinAPI. Jest już dosyć rozbudowany, posiada nawet StatusBar. Posiada... ale zbytnio nie wykorzystuje. Chciałbym na nim wypisywać podpowiedzi, co gdzie do czego się może przydać. Właściwie mam już wszystko, zostało mi tylko wykrywanie, kiedy myszka najeżdża/odjeżdża od kontrolki. Sam tego nie umiem zrobić, więc proszę o pomoc Was ;) . Pewnym utrudnieniem może być to, że te kontrolki mają za okno rodzica inną kontrolkę, która jest podpięta pod okno główne (tzn omawiana kontrolka nie jest bezpośrednim oknem potomnym okna głównego). WM_MOUSEMOVE odpada, myszka poza obszarem zależnym od okna głównego. Dla przykładu weźmy kontrolkę na pozycji 10x10 o szerokości 100 i wysokości 40 i uchwycie zapisanym w ctrlButton. Znajduje się ona na kontrolce ctrlTab, uchwyt okna głównego to hwnd. Nie chodzi mi o to, jak pobrać pozycję myszki, czy zmienić napis na pasku, głównie chodzi o to, jaką wiadomość mam przechwycić, żebym mógł wychwycić moment wjazdu/zjazdu. Jakieś pomysły? Pytania na 6 :D 1. Co jest szybsze ++a, czy a++? (chce się upewnić) 2. VC nie chce mi podpowiadać (nie wyskakują okienka z listami), co może być tego przyczyną?
  15. Rudy

    WM_DESTROY - blokowanie

    WM_DESTROY jest wysyłane, gdy okno NA PEWNO ma być usunięte. Spróbuj z WM_CLOSE (próba zamknięcia okna krzyżykiem).
  16. On miał na myśli 3d takie, że 2d wychodzi ;D . Coś jak w Kozakach (Cossacks) Gadałem z nim wczoraj, nawet szybko się uczy :) . Zobaczymy, co z tego wyjdzie.
  17. Zostanę jednak przy C++. Uczę się WinAPI, bo podobno podstawy są wymagane do Direct. A poza tym lubię aplikacje okienkowe :sp_ike: No tak, raczej powinny "odskakiwać". Myślałem, żeby zrobić w ten sposób bo mniej miejsca zajmuje w przestrzeni roboczej, no ale skoro nie ma takiej możliwości, zrobię to inaczej. Pozostałe dwa problemy były zależne od pierwszego, skoro zmieniam sposób, problemy same znikną. Dzięki za pomoc, zamykam.
  18. Witam! Mam pewien problem w WinAPI. Chciałbym, żeby po kliknięciu na button (kontrolkę) została ona wciśnięta. Przeszukałem MSDN i znalazłem parę funkcji, ogólnie mój kod operujący kontrolkami wygląda tak: __________________________________________________ // --= Plik nagłówkowy =-- enum GAMESTATE { Stop = 7, Play = 8, Pause = 9, Frame = 10 }; // --= Plik z funkcjami =-- #define WINDOWS_LEAN_AND_MEAN #include <windows.h> #include <windowsx.h> #include "header.h" GAMESTATE state = Stop; HWND ctrl [11]; // tablica z uchwytami kontrolek (te buttony to przedział 7-10) HICON img_butt [4]; // tablica z obrazkami LRESULT CALLBACK MainWinProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_CREATE: { HINSTANCE hInst = GetModuleHandle (NULL); // wczytywanie obrazków img_butt[0] = (HICON) LoadImage (hInst, "resources\\butt_rev.ico", IMAGE_ICON, 16, 16, LR_LOADFROMFILE); img_butt[1] = (HICON) LoadImage (hInst, "resources\\butt_play.ico", IMAGE_ICON, 16, 16, LR_LOADFROMFILE); img_butt[2] = (HICON) LoadImage (hInst, "resources\\butt_pause.ico", IMAGE_ICON, 16, 16, LR_LOADFROMFILE); img_butt[3] = (HICON) LoadImage (hInst, "resources\\butt_frame.ico", IMAGE_ICON, 16, 16, LR_LOADFROMFILE); // tworzenie kontrolek ctrl[ 7] = CreateWindowEx (NULL, "BUTTON", NULL, WS_CHILD | WS_VISIBLE | BS_ICON, 10, 450, 22, 22, hwnd, NULL, hInst, NULL); ctrl[ 8] = CreateWindowEx (NULL, "BUTTON", NULL, WS_CHILD | WS_VISIBLE | BS_ICON, 49, 450, 22, 22, hwnd, NULL, hInst, NULL); ctrl[ 9] = CreateWindowEx (NULL, "BUTTON", NULL, WS_CHILD | WS_VISIBLE | BS_ICON, 88, 450, 22, 22, hwnd, NULL, hInst, NULL); ctrl[10] = CreateWindowEx (NULL, "BUTTON", NULL, WS_CHILD | WS_VISIBLE | BS_ICON, 127, 450, 22, 22, hwnd, NULL, hInst, NULL); // ustawianie właściwości (pokrywa sie z funkcjami wykonywanymi przy wciśnięciu ctrl[7]) Button_SetState (ctrl[ 7], TRUE); Button_Enable (ctrl[ 9], FALSE); // dodanie obrazków do przycisków SendMessage (ctrl[ 7], BM_SETIMAGE, IMAGE_ICON, (LPARAM)img_butt[0]); SendMessage (ctrl[ 8], BM_SETIMAGE, IMAGE_ICON, (LPARAM)img_butt[1]); SendMessage (ctrl[ 9], BM_SETIMAGE, IMAGE_ICON, (LPARAM)img_butt[2]); SendMessage (ctrl[10], BM_SETIMAGE, IMAGE_ICON, (LPARAM)img_butt[3]); } case WM_COMMAND: { // --= podział na poszczególne kontrolki (switch nie chce współpracować z wartościami w tablicy) int i = -1; for (int _i = 0; _i < 11; ++_i) if ((HWND)lParam == ctrl[_i]) i = _i; // przyciski if (i >= 7 && i < 11) switch (HIWORD(wParam)) { case BN_CLICKED: if (state != Frame) Button_SetState (ctrl[state], FALSE); state = static_cast<GAMESTATE> (i); Button_Enable (ctrl[ 9], i!=7); Button_Enable (ctrl[10], i!=8); if (state != Frame) Button_SetState (ctrl[state], TRUE); // MessageBox (NULL, "ClicK!!!", tostr(i), NULL); if (state == Frame) SendMessage (ctrl[9], BM_CLICK, 0, 0); break; } } break; case WM_DESTROY: // usuwanie ikonek DestroyIcon (img_butt[0]); DestroyIcon (img_butt[1]); DestroyIcon (img_butt[2]); DestroyIcon (img_butt[3]); PostQuitMessage (0); break; default: return DefWindowProc (hwnd, msg, wParam, lParam); } return 0; } __________________________________________________ Button_Set_State ustawia wciśnięcie przycisku. Button_Enable ustawia aktywność (można kliknąć, lub nie, coś jak przycisk zatrzymania w przeglądarce po wczytaniu strony). ctrl[7] to przycisk "Stop". Dezaktywuje tylko przycisk "Pause". ctrl[8] to przycisk "Play". Dezaktywuje tylko przycisk "Frame". ctrl[9] to przycisk "Pause". Aktywuje wszystkie przyciski. ctrl[10] to tzw. przycisk "Frame" (przesunięcie o jedną klatkę). Jako jedyny nie ma pozostać wciśnięty po kliknięciu. Po użyciu wywołuje przycisk "Pause" (ta funkcja później powędruje gdzie indziej). No to teraz opiszę problem :) . Teoretycznie wszystko powinno działać, ale jest parę niedociągnięć: - Gdy wciśniemy LPM wciśnięty button, odjedziemy myszką i puścimy LPM, button staje się zwykłym, niewciśniętym przyciskiem. - Wciśnięcie przycisku "Frame" symuluje wciśnięcie Pause, mimo to Pause nie pozostaje wciśnięte. - Każde wciśnięcie przycisku (poza Frame) wywołuje jego wciśnięcie dwukrotnie. Winowajcą jest tutaj Button_Set_State (... TRUE). gdy zmienia on wartość z FALSE na TRUE symuluje ponowne wciśnięcie przycisku (nie wiadomo czemu). Ma ktoś pomysł jak zaradzić tym problemom?
  19. Candy napisał, jak możesz wykonać ów skrypt. Żeby go wczytać, musisz użyć innych funkcji. Wszystkie znajdziesz pod rozdziałem "INI files" w helpie Game Makera ;)
  20. Rudy

    HUE

    no właśnie, dwa obrazki, jeden niezmienny (wszystkie czarne, szare, białe elementy, np szyby), drugi zmieniany (elementy, które mają zmieniać kolor, np. karoseria), ale o kolorze białym, czyli po połączeniu powinien bez żadnych efektów wyjść biały samochód. W ten sposób ustawiając blend drugiemu obrazkowi będzie on taki sam dla każdego koloru (biały ma w sobie wszystkie inne kolory)
  21. Hehe, działa ;) Dzięki Konrad :thumbsup:
  22. Witam wszystkich! Potrzebuję znać nazwę komunikatu do funkcji zdarzeniowej w WinAPI, który działałby tak samo, jak GM'owskie "Draw". Chciałbym też się dowiedzieć, czy trzeba dawać jakieś dodatkowe funkcje (BeginPaint, albo coś), oraz, jeśli trzeba, jaką funkcją mam ten komunikat wywołać. WM_PAINT odpada, nie odświeża się za każdym razem, dopiero, gdy kliknę na okno.
  23. Źle napisałem w poprzednim poście, jest funkcja, która zastępuje klocek, tylko o niej nie wiedziałem (nie miał okazji użyć). Jest to często w tym przykładzie spotykane motion_add. Czyli kod (samego przyciągania przez bungee) powinien wyglądać tak: GML motion_add(point_direction(punkt_2_x,punkt_2_y,punkt_1_x,punkt_1_y), max(0,point_distance (punkt_2_x,punkt_2_y,punkt_1_x,punkt_1_y)-bungee_len) / bungee_spr) Opisy z poprzedniego postu. A tak na serio: Nie umiem tak dobrze angielskiego jak tam w przykładzie, dlatego poprawka kodu byłaby o wiele trudniejsza, niż jakby to było po polsku.
  24. Hmmm... mogłoby to wyglądać w ten sposób, nie jestem pewien czy o to Ci chodzi, w efekcie nie wróci na platformę tylko trzaśnie głową w spód platformy :D ... jest tylko jeden problem. Będziesz to musiał zrobić w klockach, jest pewien klocek, który jest niezastąpiony, mianowicie: Opis zmiennych punkt_1_x = współrzędnie X zaczepienia liny do platformy punkt_1_y = współrzędnie Y zaczepienia liny do platformy punkt_2_x = współrzędnie X zaczepienia liny do gracza punkt_2_y = współrzędnie Y zaczepienia liny do gracza bungee_spr = sprężystość liny (0 = sztywna, nieskończoność - nieskończenie rozciągliwa) UWAGA: bungee_spr != 0 bungee_len = długość liny nierozciągniętej Uzupełnienie klocka: speed = max(0,point_distance(punkt_2_x,punkt_2_y,punkt_1_x,punkt_1_y)-bungee_len) / bungee_spr direction = point_direction(punkt_2_x,punkt_2_y,punkt_1_x,punkt_1_y) relative = true Dlaczego klocek jest niezastąpiony? Zaznaczając relative, klocek ten tworzy wypadkową dwóch prędkości: obecnej i dodawanej i wprowadza tą wypadkową, dzięki czemu ruch jest płynniejszy i bardziej bezwładny. Próbowałem kiedyś stworzyć funkcję zastępującą klocek, ale się nie udało, może ktoś z forum miał więcej szczęścia.
  25. Rudy

    Bot

    GML str = get_string("Jak się nazywasz?","Nazywam się Filip"); // pobieramy komendę if (string_pos("Nazywam się ",str) == 1) // jeśli na początku komendy znajduje się wpis "Nazywam się " { imie = string_copy(str, string_length("Nazywam się ")+1, string_length(str)-string_length("Nazywam się ")); // zapisz do zmiennej "imie" wymagany kawałek komendy :) } else show_message("Niepoprawna komenda"); // jeśli źle podał, pokaż komunikat</span> Spróbuj tego :)
×
×
  • Dodaj nową pozycję...