Skocz do zawartości

Rudy

Użytkownicy
  • Postów

    154
  • Dołączył

  • Ostatnia wizyta

Treść opublikowana przez Rudy

  1. 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.
  2. 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ąć.
  3. 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.
  4. Rudy

    [C++] Nowa zmienna

    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.
  5. Rudy

    [C++] Nowa zmienna

    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ę.
  6. Rudy

    Rogalik

    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
  7. 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ż :) .
  8. Rudy

    Problem z pewną funkcją.

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

    Problem z pewną funkcją.

    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.
  10. Rudy

    Problem z pewną funkcją.

    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.
  11. Rudy

    Asembler i kompilacja

    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.
  12. Rudy

    Assembler

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

    Walki Robotów!

    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ą.
  14. Rudy

    Assembler

    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)
  15. 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 :) .
  16. 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.
  17. 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.
  18. 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
  19. 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.
  20. Niech zgadnę... od kodzenia? Ach przedni żart! A ja myślałem, że od oddychania :)
  21. 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].
  22. W ogóle cóż to za projekt? Opisz mi go na PW, ciekaw jestem twojego projektu :) .
  23. 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 ;) .
  24. Niech zgadnę... Od zera do gier kodera? :)
  25. 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 :) .
×
×
  • Dodaj nową pozycję...