Pokaż wiadomości

Ta sekcja pozwala Ci zobaczyć wszystkie wiadomości wysłane przez tego użytkownika. Zwróć uwagę, że możesz widzieć tylko wiadomości wysłane w działach do których masz aktualnie dostęp.


Wiadomości - Radomiej

Strony: [1] 2 3 4 5 ... 7
1
Projektowanie kodu / Odp: [Java] Wzorzec projektowy do gry Saper
« dnia: Wrzesień 27, 2015, 11:43:03 »
Luknij na LibGDX, system ECS np. Ashley albo artemis-odb i zacznij pisać:)

2
Jeśli chodzi o ECS to bardzo ciekawe sprawa, też zacząłem tworzyć gry w oparciu o ten model + system zdarzeń. Być może wydajnościowo stoi to gorzej od pro-optymized code, ale za to jest o wiele bardziej łatwiejszy w utrzymaniu. Sam korzystam z https://github.com/libgdx/ashley.

I tutaj zaczynam mieć pytania:
 - Czy komponent ruchu powinien mieć pozycje X, Y ? Co wtedy z komponentem Pozycji ? A może jakoś powiązać te komponenty...

Ogólnie idea jest taka że tworzysz obiekt Entity do którego wrzucasz swoje komponenty, powiedzmy MoveComponent i PositionComponent. Takie obiekt Entity wrzucasz do Engine(silnika ECS), następnie tworzysz systemy p. PhysicSystem - system odpowiedzialny za przesuwanie jednostki. W nim pobierasz listę obiektów Entity które posiadają MoveComponent i PositionComponent(oba naraz). A następnie wykonujesz logikę, czyli sprawdzasz czy ma się poruszyć i czy może się poruszyć.
Potem tworzysz kolejny system np. AiSystem - który odpowiada za akcje jakie ma podjąć jednostka, gdzie iść, co zrobić. Tam też pobierasz listę Entity które mają MoveComponent i PositionComponent i sobie przetwarzasz dane z nich.

Potem jak chcesz dodać kolizje na podstawie ścieżki/mapy to dodajesz Entity reprezentującą mapę np. MapComponent albo Entity reprezentujące nawet poszczególne pola mapy i dodajesz je do silnika a w Systemach je pobierasz.

- Przeważnie jak pisałem jakiś projekt za poruszanie był odpowiedzialny moduł fizyki, który też obsługiwał kolizje i reakcje na nie.

Ogólnie obiekty dziedziczące po System traktujesz jako moduły które wykonują logikę a w Component trzymasz same dane. Jeśli chcesz wymieniać informacje między modułami to powinieneś to robić poprzez jakiś luźny system. Np. system zdarzeń, wiadomości, ewentualnie za pomocą danych w Component.

- Zastanawia mnie też kod głównej pętli przeglądania Entity, czy wygląda to tak?:
Jeżeli Komponent ruchu to wywołaj manager ruchu,
Jeżeli Komponent fizyki to wywołaj manager fizyki,
Jeżeli Komponent strzelania to wywołaj manager strzelania.

A może to managery uruchamiają się w kolejności i przeszukują wszystkie obiekty i jak obiekt ma komponent, na którym pracuje dany manager to manager wywołuje na nim odpowiedni kod/funkcje? Jednak w tym założeniu widzę zagrożenie ze strony zmniejszenia wydajności - każdy nowy komponent to kolejna iteracja po elementach. Z drugiej strony można mieć sublisty dla tych komponentów, które są używane bardzo rzadko.


