Skocz do zawartości

Konrad-GM

Użytkownicy
  • Zawartość

    2550
  • Rejestracja

  • Ostatnia wizyta

  • Wygrane w rankingu

    4

Ostatnia wygrana Konrad-GM w Rankingu w dniu 7 Listopad

Konrad-GM posiada najczęściej lubianą zawartość!

Reputacja

11 Dobry człowiek

O Konrad-GM

  • Tytuł
    Legendary Hobo
  • Urodziny 07/31/1992

Contact Methods

  • Website URL
    https://lethiandev.github.io/

Previous Fields

  • Steam
    samael_x92
  • Użytkownik GameMaker Studio 2
    Nie
  • Użytkownik GameMaker Studio
    Tak
  • Użytkownik GameMaker 8
    Nie
  • Użytkownik GameMaker 7 i wcześniejszych wersji
    Nie
  • Użytkownik Unity
    Nie
  • Uytkownik Godot
    Tak

Profile Fields

  • Płeć
    Mężczyzna

Ostatnie wizyty

20658 wyświetleń profilu
  1. Strzał 3d

    Funkcja place_meeting bierze pod uwagę maski obu instancji, maskę obj_pocisk i obj_wrog. Jeszcze istnieje taka funkcja jak position_meeting do sprawdzania kolizji tylko punktowo
  2. Nad czym aktualnie pracujesz?

    Nie jest to tak trudne, po prostu wymaga trochę innego myślenia niż GM-owe surface'y, podsyłam też niewielki przykład: render-target.zip Nie jestem pewien, czy z forum działa pobieranie plików, ale wgrałem też na inny hosting: https://www23.zippyshare.com/v/xXpprq1O/file.html - LPM "niszczy" surface
  3. Nad czym aktualnie pracujesz?

    @I am Lord Jasne, w czołgach używam właśnie metody "surface" żeby połączyć elementy otoczenia w teksturę, ale w Godocie działa to odrobinę inaczej. Viewporty w Godot to nic innego jak OpenGL'owe Framebuffery, ale aktualizują się dopiero po wyświetleniu kolejnej klatki, nie da się rysować bezpośrednio na Viewportach ze względu na VisualServer, który odpowiedzialny jest za interpretowanie komend rysowania np. VisualServer.canvas_item_add_line jest podpięte bezpośrednio pod CanvasItem.draw_line (Node2D, Sprite etc.), dotyczy to wszystkich funkcji rysowania. Dlatego Godot też udostępnia taką funkcję jak VisualServer.request_frame_drawn_callback, dzięki niej można nasłuchiwać, kiedy Viewporty zostały zaktualizowane. Żeby nie aktualizować Viewporta co klatkę, polecam ustawić parametr Viewport.render_target_update_mode na UPDATE_ONCE (ten parametr potem jest ustawiany na UPDATE_DISABLED przez VisualServer, także każda kolejna aktualizacja wymaga przełączenie tego parametru). Zalecałbym też przełączenie tej flagi Viewport.render_target_v_flip na True, bo standardowo obraz będzie odwrócony. Nie zapomnij też o parametrze Viewport.size. Dodatkowo wspomnę, że Viewport.get_texture zwraca referencję na teksturę i wystarczy pobrać teksturę jednorazowo np. w funkcji _ready i narysować ją raz w metodzie _draw bez wywoływania metody update. Ale nie można wtedy usunąć Viewporta, bo usunie nam też teksturę. Jakbyś chciał "ukryć" Node'y z drzewa sceny nie musząc dodawać Viewport node'ów, możesz użyć bezpośrednio metod z VisualServer tj. VisualServer.viewport_create, VisualServer.viewport_set_active, VisualServer.viewport_get_texture, VisualServer.viewport_attach_canvas, VisualServer.canvas_create, VisualServer.canvas_item_set_parent, VisualServer.free_rid itd. np. do obsługi roboczych Viewportów. Jeszcze wspomnę o OpenGL ES na mobilkach - Texture.get_data nie działa ze względu na limity samego OpenGL ES, które uniemożliwiają przepływu danych z GPU do RAM, także nie da się pobrać pikseli z Viewporta czy jakiejkolwiek tekstury do zmiennej, natomiast na desktopach działa bez problemu.
  4. Nad czym aktualnie pracujesz?

    @I am Lord Czołgi poza technicznym aspektem, to gameplay-owo dalej ssie, więc nie ma czego tak naprawdę pokazywać, ale pochwalę się chociaż dość szybkim sposobem na zniszczalny teren Działa stabilnie na androidzie, co mnie cieszy A tutaj dodatkowo podsyłam gifa, co u Papervanii się dzieje: Wyłączyłem DOF, bo półprzezroczyste obiekty nie zapisują się do depth buffora, co bluruje mi też te obiekty :/
  5. Strzał 3d

    Ewentualnie możesz zachować opcję z solid, ale w obiekcie obj_pocisk, w Step Event musiałbyś dodać kod odpowiedzialny za sprawdzanie kolizji zamiast w Collision Event: // sprawdzamy kolizje z wrogami with (obj_wrog) { if (place_meeting(x, y, other.id)) { // kolizja nastąpiła, ale w 2D, sprawdźmy wysokość pocisku if (other.z < 24) { with (other) { // niszczymy pocisk instance_destroy(); } // niszczymy wroga instance_destroy(); // przerywamy blok 'with' break; } } }
  6. Strzał 3d

    Sprawdziłem na GMS i sytuacja wygląda tak samo, najwyraźniej GameMaker jakoś inaczej obsługuje kolizje z obiektami z włączoną flagą solid. Jedyne rozwiązanie jakie tu widzę, to wyłączenie obiektom funkcji solid i obsłużenie wszystkich kolizji własnym kodem.
  7. Nad czym aktualnie pracujesz?

    @Nirvan Pełna profeska, gratuluję, a artykuł też spoko jest @Wojzax Fajnie to wygląda, a animacje też są spoko Ja natomiast żeby odskoczyć od czołgów, gdzie przepisałem system kolizji, zaimplementowałem FSM, zoptymalizowałem rysowanie (custom-izowany silnik Godota) i napisałem system rozgrywki turowej, to zająłem się nowym projektem na GitHub GameOff, Na razie mam jakiś biedny system platformówki: Czołgi piszę w Godot Engine 3.0, natomiast ten projekt jest trochę taki eksperymentem z wersją 3.1. Generalnie rozgrywka będzie polegać na toczeniu walk między papierowymi wycinankami na stole. Jeszcze nie mam jakiegoś szczególnego opisu fabuły i samej rozgrywki, ale inspirować się będę trochę castlevanią. Tekstury darmowe z internetu (https://hdrihaven.com/ i https://freepbr.com). Postać znaleziona na google w agregacie śmiesznych obrazków, także nie wiem do kogo należy. Ale postać mam zamiar zmienić na swoją narysowaną, także nie zostanie na długo.
  8. Strzał 3d

    GMowa opcja solid jest użyteczna ale jedynie do gier 2D, tutaj Ci się nie przyda więc pociskowi musisz sprawdzać kolizję inaczej. Najprostszym sposobem byłoby sprawdzanie kolizji w obj_pocisk Collision Event [Wróg - Pocisk]. Możesz ustawić jednego rodzica wrogom, żeby nie tworzyć eventów dla każdego z ich rodzaju. W tym evencie dopiero sprawdzaj warunek: // w tym evencie kolizja nastąpiła (w 2D) // sprawdźmy, czy również występuje ona na tej samej wysokości co pocisk if (z > other.z) { // 'z' pocisku porównujemy z pozycją 'z' wroga if (z < other.z + wysokosc) { // ^ ale uwzględniając wysokość wroga with(other) { instance_destroy(); // usuń wroga } instance_destroy(); // usuń pocisk } }
  9. Python, podstawowe używanie stron internetowych

    Możesz użyć jakiejś biblioteki np. lxml i sparsować odpowiedź od serwera. np. from io import StringIO from lxml import etree from httplib import HTTPSConnection conn = HTTPSConnection("perelki.net") conn.request("GET", "/random") res = conn.getresponse() data = unicode(res.read(), "utf-8") parser = etree.HTMLParser() doc = etree.parse(StringIO(data), parser) root = doc.getroot() joke = root.xpath("body/div[@class='content']/div[@class='container']")[0] print '\n'.join(joke.xpath("text()")).strip()
  10. Python, podstawowe używanie stron internetowych

    Cześć, czy chodzi Ci o Google Time Zone API? Czy może być jakiekolwiek API np. World Time API. W obu przypadkach trzeba się posłużyć http requestami, tyle, że Google Time Zone API wymaga logowania (OAuth2).
  11. Strzał 3d

    Hm, wstawiłem 3 zamiast 4, też podmień wysokość 'z', sorry.
  12. Strzał 3d

    Spróbuj tej metody: // wektor patrzenia kamery var xx = global.camcos * 3; var yy = global.camsin * 3; // odwracamy wektor o 90 stopni var x1 = yy; var y1 = -xx; // odwracamy wektor ale o -90 stopni var x2 = -yy; var y2 = xx; // rysujemy nasz billboard d3d_draw_wall(x + x1, y + y1, 12, x + x2, y + y2, 0, tex, 1, 1); Generalnie możesz tym też zastąpić kod Draw Event w obj_pocisk.
  13. Strzał 3d

    Z tego co widzę, nie aktualizujesz zmiennych globalnych, powinno to wyglądać tak: obj_cam i nasz Create Event: // włączamy tryb 3D d3d_start(); // wysokość naszej kamery nad podłogą z = 10 // deklarujemy naszą zmienną do obracania się bohatera góra/dół pitch = 0; // dodatkowo użyjemy wbudowanej zmiennej tj. // 'direction' do obracania się lewo/prawo // deklarujemy nasze zmienne globalne, // będziemy je aktualizować w Step Event global.camcos = 1; // tymczasowo nadajemy wartość 1, ponieważ cos(0rad) = 1 global.camsin = 0; // natomiast sin(0rad) = 0 global.campitch = 0; Create Event głównie służy nam tutaj do deklaracji naszych zmiennych, potem będziemy na nich operować w Step Event: // obracamy naszego bohatera // operujemy tutaj na stopniach (degrees) direction -= (display_mouse_get_x() - display_get_width()/2)/10; pitch -= (display_mouse_get_y() - display_get_height()/2)/10; pitch = max(min(pitch,89.9),-89.9); // 180 stopni góra/dół, -0.1 żeby uniknąć błedu z przeskokiem display_mouse_set(display_get_width()/2,display_get_height()/2); // aktualizujemy nasze zmienne globalne // tutaj operujemy już na radianach (radians) // dlatego użyjemy funkcji degtorad var dirrad = degtorad(direction); var pitchrad = degtorad(pitch); // poniższe równanie to nic innego jak zredukowane mnożenie macierzy obrotu // więcej możesz się dowiedzieć np. na http://planning.cs.uiuc.edu/node102.html // jak pomnożysz macierze [Pitch] * [Yaw] przez wektor |xyz|, otrzymasz poniższe równanie: global.camcos = cos(dirrad) * cos(pitchrad); global.camsin = -sin(dirrad) * cos(pitchrad); global.campitch = sin(pitchrad); W Draw Event bohatera ustawiamy projekcję naszej kamery: // ustawiamy projekcję rysowania d3d_set_projection( // pozycja 'oka' kamery x, y, z, // punkt, na który 'patrzy' nasza kamera // użyjemy tutaj naszych zmiennych globalnych i dodamy do aktualnej pozycji x + global.camcos, y + global.camsin, z + global.campitch, // wektor 'góry' naszej kamery // pozycja Z jest naszą górą 0, 0, 1 ); Teraz nasz pocisk musi dowiedzieć się, w którym kierunku 'patrzy' nasz bohater i następnie będziemy na tej podstawie obliczać. obj_pocisk i w Create Event deklarujemy następujące zmienne: // wysokość pocisku od podłogi z = 10 // tekstura pocisku tex = sprite_get_texture(spr_pocisk, 0); // budujemy wektor lotu pocisku // ze zmiennych tymczasowych: var dir_x = global.camcos; var dir_y = global.camsin; var dir_z = global.campitch; // normalizujemy wektor dir_xyz var dir_len = sqrt(dir_x*dir_x + dir_y*dir_y + dir_z*dir_z); dir_x /= dir_len; dir_y /= dir_len; dir_z /= dir_len; // predkosc pocisku jako zmienna tymczasowa // posłuży nam do obliczenia wektora motion_xyz var spd = 5; // tworzymy zmienną lokalną jako wektor motion_xyz // poruszania sie naszego pocisku: motion_x = dir_x * spd; // 'wydłużamy' wektor o wartość zmiennej spd motion_y = dir_y * spd; motion_z = dir_z * spd; Step Event w pocisku jest trywialny i chyba nie wymaga tłumaczenia: x += motion_x; y += motion_y; z += motion_z; Teraz czas na rysowanie naszego pocisku w Draw Event: // obliczamy obrót w stronę kamery: var dirtocam = point_direction(obj_cam.x, obj_cam.y, x, y); var dirtocamrad = degtorad(dirtocam); var xx = -cos(dirtocamrad + pi/2) * 5; var yy = sin(dirtocamrad + pi/2) * 5; // rysujemy 'ścianę' odwróconą w stronę naszej kamery, tzw. billboard: d3d_draw_wall( // x1, y1, z1 x - xx, y - yy, z + 5, // x2, y2, z2 x + xx, y + yy, z - 5, // tekstura i jej powtarzanie tex, 1, 1 );
  14. Strzał 3d

    Widzę, że porwałeś się z motyką na słońce. Może lepiej byłoby, jakbyś podesłał treść błędu, abyś zrozumiał co robisz źle w takim razie.
  15. Strzał 3d

    Ok, zapisz jeszcze sobie zmienną pitch do zmiennej globalnej w takim razie i przenieś z Create Event do Step Event. IMO bardziej poprawne byłoby liczenie wektora lookat tak: var dirrad = degtorad(direction); var pitchrad = degtorad(pitch); global.camcos = cos(dirrad) * cos(pitchrad); global.camsin = -sin(dirrad) * cos(pitchrad); global.campitch = sin(pitchrad); Żeby nie liczyć tego 2 razy, użyj tych globalnych zmiennych do funkcji d3d_set_projection, zamiast liczyć je w kilku miejscach. Teraz możesz użyć tego skryptu co Ci podesłałem do pocisku.
×