Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Budynki w grze 2D RPG

Ostatnio zmodyfikowano 2024-08-31 16:25
Autor Wiadomość
tBane
Temat założony przez niniejszego użytkownika
» 2024-08-23 20:33:00
Zarządzać nimi. Nie mam pomysłu jak oprogramować. Na razie zrobiłem:
-wyświetlanie budynków (podłogi)
-dodawanie obiektów budynków do głównych list obiektów w celu ich przetwarzania (żeby poprawnie je renderować z indeksem z) np. walls, furnitures etc.
-usuwanie budynków na PPM w edytorze map (usuwanie budynku wraz z jego obiektami)

-Nie wiem jak zrobić dodawanie budynków w mapEdytorze - na chwilę obecną robię to ręcznie pisząc w skrypcie mapy
-Nie wiem jak przetwarzać skrzynie w budynkach - furniture-inventory ( na chwilę obecną wklepałem kod dla każdej skrzyni przypisuje to samo inventory). Może kolejny plik *.txt ze skryptem ?
-Nie wiem jak rysować sprajta na budynku gdy jesteśmy poza nim
-Nie wiem jak przetwarzać drzwi od budynku - otwarcie/zamknięcie/przechodzenie przez nie
P-181518
pekfos
» 2024-08-23 21:20:18
Czy to nie jest przesadna komplikacja traktować budynek jako obiekt? Dodawanie budynków edytorem wydaje się łatwe tylko gdy planujesz wielokrotnie używać tego samego budynku. Jeśli i tak każdy budynek chcesz projektować ręcznie, to równie dobrze możesz go wrysować w samą mapę. Gracz nigdy nie dowie się czy pod budynkiem jest trawa, czy nie.

-Nie wiem jak rysować sprajta na budynku gdy jesteśmy poza nim
Skoro masz budynek jako osobny byt, to wiesz czy gracz jest w budynku. Jeżeli nie jesteś, możesz zamiast (albo na wierzchu) budynku możesz wyświetlić inną mapę kafelkową (skoro masz "floors", to może "roof"?) Zrobiłbym to mapą kafelkową bo chcesz użyć tych samych grafik żeby budynek w środku nie wyglądał zupełnie inaczej niż na zewnątrz, jak w tym gifie który podałeś.

-Nie wiem jak przetwarzać drzwi od budynku - otwarcie/zamknięcie/przechodzenie przez nie
Obiekt na którym możesz wykonać interakcję (jak na skrzyni), co by przełączało go między stanem otwartym i zamkniętym. Zamknięte drzwi mają kolizję, a otwarte nie.
P-181519
tBane
Temat założony przez niniejszego użytkownika
» 2024-08-25 18:16:19
Skoro masz budynek jako osobny byt, to wiesz czy gracz jest w budynku. Jeżeli nie jesteś, możesz zamiast (albo na wierzchu) budynku możesz wyświetlić inną mapę kafelkową (skoro masz "floors", to może "roof"?) Zrobiłbym to mapą kafelkową bo chcesz użyć tych samych grafik żeby budynek w środku nie wyglądał zupełnie inaczej niż na zewnątrz, jak w tym gifie który podałeś.
Zrobione. Tylko ja będę wyświetlał gotowe już sprite'y. Tak będzie wygodniej choć więcej pracy z grafiką, no ale wtedy budynki mogą różnorodniej wyglądać.

Obiekt na którym możesz wykonać interakcję (jak na skrzyni), co by przełączało go między stanem otwartym i zamkniętym. Zamknięte drzwi mają kolizję, a otwarte nie.
Zaczynam pracę nad tym. Dodam nową listę obiektów i będę je dodatkowo przetwarzał _doors.

ez-show-Inside
ez-show-Inside
P-181524
tBane
Temat założony przez niniejszego użytkownika
» 2024-08-27 13:19:30
Dodałem jakoś te drzwi, ale nie wygląda to tak jak powinno i w dodatku blokują gracza podczas zamykania xD

RPG2D-090
RPG2D-090

