Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[TCP][2D] Przesylanie mapy


Rekomendowane odpowiedzi

Opublikowano

Hej,

Mam sobie mapkę 64 x 64 po stronie serwera, mapa jest podzielona na chunki (chunk = 16 x 64) czyli mam 4 chunki, i nie wiem jak w najlepszy sposób wysłać mapę do clienta, aktualnie zrobiłem przesyłanie całej mapy na raz (tych bloków których client nie widzi) lecz to wywal EOFException po stronie clienta tak po 50% mapy. no to zrobiłem wysyłanie w częściach, gdy w buforze jest ~1024 bloków to wysyła pakiet, i dalej sprawdza, lecz to też wywala EOFException, macie jakiś pomysł jak wysłać mapę aby client w całości bez żadnych problemów ją odebrał? Powiem dodatkowo że w starszej wersji gry miałem przesyłanie na zasadzie 1 stringu, lecz to też mi tutaj nie chce działać :\ Ten EOF oznacza End of stream, lecz dlaczego jeśli po stronie clienta wysłałem ~2000 bloki a on staje na ~1000 bloczku? 8S

Pozdrawiam!

 

Opublikowano

minicraft? bo tak pasuje opisem :(

Jak tak to uciekaj zanim zobaczą że pytasz o takie rzeczy w tym dziale :D

Ale ogólnie informacja co dokładnie robisz i jak to wygląda by znacznie pomogła ;)

Np czy to jest ten biedny minicraft, jak to coś twojego to... za dużo nikt nic nie zdziała bo nikt nie wie jaki masz kod i jak to wygląda, trudno cokolwiek wykminić.

To już jest koniec smerfa:


http://www.mpcforum.pl/topic/1323530-info-znikam/


GG: 48522543


PS: Na innych forach i stronach znajdziesz mnie pod nickiem: 


BukkitSmerf

Opublikowano

minicraft? bo tak pasuje opisem :(

Jak tak to uciekaj zanim zobaczą że pytasz o takie rzeczy w tym dziale :D

Ale ogólnie informacja co dokładnie robisz i jak to wygląda by znacznie pomogła ;)

Np czy to jest ten biedny minicraft, jak to coś twojego to... za dużo nikt nic nie zdziała bo nikt nie wie jaki masz kod i jak to wygląda, trudno cokolwiek wykminić.

Nope, nie widać napisu 2D?  <3  + Czy wszystko typu sandbox to Minecraft? -.-

Proste, mam tablice 2 wymiarową 64 x 64 i chcę ją wysłać klientowi, lecz tak żeby nic nie wywaliło.. ^_^

 

 

Jak ja kocham dokumentacje :mellow: "Signals that an end of file or end of stream has been reached unexpectedly during input." Dobrze, lecz co jest tego powodem jeśli po prostu wysyłam całość a w połowie wywala że.. już koniec? :angry:

 

Tutaj macie kod:

 

Wysyłanie:

	public void sendLevel(){
        ArrayList<Integer> level = new ArrayList<Integer>();

        boolean is = false;
        int i = 0;
        for (int x = 0; x < Level.width; x++)
        {
            for (int y = 0; y < Level.height; y++)
            {
                if (Level.block[x][y].getId() != player.block[x][y].getId())
                {
                	i++;
                	
                	if(i > 1024){
                		addPacket(new Packet010LevelUpdate(level));
                		i = 1;
                	}
                	
                	level.add(x);
                	level.add(y);
                	level.add(Level.block[x][y].getId());
                	
                	player.block[x][y] = main.level.createFromId(Level.block[x][y].getId());
                    
                    is = true;
                }
            }
        }
        
        if(is){
        	addPacket(new Packet010LevelUpdate(level));
        }
	}

Pakiet:

public class Packet010LevelUpdate extends Packet {

	public Packet010LevelUpdate(ArrayList<Integer> level) {
		super(0x10);
		super.putInt(level.size() / 3);
		
		for(Object o : level){
			super.putInt((int) o);
		}
		
		super.putInt(-1);
	}

}

A tutaj odbieranie:

int lenght = dis.readInt();
		        
		        try {
			        for(int i = 1; i < lenght + 1; i++) {
			        	int x = dis.readInt();
			        	int y = dis.readInt();
			        	int bid = dis.readInt();
			        	
			        	Level.block[x][y] = game.level.createFromId(bid, new Rectangle(x * Tile.tileSize, y * Tile.tileSize, Tile.tileSize, Tile.tileSize));
			        }
		        } catch(EOFException e){
		        	e.printStackTrace();
		        }

;)

Opublikowano

Nope, nie widać napisu 2D?  <3  + Czy wszystko typu sandbox to Minecraft? -.-

Proste, mam tablice 2 wymiarową 64 x 64 i chcę ją wysłać klientowi, lecz tak żeby nic nie wywaliło.. ^_^

 

 

Jak ja kocham dokumentacje :mellow: "Signals that an end of file or end of stream has been reached unexpectedly during input." Dobrze, lecz co jest tego powodem jeśli po prostu wysyłam całość a w połowie wywala że.. już koniec? :angry:

 

Tutaj macie kod:

 

