
Rudy
Użytkownicy-
Postów
154 -
Dołączył
-
Ostatnia wizyta
Typ zawartości
Profile
Forum
Wydarzenia
Treść opublikowana przez Rudy
-
W Global Game Settings było jeszcze coś o skalowaniu w pierwszej zakładce pole do wpisywania liczb (nie pamiętam dokładnie). Jest tam 100? A jeżeli włączysz interpolate colors between pixels to obraz się rozmazuje? Jeżeli tak to mamy pewność że chodzi o położenie/rotacje/skalowanie.
-
O to mi chodzi, podlicz skalowanie twojego obrazka krok po kroku. Na pewno tam użyłeś jakiegoś image_xscale, czy proporcji view/port, skoro masz taki efekt. Jeżeli masz jedne piksele obrazka większe od drugich to na 99% wynikiem będzie liczba z przecinkiem. Mozesz spróbować w ogóle usunąć skalowanie (tak żeby obrazek wynikowy był dokładnie taki sam jak sprite) i zmienić skalę tylko w jednym miejscu (o liczbę całkowitą). Problem powinien wtedy zniknąć.
-
Twój sposób skalowania w efekcie daje proporcję z przecinkiem (czyli coś w rodzaju x2.2), nie wiadomo tylko gdzie (sprawdź opcje obiektu, proporcja view/port, jedna z głównych opcji (fullscreen, ratio itd) i przemnóż proporcje). W związku z tym co 5 pikseli jest skalowanie 3x, z kolei pozostałe to 2x. Jeżeli nie chcesz zmieniać skali, możesz zaznaczyć "interpolate color between pixels" i sprawa będzie załatwiona, tylko że efekt może nie pasować do twojej koncepcji gry.
-
Czyli coś takiego (mniej więcej): enum eType { tUndefined, tLong, tLonglong, tFloat, tDouble, tLongdouble, tString }; class cCustomVar { private: void* var; string name; eType type; // musisz mieć gdzieś zapisany jaki to typ public: cCustomVar() : var(NULL), name(""), type(tUndefined) {} ~cCustomVar() { if (type != tUndefined) delete var; } bool Init(eType t, string n); bool Release(); }; bool cCustomVar::Init(eType t, string n) { if (type != tUndefined) return false; switch (t) { case tLong: var = new long; break; case tLonglong: var = new long long; break; case tFloat: var = new float; break; case tDouble: var = new double; break; case tLongdouble: var = new long double; break; case tString: var = new string; break; } name = n; return true; } bool cCustomVar::Release() { if (type == tUndefined) return false; delete var; name = ""; type = tUndefined; return true; } I tak dalej. Tylko wciąż się pytam po co? O ile samo stworzenie i kasowanie jest łatwe, to już przekazanie wartości może być trudniejsze (przeciążenie funkcji przypisania dla każdego typu i sprawdzenie jego poprawności z ustalonym). A pobranie? C++ nie wybierze odpowiedniej funkcji według zmiennej wewnątrz klasy. Dużo niepotrzebnej roboty, wokół problemu powstanie taka otoczka kodu, że nie wiem, czy cel i takie rozwiązanie jest tego warte.
-
Z ciekawości. W jakim celu chciałbyś tworzyć zmienne o przypisywanych w trakcie gry nazwach? Przecież w kodzie to i tak wszystko jedno jaką mają nazwę (potem ona znika), a na "zewnątrz" możesz sobie po prostu dodać string to tej zmiennej i wyświetlać ją jako nazwę.
-
Funkcje, które mogą cie zainteresować: GetStdHandle SetConsoleCursorPosition SetConsoleTextAttribute ale warto rozejrzeć się też za innymi funkcjami. Co do sterowania to chyba wiesz, pod konsolę chyba najlepszy getch() z conio.h
-
U mnie (w liceum) tak jest, mamy 4 języki, każdy z nich podzielony na 3 poziomy (podstawowy, zaawansowany, rozszerzony). Zapisujesz się na początku gdzie chcesz i już :) .
-
Cóż, ja tak mam prawie z każdym poważniejszym błędem. Tylko trzeba jednak go szukać i siedzieć nad nim (albo obok niego :P ). A tak wogóle: błędy zostały już wymienione, wystarczy je naprawić.
-
No to szybko się poddajesz, ile czasu spędziłeś nad tym kodem? Ile godzin myślałeś gdzie tu jest błąd (a ile zanim napisałeś o nim na forum). Programistą nie zostajesz, jeśli tylko nauczysz się składni jakiegoś języka.
-
std::string * I = new std::string[(code.size())/2]; std::string * II = new std::string[(code.size())/2]; To nie jest przypadkiem alokacja tablicy stringów (a nie samego stringa)? Bo jeżeli tak to normalne, że: I[i] = code[i]; nie będzie działać, skoro I[] ma typ std::string, a code[] char. Druga sprawa to co Will powiedział, referencje w argumentach. Trzecia: for (unsigned int i = 0; i <= code.size()/2; i += 2) Oznacza skacz co dwa znaki do momentu aż osiągniesz połowę długości stringa. Czyli w stringach I i II znajdzie się ćwierć tekstu głównego. Chyba nie o to chodziło. Wg mnie musisz zmienić warunek na i < code.size(). Cztery: str.resize(code.size()/2); powinno przyśpieszyć działanie. W końcu klasa stringa wie ile tego będzie. Pięć: Tak jak Will powiedział, zmień w warunkach pętli <= na <, bo wychodzisz poza wielkość tablicy.
-
Ostatecznie możesz skompilować program do exe'ka (ale musisz trochę nauczyć się o sekcjach i innych tego typu rzeczach). Exe'ki są 32b, więc działają na x64.
-
jeżeli masz komputer x86 to spokojnie - ja pisałem i działało :) (generuje ci plik *.COM/*.BIN, nie *.EXE, chociaż potem i exe'ki nauczysz się generować). Jeżeli x64 to już gorzej, ale otwierając przez asmloader z drugiego kursu program powinien też zadziałać.
-
Hmmm... dałoby radę zrobić coś w rodzaju mobilnego magazynu? Coś jak grabber, tylko z paroma miejscami na przedmioty. Albo na przykład budynek działający jak ten robot z tarczą ochronną.
-
Znaczniki? Jeżeli mówisz o wskaźnikach, to są w C++, jeżeli mówisz o etykietach, to one i tak po asemblacji znikają (zamieniają się na adresy, czyli wskaźniki). A nadawanie bajtom wartości to nic innego jak nadawanie zmiennym wartości (lub - jeżeli chodzi ci o dowolną pozycję - nadawanie wartości przez wskaźnik). Większość da się zrobić działając na wskaźnikach w C/C++ :) . A jeśli chodzi o kursy: http://rudy.mif.pg.gda.pl/~bogdro/dos/index.php // kurs asm 16 i 32-bitowego dla DOS i Windows, znajdziesz tam listy prawie wszystkich operacji na asmie, opisany dla różnych asemblerów, jedynie co to nie jest tam wszystko dokładnie opisane. Kurs assembly 32 bitowego w formie wideo, dobrze i klarownie opisany, chociaż jeżeli cenisz sobie niezależność (wolność od niekoniecznych programów, pisanie w notatniku :) ) to początki mogą ci się nie podobać (kurs wyżej opisuje programowanie w asm tylko za pomocą notatnika i dowolnego asemblera)
-
Saga Homeworld Wszystko we wszystkim, Start w jedynce, powrót na Kharak, pierwszy kontakt z wojownikami Kadesh, Historia wygnanych i najlepsze - lądowanie na ojczyźnie ;) potem dodatek Calaclysm, narodziny Bestii, jej ponowne przybycie po zmodernizowanej Matce, pierwszy kontakt z Naggarokiem, repulsor Normada... i oczywiście zakończenie :) Homeworld 2 - intro, pierwsze spotkanie z Bentusi, bitwa o Pancernik i jego pierwsze użycie przeciw najeźdźcom, potem zakończenie bitwy ze Strażnikami z Abbasid (wtajemniczeni wiedzą ;) ), oczywiście Wrota Balcory i bitwa o Sajuuka. I końcówka, wielka bitwa o Higaarę, przybycie zabójców planet, działo Sajuuka i ten cały ogrom :) . Każda z tych scen jest dopracowana w najdrobniejszych detalach. Muzyka, efekty dźwiękowe i wizualne, całe przedstawienie sceny wręcz wyreżyserowane jak w najlepszym filmie s-f :) .
-
GML if (mouse_check_button_pressed(mb_middle)) { mx = mouse_x; my = mouse_y; } if (mouse_check_button(mb_middle)) { view_xview[0] += mx - mouse_x; view_yview[0] += my - mouse_y; } Przetestowane, u mnie działa.
-
Stwórz sobie obiekt rysujący jak PsichiX powiedział. 1. Wyłącz wszystkim obiektom Visible 2. Skopiuj ich kody malowania do skryptów, np draw_object0 3. Stwórz obiekt malujący, np o_con_draw (istnieje w roomie od początku) 4. W jego evencie malowania wyliczaj wszystkie obiekty i maluj je wg swoich ustawień: GML (Wg kolejnosci powstania bez segregacji) for(i = 0; i < instance_count; i += 1) switch(instance_id) { case object0: draw_object0(); break; case object1: draw_object1(); break; case object2: draw_object2(); break; } GML (Wg wartosci depth) inst[instance_count] = -1; inst_value[instance_count] = -1000000; for (i = 0; i < instance_count; i += 1) { j = 0; while (j < i) if (instance_id.depth > inst_value[j] break; else j += 1; for (k = i; k > j; k -= 1) { inst[k] = inst[k-1]; inst_value[k] = inst_value[k-1]; } inst[j] = instance_id; inst_value[j] = instance_id.depth; } for (i = 0; i < instance_count; i += 1) switch (inst) { case object0: draw_object0(); break; case object1: draw_object1(); break; case object2: draw_object2(); break; } Jeżeli chcesz wg innej wartości, pobierasz ją zamiast depth, jeżeli chcesz ustawić malowanie całego obiektu wg jakiegoś warunku, sprawdzasz go przy segregacji, jeżeli części obiektu, możesz dać to przy case'ach, lub w funkcji malowania przekazując jej id obiektu.
-
Sprawdź wszystkie linie kodu, które usuwają/tworzą obiekt pocisku. Szukaj wszystkiego, co mogłoby się zapętlić, lub w inny sposób wyzerować ci te liczniki
-
Sprawdzałeś fps? Może jak przysłaniasz okno, część operacji się nie wykonuje i gra pracuje szybciej, przez to sekundy tylko wtedy są sekundami.
-
Niech zgadnę... od kodzenia? Ach przedni żart! A ja myślałem, że od oddychania :)
-
Wg mnie asm byłby szybszy (n++ dodatkowo zwraca wartość no i że jest to postinkrementacja to zużywa dodatkową pamięć na zapis wcześniejszej wartości), chyba, że będzie jakaś silna optymalizacja kodu, która sprowadzi to do inc [a].
-
W ogóle cóż to za projekt? Opisz mi go na PW, ciekaw jestem twojego projektu :) .
-
Zrobiłem przykład, w którym mniej więcej zastosowana jest "realistyczna" grawitacja: O TUTAJ - każde id obiektu znajduje sie w tablicy głównej obiektów - co step ta tablica jest przeglądana i aktualizowany jest ruch (za pomocą motion_add) - generator w create tworzy wszystkie obiekty, spisuje do tablicy i ustawia wartości takie jak masa, prędkość. - inne opcje, które zamieściłem to między innymi użycie dwóch różnie poruszających sie backgroundów, oraz sposób obliczania wejścia w orbitę kołową (lecisz w stronę zielonej strzałki, aż zostanie tylko kółko :) . Tym się nie sugeruj w swoim projekcie, wyznacza to tylko orbitę kołową, a jak wiemy praktycznie żadne ciało się po niej nie porusza. Have fun ;) .
-
Niech zgadnę... Od zera do gier kodera? :)
-
Po co wymyślać, jak zwykła zmienną się to da zrobić. Może i nawet szybciej by było: GML if (zmienna == 1) { zmienna = 2; instance_create(0, 0, obiect1); } O ile w GM nie ma różnicy, to ja jako C++ user zalecam jednak użycie == zamiast =. Jeżeli będziesz chciał przejść kiedyś na poważniejszy język, będzie ci łatwiej. Poza tym skoro działanie jest inne (przypisanie != porównanie) to i operator powinien być inny :) .