Skocz do zawartości

Konrad-GM

Użytkownicy
  • Postów

    2 728
  • Dołączył

  • Ostatnia wizyta

  • Wygrane w rankingu

    44

Odpowiedzi opublikowane przez Konrad-GM

  1. Jeszcze jedno pytanie: Jak mam w roomie kilka obiektów o_pochodnia to każdy będzie źródłem światła czy tylko ten pierwszy postawiony w roomie?

    W GM, jak i w innych silnikach 3D, jest ograniczona liczba źródeł światła. A światło włączasz poprzez funkcję d3d_light_enable. Możesz zrobić dynamiczne przypisywanie świateł obiektom, które są relatywnie widoczne (np. przez różnicę distance pomiędzy graczem a pochodnią). W create pochodni np zmienna "lightId = 0;" i "enabled = false;", która określa ID światła i czy jest aktywne. Zaś w step można sprawdzać odległość np:

    GML
    if(!enabled && distance_to_object(objPochodnia) <= 100) {

    d3d_light_enable(lightId, true);

    // inne ustawienia swiatla jak kolor, range etc.

    enabled = true;

    }

    else if (enabled && distance_to_object(objPochodnia) > 100) {

    enabled = false;

    }

    W romie przy creation code pojedynczego obiektu można ustalać różne ID świateł do których pochodnie są przypisane. Dla optymalizacji można powielać ID świateł, ale które są daleko od siebie.
  2. Skopał kolejność rysowania elementów.

     

    Najpierw musisz rysować świat, potem obiekty, potem camerę, potem Hud. Chyba się nie pomyliłem.

    No coś nie halo ;D

     

    Najpierw rysować należy kamerę (ustawia projekcje itd. z depth = 1000), później obiekty i świat (depth < 1000), a na końcu ponownie ustawić projekcję ale na ortho i rysować hud (depth < depth-świata). To tak dla ścisłości :)

  3. Po naprawieniu buga z fizyką w Ptakopysku zabrałem się za poprawę i rozwijanie mechaniki gry robionej na Pixel Jam. Gra ma polegać na walce między dwoma odłamami tej samej cywilizacji o planety w układzie słonecznym (team vs. team) przy użyciu statków kosmicznych. W skrócie: chronimy swoje planety, zajmujemy sąsiednie i podbijamy te przeciwnika aż nie straci on wszystkich planet lub swoich ludzi. Po sieci ofc. Przewiduje maksymalnie półgodzinne sesje.

    Takie tam podczas implementacji wchodzenia w atmosfere:

    ab661c995ee563e747bd288197b21d67.png

     

    no fajnie. mnie to zajelo nawet mniej. wystarczylo wklepac w JSONa pare rzeczy i scena i zachowania gotowe

    Zrób webowego GameMakera ;D

  4. Używam GM:S i częściowo Draw GUI rozwiązało sprawę ponieważ rysuje nad foreground natomiast problem jest taki że Draw GUI przestało rysować rzeczy na Androidzie chociaż Draw działa bez problemów... Na forum GM przeczytałem niepotwierdzoną informację, że Android nie uznaje współrzędnych z view_xview tylko wklepane ręcznie cyfry.

    Na tym polega "fenomen" Draw GUI - żaden event Draw GUI nie uwzględnia przesunięć view_x/yview, to tak jakby rysować przy projekcji ortho o współrzędnych 0,0 na ekranie

  5. Poza paroma błędami, a jest ich sporo (głównie dziury w mapie, łamanie nadgarstków), gra jak na alphe jest ok. Wymaga duużo poprawek, nieraz wypadłem poza mapę przez ścianę trzymając skrzynię czy beczkę.

     

    Screen o jakie dziury mi konkretnie chodzi (nie wiem czy tak miało być):

    l75JFBz.jpg

  6. Jakby kogoś interesowało rozwiązanie:

    ; void __fastcall__ pal_fill(const byte* colors);
    _pal_fill:; A - low-bytes pointer, X - hi-bytes pointer
        STA ptr2  ; store data address into zeropage - 2bytes
        STX ptr2+1
        LDA $2002; hi/low seek reset
        LDA #$3F ; seek PPU address to $[3F]00 - hi-byte
        STA $2006
        LDA #$00 ; seek PPU address to $3F[00] - low-byte
        STA $2006
        LDY #$00 ; start indexing
    @1:
        LDA (ptr2), Y; read data
        STA $2007
        INY
        CPY #$10
        BNE @1; loop limit
        RTS

    Argument funkcji pal_fill to wskaźnik 2 bajtowy na dane 1-bajtowe, przy wywoływaniu funkcji zachowany jest w dwóch rejestrach 1-bajtowych - A i X. ptr2 to po prostu adres na pamięć 2-bajtową w sekcji tzw. zeropage. Delkaracja ptr2 znajduje się w pliku ASM zeropage.inc od cc65.

  7. Cześć i czołem bracia i rodacy,

     

    mam do was pytanie moi mili, otóż prosiłbym by ktoś kto zna ASM mógł mi wytłumaczyć parę spraw. Otóż chodzi o adres (wskaźnik) jaki otrzymuje funkcja w ASM wywoływana z poziomu kodu C.

     

    Nie jest to "zwykły" ASM pod procesory x86, tylko zająłem się dość "starą" technologią NES z procesorem MOS 6502. Różnice to oczywiście rejestry i 8bitowa pamięć. Korzystam z kompilatora CC65 pod Win8. W języku C mam zamiar zawrzeć logikę gry, zaś w ASM wszystkie pozostałe rzeczy jak zarządzanie kontrolerami, dźwiękiem (APU) czy grafiką (PPU). Do rzeczy:

     

    W celu wywołania funkcji napisanej w ASM korzystam z trywialnego kodu:

    void __fastcall__ pal_fill(const byte *data); // import
    pal_fill(palPaleta); // wywolanie

    Dla optymalizacji, poprzez __fastcall__ ładuje wskaźnik *data do rejestru. Jednakże z racji iż jest to 8bitowy procesor, a wskaźnik 16bitowy, rozkładany jest na partie 8bitowe w rejestrach tj. A i X.

     

    Teraz problem pojawia się iż chciałbym wczytać zawartość znajdującą pod wskaźnikiem, jednak nie mam za bardzo pojęcia jak się za to zabrać. Co prawda kompilator C przekształca źródła z C na plik ASM, jednak jest to mało optymalizowane i wygląda jak śmietnik.

     

    Pętla w ASM:

    _pal_fill:
      LDY $2002; reset PPU states
      LDY #$F3
      STY $2006; hi-byte of $[3F]00 - PPU seek address
      LDY #$00
      STY $2006; low-byte of $3F[00] - PPU seek address
    
      LDX #$00; start indeXing from 0
    @1:
    ;??? LDY A, X; load colour from address A + X into Y reg !!! tutaj następouje "syntax error", jak wspomniałem, rejestry są 8 bitowe
    ;??? STY $2007; put colour from Y reg into PPU pallete
      INX; X = X + 1
      CPX #$10; if X == 16
      BNE @1; above cmp is true -> continue
      RTS; return to C

     

    Zastanawiam się czy nie należy tutaj użyć "stack"a, (sp), coś a'la:

    STA (sp)
    STX (sp)+1
    ...
    LDY (sp), X

     

    Pozdrawiam,

    Konrad

  8. Zapomniałeś o jednym.

    "w+" flag - write/update: Create an empty file and open it for update (both for input and output). If a file with the same name already exists its contents are discarded and the file is treated as a new empty file.

  9. Pisze sobie swojego Game Maker-a. Hue-hue. ^^

    Na razie taki proof-of-concept. Rysowanie/window/input z GLFW, tekstury SOIL2, język skryptowy AngelScript. Póki co proste rzeczy typu rysowanie prostokąta (patrz: kod). Działa.

    GML
    float s;

    void _atstart() {

    s = 0;

    }

    void _mainloop() {

    s += .0125;

    float x = cos(s) * 24;

    float y = sin(s) * 24;

    drawRectangle(16 + x, 16 + y, 32 + x, 32 + y);

    }

    Nawet GameMaker ma własny "mainloop". Bo chyba o to chodzi w Game Engine'ach. Modding a'la Unity czy UDK jest ok... :P

×
×
  • Dodaj nową pozycję...