Wysyłanie:

	public void sendLevel(){
        ArrayList<Integer> level = new ArrayList<Integer>();

        boolean is = false;
        int i = 0;
        for (int x = 0; x < Level.width; x++)
        {
            for (int y = 0; y < Level.height; y++)
            {
                if (Level.block[x][y].getId() != player.block[x][y].getId())
                {
                	i++;
                	
                	if(i > 1024){
                		addPacket(new Packet010LevelUpdate(level));
                		i = 1;
                	}
                	
                	level.add(x);
                	level.add(y);
                	level.add(Level.block[x][y].getId());
                	
                	player.block[x][y] = main.level.createFromId(Level.block[x][y].getId());
                    
                    is = true;
                }
            }
        }
        
        if(is){
        	addPacket(new Packet010LevelUpdate(level));
        }
	}

Pakiet:

public class Packet010LevelUpdate extends Packet {

	public Packet010LevelUpdate(ArrayList<Integer> level) {
		super(0x10);
		super.putInt(level.size() / 3);
		
		for(Object o : level){
			super.putInt((int) o);
		}
		
		super.putInt(-1);
	}

}

A tutaj odbieranie:

int lenght = dis.readInt();
		        
		        try {
			        for(int i = 1; i < lenght + 1; i++) {
			        	int x = dis.readInt();
			        	int y = dis.readInt();
			        	int bid = dis.readInt();
			        	
			        	Level.block[x][y] = game.level.createFromId(bid, new Rectangle(x * Tile.tileSize, y * Tile.tileSize, Tile.tileSize, Tile.tileSize));
			        }
		        } catch(EOFException e){
		        	e.printStackTrace();
		        }

;)

Kod jest dziwny, ale mniejsza o to.

 

super.putInt(level.size() / 3);

 

tu jest blad

 

1024/3 = 341

 

341 * 3 = 1023 a nie 1024

 

o8HfXuR.png

CAPSLOCK TEAM - LEPIEJ WIDOCZNI WIDOCZNIE LEPSI

Cała prawda o LittleBlack

Opublikowano

Kod jest dziwny, ale mniejsza o to.

 

super.putInt(level.size() / 3);

 

tu jest blad

 

1024/3 = 341

 

341 * 3 = 1023 a nie 1024

 

hmmm.. źle myślisz, ponieważ w ArrayLiście masz x, y, id czyli 3 * 1024 :)

 

Dodam jeszcze że wywala też dziwne pakiety:

Unkown packet id: 3
java.io.EOFException
	at java.io.DataInputStream.readInt(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Unkown packet id: 3
Unkown packet id: 56
java.io.EOFException
	at java.io.DataInputStream.readInt(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
java.io.EOFException
	at java.io.DataInputStream.readInt(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Unkown packet id: 3
Unkown packet id: 56

Tak więc nie wiem już gdzie szukać, lecz myślę że po stronie serwera?

Opublikowano

hmmm.. źle myślisz, ponieważ w ArrayLiście masz x, y, id czyli 3 * 1024 :)

 

Dodam jeszcze że wywala też dziwne pakiety:

Unkown packet id: 3
java.io.EOFException
	at java.io.DataInputStream.readInt(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Unkown packet id: 3
Unkown packet id: 56
java.io.EOFException
	at java.io.DataInputStream.readInt(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
java.io.EOFException
	at java.io.DataInputStream.readInt(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Unkown packet id: 3
Unkown packet id: 56

Tak więc nie wiem już gdzie szukać, lecz myślę że po stronie serwera?

 

dobra, masz mnie. nie czaje kompletnie twojego kodu lol

o8HfXuR.png

CAPSLOCK TEAM - LEPIEJ WIDOCZNI WIDOCZNIE LEPSI

Cała prawda o LittleBlack

Opublikowano

dobra, masz mnie. nie czaje kompletnie twojego kodu lol

A masz może jakiś ogarnięty kod do przesyłania mapy? (za pierwszym połączeniem, potem wysyłam tylko aktualizacje)

 

 

 

Nie czyścisz listy 'level'.

hmmm. Fakt!!! Dzięki, za parę minutek (2 godziny  minuty o.O) przetestuję. ;)

 

Działa! Dobra, łap Like, niby proste clear() a tyle zamieszania.. -.-

 

Można zamknąć.

Opublikowano

Jak będziesz miał większą mapę to też będziesz po każdej sprawdzał czy jest inna?

Zresztą po co trzymać dwie instancje mapy?

 

Powinieneś wiedzieć (pewnie będziesz miał metody do stawiania/niszczenia) kiedy zmieniasz mapę i wtedy tworzyć jakąś listę zmian, którą potem wysyłasz. To jest strasznie nieoptymalne.

 

Jeśli będzie bardzo duża i przesyłanie całej mapy na początku będzie mijać się z celem to dzielisz na chunki i wysyłasz to co jest niedaleko. Zmiany też tylko te niedaleko. Również powinieneś wiedzieć w kodzie kiedy powinieneś wysłać kolejny chunk i odładować poprzeni, a nie lecieć po wszystkich.

Nie musisz nigdzie pamiętać czy coś jest załadowane (przy podejściu z chunkami może to być przydatne, wtedy jednak nie będzie to zbyt duży nakład tak jak w poprzednim przypadku).

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...