Ogólnie jest to zrobione tak że do systemu wrzucasz sobie dowolne Entity reprezentujące np. planszę gry czyli budynki, pola, wrogów. Mogą to też być oczywiście jakieś menusy/buttony/animacje itp.
Następnie rejestrujesz Systemy np. PhysicSystem, RenderSystem.
Potem na silniku wywołujesz funkcję update() i silnik sam uruchamia metody update() w twoich systemach. A to system zarządza jakie Entity chce pobrać i co z nimi zrobić. Oczywiście główną zaletą takie systemu jest to że możesz pobrać konkretne Entity zawierające dane komponenty np. w silniku fizyki pobierasz Entity zawierajace PhysicComponent i PositionComponent, w silniku do grafiki pobierasz RenderComponent i PositionComponent i tak jeden raz aktualizujesz ten sam obiekt w systemie od fizyki a w drugim go rysujesz. Nie obchodzi ciebie jakie dodatkowe Componenty on posiada, dzięki temu możesz go dowolnie modyfikować. Np. jeśli budynek składa się z komponentów: BuildingComponent i PositionComponent, to chcąc zrobić latający budynek dodajesz jedynie FlyComponent i tworzysz system w którym obsługujesz latanie. Co teoretycznie powinno cię zwolnić w modyfikowaniu innych systemów(choć w praktyce często trzeba poprawiać niektóre kwestie).

Ogólnie widzę trudność w podziale projektu na dobre komponenty, które nie będą się dublować i które będą od siebie niezależne.
Trudność ta wynika z luźnego podejścia jakie daje komponentowy system, ale to kwestia po prostu praktyki:)

3
Poszukuję / Animator 2D
« dnia: Lipiec 22, 2015, 17:35:16 »
Witam, poszukuję animatora 2d mogącego przygotować mi na zlecenie animacje 2d postaci.
Preferowany program to Spine, ale opcję z innymi programami też rozważę.

proszę pisać na pw.
Pozdrawiam.

4
Produkcja / Odp: Gotowy silnik czy pisanie od podstaw gry do wydania.
« dnia: Czerwiec 27, 2015, 11:50:17 »
W takim razie polecam ci LibGDX, piszesz w Javie. Możliwość portów na Androida, iOS, PC, HTML(GWT). Więc jeśli idziesz w kierunku Javy to idealny framework dla ciebie. Mocne community, sporo dodatkowych bibliotek i na pewno ma dobre wsparcie dla gier 2d(w 3d nie siedzę ale jakbym miał pisać coś większego to jednak na 70% wybrałbym MonkeyEngine). A jeśli chcesz wydać grę to naprawdę polecam polegać na bibliotekach innych osób i skupić się na pisaniu gry a nie na implementacji własnego silnika, bo nie zrobisz tego dobrze(presja czasu będzie kazała ci zrobić tylko tyle żeby działało).
Ja osobiście pracuję z takim zestawem:
- LibGDX
- LibGDX AI
- Ashley
- Box2D

Jeśli nie chcesz polegać na proceduralnym świecie to masz także wsparcie dla titlesetów, więc możesz sobie zagarnąć do pracy jakiś edytor i postawić swój level.
https://github.com/libgdx/libgdx/wiki

5
odświeżam.

6
Sztuczna inteligencja / Odp: Algorytm do patternów dla formacji
« dnia: Czerwiec 17, 2015, 12:32:46 »
Wiesz co faktycznie to banał, heh chyba za dużo programowania non stop. Dobra, koriat dzięki za odblokowanie, ale nie mędrkuj się tyle:)

Dzięki Dąb za linki, tyle potrzebowałem.
temat do zamknięcia.

7
Sztuczna inteligencja / Odp: Algorytm do patternów dla formacji
« dnia: Czerwiec 17, 2015, 11:53:09 »
Radomiej jak czegoś tak trywialnego nie rozwiążesz sam to daj sobie spokój z dalszym programowaniem gier i wróć do nauki matematyki. ( I nie ma tu żadnego sarkazmu )

Ostatnio naprawdę na tym forum widzę tylko sam spam i hejt(w sumie już od kilku lat). Jeśli rozwiązałeś już ten problem i jesteś w stanie coś podesłać to podeślij. Ja chcę po prostu otrzymać jakieś źródła rzetelnej wiedzy na ten temat, nie proszę o żadne tłumaczenie. Skoro jesteś taki pro w tym temacie to pewnie z czegoś się uczyłeś.
No i odpowiedz czy ja piszę żebyś mi coś wytłumaczył? nie, nie piszę - bo sam sobie spokojnie poradzę, poradziłbym sobie i bez tego wątku. Jedyną kwestią jest tutaj przyśpieszenie czasu.