C/C++
bool interactionsWithDoors() {
   
float x1, y1, rx1, ry1;
   
float x2, y2, rx2, ry2;
   
   
x1 = player->position.x;
   
y1 = player->position.y;
   
rx1 =( player->collider->width / 2.0f + player->actionRange );
   
ry1 =( player->collider->length + player->actionRange ) / 2.0f;
   
   
for( auto & door: doors ) {
       
x2 = door->position.x;
       
y2 = door->position.y;
       
rx2 = door->collider->width;
       
ry2 = door->collider->length;
       
       
if( intersectionRectangleWithElipse( x2, y2, rx2, ry2, x1, y1, rx1, ry1 ) ) {
           
if( door->state == doorState::open ) {
               
door->close();
               
return true;
           
}
           
           
if( door->state == doorState::close ) {
               
door->open();
               
return true;
           
}
           
        }
    }
   
   
return false;
}
P-181528
tBane
Temat założony przez niniejszego użytkownika
» 2024-08-27 14:05:33
Udało się ! :D

C/C++
bool playerNextTo() {
   
float x1, y1, rx1, ry1;
   
float x2, y2, rx2, ry2;
   
float x3, y3, rx3, ry3;
   
   
x1 = player->position.x;
   
y1 = player->position.y;
   
rx1 =( player->collider->width / 2.0f + player->actionRange );
   
ry1 =( player->collider->length + player->actionRange ) / 2.0f;
   
   
x3 = player->position.x;
   
y3 = player->position.y;
   
rx3 =( player->collider->width / 2.0f );
   
ry3 =( player->collider->length / 2.0f );
   
   
x2 = position.x;
   
y2 = position.y;
   
rx2 = collider->width;
   
ry2 = collider->length;
   
   
if( intersectionRectangleWithElipse( x2, y2, rx2, ry2, x1, y1, rx1, ry1 ) && !intersectionRectangleWithElipse( x2, y2, rx2, ry2, x3, y3, rx3, ry3 ) )
       
 return true;
   
else
       
 return false;
   
}

void update( float dt ) {
   
takeItSprite.setPosition( position.x, position.y - 50 );
   
   
( playerNextTo() ) ? showHand = true
       
: showHand = false;
   
   
if( state == doorState::opening ) {
       
if(( currentTime - startActionTime ).asSeconds() > 0.5f ) {
           
state = doorState::open;
           
collisioning = false;
       
}
    }
   
   
if( state == doorState::closing ) {
       
if(( currentTime - startActionTime ).asSeconds() > 0.5f ) {
           
state = doorState::close;
       
}
    }
}
P-181529
tBane
Temat założony przez niniejszego użytkownika
» 2024-08-30 19:21:35
Jednak ta mechanika ma pewne wady tzn. gdy gracz jest poza budynkiem to dach tego budynku zasłania pewne elementy. Gdy zaś gracz jest wewnątrz tego budynku, to dach nie jest wyświetlany i psuje to efekt "zasłaniania" przez budynek innych obiektów. Macie jakiś pomysł jak to naprawić ?

https://youtu.be/vA542073-Ok?si=tkfZLfiZcZ3xtXpE
P-181533
pekfos
» 2024-08-30 21:18:19
To czemu ten budynek z zewnątrz wygląda jakby miał 2 piętra? Człowiek i drzewo do skali masz zaraz obok. Ten dach nie powinien być większym problemem niż drzewo.

Gdy zaś gracz jest wewnątrz tego budynku, to dach nie jest wyświetlany i psuje to efekt "zasłaniania" przez budynek innych obiektów.
Skoro pokazujesz wnętrze, to wewnątrz powinien być dodatkowy trójkąt ściany który podpiera ten dwuspadowy dach. Możesz pokazać to i wtedy niczego nie odsłaniasz. Alternatywnie: będąc w budynku zasłoń na czarno wszystko co jest poza budynkiem. Wyświetlasz dach bo gracz nie widzi przez ściany - to działa w dwie strony normalnie.
P-181534
tBane
Temat założony przez niniejszego użytkownika
» 2024-08-30 23:17:49
Teraz mam dwie opcje zasłaniania. Pierwsza polega na zasłonięciu obiektów poprzez renderowanie czterech czarnych prostokątów po jednym dla każdego z kierunków (górny, dolny, lewy, prawy). Druga to nie renderowanie obiektów nie należących do budynku, ale za każdym razem dla każdego z takich obiektów musiałbym sprawdzić czy ten obiekt należy do budynku co daje O(n^2). Chyba wybiorę pierwszą opcję.
P-181535
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona