meijuh schreef:Kun je misschien meer van je java code posten? We zitten zo maar een beetje te gokken hier...
Waarom gebruik je Serializable?
Is er nog een andere manier om dingen te verzenden buiten Serializing?
Ik zal misschien een uitgebreidere omschrijving geven.
Er zijn twee spelers, de server en client, die beide hetzelfde programma openen.
Deze spelers zitten in het programma als volgt:
Verborgen inhoud
class Players
{
public static Player thisPlayer,otherPlayer;
}
Elke speler heeft 1 actieve kaart op het veld en tot 5 andere niet-actieve kaarten (Bench):
Verborgen inhoud
class Player implements Serializable
{
public ActiveCard activeCard;
public Bench bench;
}
ActiveCard:
Verborgen inhoud
class ActiveCard implements Serializable
{
Card card;
}
Bench:
Verborgen inhoud
class Bench implements Serializable
{
Card[] card;
}
en Card zelf:
Verborgen inhoud
class Card implements Serializable
{
Source source
Vector<Source> attachedCards;
}
waarbij Source de kaart beschrijft, dus welke afbeelding, de naam en andere gegevens.
Nu kan een speler een kaart toevoegen aan de attachedCards van de actieve kaart.
Dit gebeurt als volgt:
De speler klikt op de knop dat hij een kaart wil toevoegen. Op dit moment wordt een opdrach aangemaakt die uitgevoerd wordt wanneer de speler op de actieve kaart klikt:
Verborgen inhoud
Executable e=new Executable(){
public void execute()
{
Players.thisPlayer.activeCard.attachedCards.add(getSelectedCard());
Update.updateActive(true);
}
}
onLeftClick=e;
wanneer de speler dan klikt gebeurt: onLeftClick.execute()
De geselecteerde kaart wordt dus toegevoegd, waarna een update hierrvan wordt verstuurd naar de andere speler.
Update:
Verborgen inhoud
public class Update implements Serializable
{
Object o;
boolean bool;
public Update(Object o)
{
this.o=o;
}
public static updateActive()
{
Send.send(new Update(Players.thisPlayer.activeCard));
}
De methode send() stuurt het object door via de outputsream van de server of client.
Wanneer een object binnenkomt gebeurt het volgende:
Verborgen inhoud
public static void whatToDo(Object ob)
{
if (ob instance of Update)
{
if (ob.o instance of ActiveCard)
{
Players.otherPlayer.activecard=(ActiveCard)ob.o;
}
}
}
Waar zit nu het probleem:
De andere speler krijgt probleemloos het object van Update aan.
Er zit de juiste kaart in, maar de vector attachedCards is nog altijd leeg. De kaart werd dus niet toegevoegd.
Een gelijkaardig probleem treedt op bij het verwisselen van kaarten:
Een speler kan zijn actieve kaart wisselen met een van zijn niet-actieve kaarten (bench):
Verborgen inhoud
public void switch(int benchSlot)
{
ActiveCad temp=Players.thisPlayer.activeCard.card;
Players.thisPlayer.activeCard.card=Players.thisPlayer.bench.card[benchSlot];
Players.thisPlayer.bench.card[benchSlot].card=temp;
Update.updateActive();
Update.updateBench(benchSlot);
}
updateBench is analoog aan updateActive.
De andere speler krijgt nu dus twee Updates aan, 1 met de nieuwe actieve kaart, en 1 met de nieuwe niet-actieve kaart.
Maarde actieve kaart die hij aankrijgt is nog steeds de oude, niet de verwisselde, idem voor de bench-kaart.
Maw, er is dus niets verandert voor de andere speler.
ik dacht eens te kijken wat er gebeurt door af te printen wat er verzonden wordt en wat ontvangen wordt.
Dus in de methode updateActive:
println(Players.thisPlayer.activeCard.card.toString());
en in de methode whatToDo(ActiveCard a):
println(a.card.toString());
Stel dat bij het verwisselen de originele actieve kaart 'Original' heet, en de nieuwe 'New'.
Dan zien we bij de verzender het volgende: 'Original'
Maar de ontvanger print 'New'.
Hetzelfde bij het toevoegen van een kaart: als ik bij de verzender de groote van de vector attachedCards print, krijg ik 1, terwijl de ontvanger 0 print.
Ik heb al een oplossing gevonden voor het wisselen van twee kaarten, al weet ik wel niet waarom die werkt:
in plaats van de originele Update.updateActive te gebruiken, heb ik deze vervangen door:
Verborgen inhoud
public void updateActive()
{
Send.send(new Update(Players.thisPlayer.activeCard.getCopy()));
}
Door getCopy() te schrijven, krijgt de andere speler wél de vernieuwde kaart aan.
getCopy:
Verborgen inhoud
public class ActiveCard imlplements Serializable
{
public ActiveCard getCopy()
{
ActiveCard copy=new ActiveCard();
copy.card=this.card;
... // en de andere variabelen worden ook zo gekopieerd.
}
}
Dit werkt dus wel voor het wisselen, maar nog altijd niet voor het toevoegen van een kaart.
Ik heb heel deze ochtend liggen testen en mij lijkt het of de methode updateActive() toch een vroegere variant
van Players.thisPlayer.activeCard doorstuurt.
Als het misschien meer duidelijkheid zou brengen, wil ik gerust de huidige code wel op internet zetten, mocht iemand die willen doorworstelen (ik ben nogal een slordige programmeur).