8
Sztuczna inteligencja / Odp: Algorytm do patternów dla formacji
« dnia: Czerwiec 17, 2015, 10:01:41 »
Wystarczy pozycja.

9
Sztuczna inteligencja / Algorytm do patternów dla formacji
« dnia: Czerwiec 16, 2015, 20:46:39 »
Witam, potrzebuję algorytmu do formowania jednostek w oddziale. Coś co równomiernie rozmieści mi jednostki względem środkowego punktu dla dowolnej ilości jednostek. Interesują mnie wzory prostokąt, koło, okrąg, kwadrat bez środka. Może ktoś zarzucić jakimś rzetelnym źródłem na ten temat? albo podesłać przykładowy kod? 

10
Witam, poszukuję dwóch osób do pracy po godzinach nad grą w klimatach Might&Magic.
Umiejętności dowolne, ważna jest za to wytrwałość i czas jaki można poświęcić w ciągu tygodnia na tworzenie gry.
Gra tworzona z nastawieniem na wydanie i jakiś zarobek. Niemniej wszystko głównie 4fun. Gra jest pisana w javie, libgdx + ashley + libgdx ai. Target to PC i urządzenia mobilne(zaczniemy od Androida). Więcej informacji podam zainteresowanym na priv.

Do zadań programisty będzie należeć m.in:
- tworzenie ekranów
- programowanie mechaniki
- animacja jednostek i efekty(np. lecące strzały)
- ai

Oczywiście zakres obowiązków przy pisaniu będzie zależał tylko od współprogramisty i jego chęci/umiejętności/czasu:)

Do zadań game designera będzie należeć:
- współtworzenie opisu mechaniki gry.
- questów
- magii i zdolności.
- opracowanie fabuły i lokacji.

Ogólnie gra posiada zarys fabuły i mechaniki, ale wszystko jest jeszcze do dopracowania i przemyślenia. Tutaj właśnie liczę na game designera, który będzie miał wpływ na ostateczny wygląd gry.

Wymagany skype albo hangouts jako forma kontaktu zdalnego.

Zainteresowanych współpracą zapraszam do pisania na priv.
Pozdrawiam.

11
Sieć i multiplayer / Odp: [Java] Serwer low-latence
« dnia: Kwiecień 28, 2014, 13:21:22 »
Dobra poradziłem sobie, heh. Teraz jeszcze poprawię co trzeba i będę testował:)

Jakby ktoś w przyszłości próbował bawić się w opakowanie strumieni to tutaj zamieszczam małą ściąge pakowania strumieni:

//Podstawowe strumienie
inStream = client.getInputStream();
outStream = client.getOutputStream();

//Wrapper do podstawowych strumieni
bIn = new BufferedInputStream(inStream);
bOut = new BufferedOutputStream(outStream);
//Wraper na bufforowy strumień || jak nie trzeba wysyłać obiektów to lepiej używać jego
//dos = new DataOutputStream(outStream);
//dis = new DataInputStream(inStream);

//Wraper na bufforowy strumień
//Tworzymy strumień wyjściowy
oos = new ObjectOutputStream(bOut);
//Zapisujemy do niego przykładowy obiekt który wyślemy do drugiego socketu
oos.writeObject(new SerializeObject());
//Wysyłamy
oos.flush();
//A sami czekamy na to samo co wysłaliśmy powyżej, od drugiej strony
//Inaczej nie odblokujemy strumienia Object, który musi sprawdzić czy wszystko jest ok
ois = new ObjectInputStream(bIn);
try {
//Jak nasz strumień Object sprawdził że wszystko jest ok to musimy zczytać obiekt
ois.readObject();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//Dalej możemy działać jak na zwykłym ObjectOutputStream a nie dziedziczącym z bufferedOutputStream.

Pytanie co jest wydajniejsze Object...Stream vs Data...Stream czy operowanie na samym Buffered...Stream?

12
Sieć i multiplayer / Odp: [Java] Serwer low-latence
« dnia: Kwiecień 24, 2014, 16:19:45 »
Oto cały kod tej klasy:
Klasa SimpleClient przechowuje Socket klienta i zwraca standardowe strumienie tego socketa.
//Wątek aktualizujący stan gry
class Connector implements Runnable{

volatile public boolean connect;

SimpleClient client;
InputStream inStream;
OutputStream outStream;
ObjectOutputStream outToServer;
        ObjectInputStream inFromServer;
        DataOutputStream out;
        DataInputStream in;
        Timer timer;
        Timer ping;
        int player;

        /*
         * Stany aktualizacji zdarzeń w grze
         */
        /**
         * Określa czy bloki w grze nie zostały zmienione
         */
volatile public boolean blockChanged;
volatile ArrayList<GameEvent> events;
/**
* Event
*/
volatile private ArrayList<GameEvent> local_events;
public Connector(int i, SimpleClient c) {
// TODO Auto-generated constructor stub
events = new ArrayList<GameEvent>();
local_events = new ArrayList<GameEvent>();
player = i;
client = c;
timer = new Timer();
}

@Override
public void run() {
// TODO Auto-generated method stub
//Oczekiwanie na clienta
try {
inStream = client.InputStream();
outStream = client.OutputStream();
outToServer = new ObjectOutputStream(outStream);
        inFromServer = new ObjectInputStream(inStream);
        outToServer.flush();        
        out = new DataOutputStream(outStream);
        in = new DataInputStream(inStream);          

        //Wysyła gracza
        outToServer.writeObject(players[player]);
        outToServer.writeObject(players);
        outToServer.flush();
        out.writeInt(player);
connect = true;
       

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
MasterExit = true;
}

//PĘTLA SERWERA
boolean ending = false;
while(!exit || !ending){
if(exit) {
ending = true;
//Zmiana statusu klienta
if(client.getStatus() != ConnectionStatus.DISCONNECT) client.setStatus(ConnectionStatus.END_PLAYING);
return;
}


//LUDZI
Player[] p = players;
try {
//clientMove[player] = (Player.MOVE)inFromServer.readObject();
//Odebranie pozycji gracza
//System.out.println("SerwerRoom: " + "Wczytuje pozycje gracza");
players[player].byteToMove(in.readByte());
players[player].body.x = in.readFloat();
players[player].body.y = in.readFloat();
if(in.readBoolean()){
players[player].throwBomb = true;
System.out.println("SerwerRoom: " + "Stawia bombe");
}
//Wysyła stany bloków
//if(timer.GetTime() > 200){
if(blockChanged){ //Jeśli zmieniono bloki
System.out.println("SerwerRoom: " + "Aktualizuje bloki");
timer.Reset();
synchronized(fields){
out.writeBoolean(true);
for(int x = 0; x < MAP_WIDTH; x++){
for(int y = 0; y < MAP_HEIGHT; y++){
out.writeByte(fields[x][y].GetByte());
}
}
}
}else out.writeBoolean(false);

for(Player otherPlayer : players){
//Tutaj powinno być ręczne wysyłanie odpowiednich informacji o graczach
//out.writeBoolean(true);
out.writeByte(otherPlayer.MoveToByte());
out.writeFloat(otherPlayer.body.x);
out.writeFloat(otherPlayer.body.y);
}
//out.writeBoolean(false);

synchronized(events){
for(GameEvent ge : events){
out.writeBoolean(true);
//local_events.add(ge);
byte typ = 0;
if(ge.event == EventType.CREATE_BOMB);
else if(ge.event == EventType.DESTROY_WALL) typ = 1;
else if(ge.event == EventType.SPAWN_BONUS_BOMB) typ = 2;
else if(ge.event == EventType.SPAWN_BONUS_RANGE) typ = 3;
else if(ge.event == EventType.SPAWN_BONUS_SPEED) typ = 4;
out.writeByte(typ);
out.writeFloat(ge.x);
out.writeFloat(ge.y);
out.writeByte(ge.owner);

}
out.writeBoolean(false);
events.clear();
}
//outToServer.writeObject(local_events);
local_events.clear();

outToServer.reset();
outToServer.writeObject(stan);

Thread.sleep(25);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
client.setStatus(ConnectionStatus.DISCONNECT);
exit = true;
return;
//MasterExit = true;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

}

Co do zatorów to jeśli ci chodzi o pernamentne blokowanie, to racja zdarzało się tak, ale poradziłem sobie z tym. Chyba że chodzi ci o czasowe, jeśli tak to postaram się zastąpić ObjectStreamy

13
Sieć i multiplayer / Odp: [Java] Serwer low-latence
« dnia: Kwiecień 24, 2014, 15:59:47 »
Korzystam ze zwykłych strumieni pobranych z socketa:
public SimpleClient(Socket client) throws IOException{
this.client = client;
inStream = client.getInputStream();
outStream = client.getOutputStream();
}

no własnie nie są to duże dane więc powoli się skłaniam że to wina serwera, albo wykorzystania procesora przez mój serwer. Być może dodanie to do reszty wątków powinno nieco poprawić wydajność...

EDIT: Dodałem sleepy() do paru pętli. Na maszynie lokalnej widać poprawę(pozycja graczy już się nie zcina), zużycie procka też spadło. Miejmy nadzieję że to wina tego własnie była. Jak przetestuje na serwerze dam znać:)

14
Sieć i multiplayer / Odp: [Java] Serwer low-latence
« dnia: Kwiecień 24, 2014, 15:41:09 »
Korzystam z takich klas:
DataOutputStream out
DataInputStream in
ObjectOutputStream outToServer
ObjectInputStream inFromServer
ping z serwerem oscyluje średnio na (40-50ms)

ilość danych która się przewala to:
~4000 bajtów / sekundę wysyła serwer. wychodzi po 2000 na każdego z klientów
~200 bajtów / s wysyłają klienci

15
Sieć i multiplayer / [Java] Serwer low-latence
« dnia: Kwiecień 24, 2014, 13:46:59 »
Witam, piszę serwer pod grę. Niestety po wgraniu na dedykowany serwer i połączeniu z serwerem występują spore opóźnienia ok(450 ms) - tyle czasu wysyła się pętla. Czy jest jakiś sposób żeby je zminimalizować?
Bo nie wiem już czy wysyłam za dużo danych czy po prostu muszę użyć jakiejś innej techniki wysyłania.
Dane wysyłane z/do serwera dla każdego z graczy(2 graczy na pokój):
while(){
                  //Odebranie pozycji gracza     
                  players[player].byteToMove(in.readByte());
                  players[player].body.x = in.readFloat();
                  players[player].body.y = in.readFloat();                 
                  if(in.readBoolean()){         
                     //Wykonuje akcje
                  }
                  //Wysyła stany bloków |25 X 21|zazwyczaj dłużej niż co 1s               
                  if(blockChanged){ //Jeśli zmieniono bloki                     
                     synchronized(fields){
                        out.writeBoolean(true);
                        for(int x = 0; x < MAP_WIDTH; x++){
                           for(int y = 0; y < MAP_HEIGHT; y++){
                              out.writeByte(fields[x][y].GetByte());
                           }
                        }
                     }
                  }else out.writeBoolean(false);                 
                 
                  //2 graczy
                  for(Player otherPlayer : players){                     
                     out.writeByte(otherPlayer.MoveToByte());
                     out.writeFloat(otherPlayer.body.x);
                     out.writeFloat(otherPlayer.body.y);   
                  }
                     
                 
                  synchronized(events){
                     for(GameEvent ge : events){
                        out.writeBoolean(true);                           
                        //Wysyła dane zdarzenia
                        out.writeByte(typ);
                        out.writeFloat(ge.x);
                        out.writeFloat(ge.y);
                        out.writeByte(ge.owner);
                     }
                     out.writeBoolean(false);
                     events.clear();
                  }                 
                  local_events.clear();
                 
                  outToServer.reset();
                  outToServer.writeObject(stan);
                     
                  Thread.sleep(25);
               }

Oczywiście lokalnie wszystko chodzi dobrze.

Strony: [1] 2 3 4 5 ... 7