Avatar
matesax
Redaktor
Avatar
matesax:

Dobrý den,
o první část se postará MemberShip. Dále tu mám tabulky a zároveň modely: MainData - nick, jméno, email,...; State - zdraví, typ lodi, náklad,...; Wealth - děla, munice, piráti,... Problém je, že je stejně potřebuji mít skoro na každé stránce - a na moři již nemluvě, tak se chci zeptat - má to smysl dělit? Děkuji.

 
Odpovědět 10.11.2012 6:33
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Ne. A jak zní otázka?

Nahoru Odpovědět 10.11.2012 9:30
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

Problém je, že je stejně potřebuji mít skoro na každé stránce - a na moři již nemluvě, tak se chci zeptat - má to smysl dělit?

A to ne patří tam ne? :)

 
Nahoru Odpovědět 10.11.2012 9:33
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Patří tam ne. Nemá smysl to dělit. Jen jsem nepochopil otázku a stále ji nechápu. Netuším, o čem je řeč.

Nahoru Odpovědět 10.11.2012 9:39
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

Mám uživatele, ten má data - já je rozdělil - abych mohl poslílat formuláře - na nákup věcí - (zvlášť lodě, piráti,... a zvlášť od úplně nesouvisejících dat). Takže jsem si chtěl posílat data přes ViewModel do každé stránky - co by jí příslušelo. Jenomže pokyny a další faktory mě stejně donmutily vše posílat do skoro každé stránky. Takže mě rozdělení spíše zdržuje. Ale zase si neumím představit tbulku s 22 sloupci... A jak to bude na moři to si již vůbec neumím představit... :)

Editováno 10.11.2012 9:50
 
Nahoru Odpovědět 10.11.2012 9:48
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Viděl jsem tabulku se 130 sloupci, ale rozhodně to nedoporučuji. V daném případě to může být i ve více než dvou tabulkách. Záleží na tom, jak dopadne normalizace. Model však má být jen jeden.

Nahoru Odpovědět 10.11.2012 9:51
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

OK - tabulky jsou tři - jak jsem psal. Počítam s více typy děl atp. takže je to rozdělení na místě. Udělám to, jak píšeš...

 
Nahoru Odpovědět 10.11.2012 9:54
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Ze začátku jsem psával jednoduché modely, jak mi kdosi poradil. Pak jsem přišel na to, že vyjde jednodušší, když mu svěřím celou starost o databázi. To znamená, že controller modelu dodává data, která chce modifikovat a viewer si od něj vyptává data, která chce zobrazit.

Nahoru Odpovědět 10.11.2012 10:04
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

A jak bych si měl vůbec poradit s nákupy? Totiž neustálé kontakty s databází budou zdržovat ne? Chtěl jsem zneužít virtuální paměti - mít to v proměnných, ale zdá se, že nemá smysl ani ten model. Totiž brát data přímo při vstupu nelze - JS nemůže pracovat s databází. Takže musím udělat formulář. Nechám tedy uživatele naklikat, kolik chce čeho - nejspíše zvaliduji, zda na to má dostatečný obnos - a odesílacím inputem to bude posláno do ActionResult a tam mohu rovnou updatovat řádek v tabulce - na což mi stačí ukládat Nick, který používám jako ID... Model bych stejně nemohl poslat na moře - GWT, takže i tam budu mít asi přímý kontakt s DB. Co myslíš? :)

Editováno 10.11.2012 10:13
 
Nahoru Odpovědět 10.11.2012 10:11
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Neustálý kontakt s databází je naprosto běžný. Jen se musí minimalizovat počet dotazů, abychom se databáze neptali na jednotlivé položky záznamu, ale vždy na celý záznam (všechny sloupce, které potřebujeme) nebo rovnou na výsledek nějakého spojení více tabulek. Tak, aby pokud možno controller z modelu nečetl a viewer do něj nezapisoval.

BTW: Proč nemůžeš poslat model na moře?

Editováno 10.11.2012 10:38
Nahoru Odpovědět 10.11.2012 10:36
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

Do Javy?

(Vše píši v dotazech a poddotazech...)

Editováno 10.11.2012 10:42
 
Nahoru Odpovědět 10.11.2012 10:41
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Co to má společného s Javou?

Nahoru Odpovědět 10.11.2012 10:45
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

Moře bude v Javě - tedy GWT... (Google Web Toolkit)

Editováno 10.11.2012 10:46
 
Nahoru Odpovědět 10.11.2012 10:45
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

Nebo máš lepší návrh?

 
Nahoru Odpovědět 10.11.2012 10:52
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Přece nedovolíš moři, aby ti přímo zapisovalo do databáze. Musí hezky poprosit model.

Nahoru Odpovědět 10.11.2012 10:56
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

A ten GWT - dobrá volba?

 
Nahoru Odpovědět 10.11.2012 10:58
Avatar
Kit
Redaktor
Avatar
Nahoru Odpovědět 10.11.2012 10:59
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

Tak v čem by jsi to dělal ty? :)

 
Nahoru Odpovědět 10.11.2012 11:01
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

A co? Netuším, co děláš.

Nahoru Odpovědět 10.11.2012 11:04
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

Hru podobnou Seafight. Takže prostě hráči řídí své lodě po moři, útočí na sebe, sbírají nejrůznější věci, plní úkoly,... Webowou část (správa účtu, správa herního majetku, správa questů,... + fórum,...) dělám v ASP. Tedy vše mimo hrací plochu - moře. Ovšem v čem udělat to moře? Byl mi doporučen ten GWT...

Nakupovat, brát questy atp. má jít jak na moři, tak i ve webové části,...

Editováno 10.11.2012 11:11
 
Nahoru Odpovědět 10.11.2012 11:11
Avatar
Drahomír Hanák
Tým ITnetwork
Avatar
Odpovídá na matesax
Drahomír Hanák:

Jak na to tak koukám, tak to radši udělej v JS. Ten GWT tě nějak mate. Je to Java kompilovaná na JS. To znamená, že je to client-side. Pokud bys chtěl něco nějak ukládat, musíš se vždy zeptat serveru (AJAXem), pokud teda nepotřebuješ dočasné uložiště, jako je sessionStorage, localStorage nebo IndexedDB.

 
Nahoru Odpovědět 10.11.2012 11:16
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Jenže moře jen zprostředkovává požadavky, které vyřizuje webová část. Jinak by ti hráči dělali podfuky.

Nahoru Odpovědět 10.11.2012 11:19
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Drahomír Hanák
matesax:

Aj - to mne vůbec nenapadlo. No já sám nevím, jak to řešit a JS si moc nepomůži... :) První věc - kam to budu vykreslovat? A druhá - co tedy s uživatelskými daty - přecijen bude nejlepší je co nejdříve uložit do DB...

 
Nahoru Odpovědět 10.11.2012 11:20
Avatar
Drahomír Hanák
Tým ITnetwork
Avatar
Odpovídá na matesax
Drahomír Hanák:

Vykreslovat můžeš třeba na HTML prvek canvas. Teoreticky bys mohl kreslit i pomocí SVG (tam je výhoda, že View je vlastně XML, takže se s tím pěkně manipuluje v JS). Canvas je ale na tohle lepší a má větší podporu prohlížečů. Do databáze bys to ukládal asi pomocí AJAXu (asynchronního požadavku klienta na server)

Jak tak koukám na tu hru Seafight, tak to bude trochu problematické. To je real-time? To pak musíš použít WebSockets v JS a udělat si nějaký centrální prvek (třeba v Javě, C# nebo i PHP), který to bude řídit a spojovat všechny hráče. To není nemožné, ale taky to není žádná sranda.

Editováno 10.11.2012 11:27
 
Nahoru Odpovědět 10.11.2012 11:24
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Vykreslovat to budeš na canvas. Každou akci pošleš jako ajaxový požadavek na server, ten dle potřeby aktualizuje databázi a jako odpověď pošle, co se má změnit v klientské části.

Nahoru Odpovědět 10.11.2012 11:25
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Drahomír Hanák
matesax:

Jo děkuji (oběma :) ) - nyní to chápu... Přišlo mi, že dělat něco jako Seafight na Canvas...

(právě - real-time)

Editováno 10.11.2012 11:30
 
Nahoru Odpovědět 10.11.2012 11:28
Avatar
Kit
Redaktor
Avatar
Odpovídá na Drahomír Hanák
Kit:

Vidíš, SVG mě pro tento účel nenapadlo. To by však musel ten web být v XHTML.

Nahoru Odpovědět 10.11.2012 11:33
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Drahomír Hanák
matesax:

Tak jsem se dočetl, že se to používá na chaty atp. - nebude hra na to moc náročná?

 
Nahoru Odpovědět 10.11.2012 11:37
Avatar
Drahomír Hanák
Tým ITnetwork
Avatar
Odpovídá na matesax
Drahomír Hanák:

Výkon JavaScriptu se za poslední roky několikanásobně zvýšil. Můžeš tam vykreslovat i dost detailní 3D grafiku, takže myslím, že tohle je jen maličkost. Hra rozhodně náročná (pro klienta) nebude. Navíc nebude vyžadován žádný plug-in ke stažení, což je taky velké plus. Spíš to bude zatěžovat server, na kterém to pojede a v tom JavaScriptu bude režie hry o dost těžší, než třeba v Javě. Možná bych se podíval po nějakém JS frameworku.

Kit: Však to jde zapsat i do HTML5, ne? Teda alespoň v chromu mi to funguje dobře.

 
Nahoru Odpovědět 10.11.2012 11:45
Avatar
Kit
Redaktor
Avatar
Odpovídá na Drahomír Hanák
Kit:

No jo, SVG funguje v HTML5 pěkně. Díky za tip.

Však na serveru to pojede v Javě nebo v něčem podobném, ne?

Nahoru Odpovědět 10.11.2012 12:00
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Drahomír Hanák
Tým ITnetwork
Avatar
Odpovídá na Kit
Drahomír Hanák:

Jasně na serveru to může zpracovávat de facto jakýkoli serverový jazyk. Viděl jsem i WebSockets server v PHP. Samozřejmě to jde napsat i v Javě, C# (tady existuje spousta knihoven pro práci s WS) a dalších jazycích. Je to dost zajímavé. Napsal jsem si vzdálené ovládání PC pro změnu hlasitosti a spouštění hudby. Google zas s pomocí WS udělal webovou aplikaci jako dálkové ovládání na G+ a další své služby :) Dost v tom vznikají i chaty a podobné aplikace, které si nevystačí s HTTP.

 
Nahoru Odpovědět 10.11.2012 12:17
Avatar
matesax
Redaktor
Avatar
Odpovídá na Drahomír Hanák
matesax:

Tak jsem to dokázal! :) Jedu přes SilverLight - kde se stačí spojit s WCF a tím to propojit se serverem. Trochu mě štve, že jsou s ním problémy - zdá se, že mu vadí Win. 8 - a na FF nejede vůbec...

 
Nahoru Odpovědět 19.11.2012 6:56
Avatar
Drahomír Hanák
Tým ITnetwork
Avatar
Odpovídá na matesax
Drahomír Hanák:

Co jsem slyšel, tak Silverlight je dnes už mrtvá technologie. V C# se s tím ale musí dělat pěkně.

 
Nahoru Odpovědět 19.11.2012 15:05
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na matesax
David Čápka:

Jak říká Drahomír Hanák, Silverlight je mrtvý, stejně jako Flash. Vytlačilo je HTML 5.

Nahoru Odpovědět 19.11.2012 15:24
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Kdysi jsem si chtěl Moonlight nainstalovat, ale z nějakého důvodu jsem si to rozmyslel. Už ani nevím proč. Pokud je Moonlight skutečně mrtvý, tak už ho ani instalovat nebudu.

Možná mi vadilo, že nebyl na oficiálních instalačkách OS, ale od nějaké firmy Microsoft.

Nahoru Odpovědět 19.11.2012 16:38
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na David Čápka
matesax:

Tak v HTML5 to asi těžko udělám... :) Zkouším nyní WPF. Přijde mi ale blbé mít stranu klienta a stranu serveru - tedy stejně potřebuje každý klient vidět všechny hráče ve hře. Tak jsem přemýšlel, že by u klienta vznikaly a prováděly se jen akce a na serveru by probíhalo zpracování a možná i vykreslování. Ovšem tím bych musel vymyslet, jak řešit třeba plutí lodi. Totiž - přijde mi blbé mít vše u klienta a neustále kontaktovat server (vše se tím provádí 2X) - chtěl bych toho co nejvíce přenést rovnou na server...

 
Nahoru Odpovědět 20.11.2012 16:06
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Snad obráceně, ne? Akce se provádí na serveru a vykreslování na klientovi. Základním pravidlem je co nejvíc práce převést na klienta, ale veškerou logiku hry a data ponechat na serveru.

Nahoru Odpovědět 20.11.2012 16:18
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

Jasně - jak jsem psal, to bude pak tak, že se klient pohne - a bude pořád kontaktovat server o své pozici - aby mohl být vykreslen i ostatním hráčům... Kdybych kreslil rovnou na serveru, mohl bych kreslit všechny hráče najednou...

 
Nahoru Odpovědět 20.11.2012 16:24
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Jenže na serveru nemůžeš tak plýtvat výkonem jak na klientovi. Ať si to každý klient vykreslí sám. Také tím ušetříš přenosovou kapacitu.

A nevymýšlej ptákoviny. Obrázky se na serveru nevykreslují.

Nahoru Odpovědět 20.11.2012 16:52
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

A v čem to tedy dělat? Zkouším XBAP, ale místo spuštění se dočkám akoráte stahovacího dialogu. Tak už mi došly nápady v čem to udělat... :)

Editováno 22.11.2012 17:36
 
Nahoru Odpovědět 22.11.2012 17:35
Avatar
Kit
Redaktor
Avatar
Nahoru Odpovědět 22.11.2012 18:06
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

Pomůžeš mi s tím? Snad jsem již pochytil, jak pracovat se Sockety, ale nějak mi to nefunguje. :) Za základ jsem vzal zprovoznění této hry:

http://www.codeproject.com/…ame-in-HTML5

Kde JS kód pro komunikaci se serverem vypadá takto:

var socketSetup = function() {
        if(typeof(WebSocket) !== 'undefined') {
            socket = new WebSocket('ws://37.157.196.207:8080');
                socket.onopen = function() {
                        multiPlayer = true;
                        document.title = 'SpaceShoot MULTIPLAYER';
                };
                socket.onclose = function() {

                };
                socket.onmessage = function(e) {
                        var obj = JSON.parse(e.data);

                        if(obj.asteroid) {
                                var a = obj.asteroid;
                                asteroids.push(new asteroid(a.size, a.life, a.angle, a.rotation, a.x, a.y, a.vx, a.vy));
                        } else if(obj.added) {
                                for(var i = obj.added.length; i--; )
                                        ships.push(new ship(obj.added[i], { }, ships.length));
                        } else if(obj.removed) {
                                for(var i = ships.length; i--; )
                                        if(ships[i].id === obj.removed) {
                                                ships.slice(i, 1);
                                                break;
                                        }
                        } else if(obj.logic) {
                                for(var i = ships.length; i--; )
                                        if(ships[i].id === obj.logic.ship.id) {
                                                ships[i].control.shoot = obj.logic.keyboard.shoot;
                                                ships[i].control.left = obj.logic.keyboard.left;
                                                ships[i].control.right = obj.logic.keyboard.right;
                                                ships[i].control.up = obj.logic.keyboard.up;
                                                ships[i].control.down = obj.logic.keyboard.down;
                                                ships[i].boost = obj.logic.ship.boost;
                                                ships[i].angle = obj.logic.ship.angle;
                                                ships[i].x = obj.logic.ship.x;
                                                ships[i].y = obj.logic.ship.y;
                                                ships[i].life = obj.logic.ship.life;
                                                ships[i].ammo = obj.logic.ship.ammo;
                                                ships[i].hitByAsteroid = obj.logic.ship.hitByAsteroid;
                                                ships[i].hitAsteroids = obj.logic.ship.hitAsteroids;
                                                ships[i].shotAsteroids = obj.logic.ship.shotAsteroids;
                                                ships[i].hitShips = obj.logic.ship.hitShips;
                                                break;
                                        }
                        }
                        else if(obj.status) {
                                ships[0].x = obj.status.x;
                                ships[0].y = obj.status.y;
                                gameRunning = true;
                        }
                };
        } else
                gameRunning = true;
};

A na server jsem umístil poslouchač:

class SeaManager
{
    private const int gamePlayers = 4;

    public SeaManager()
    {
        int id = 1000,
            ticks = 0;

        Random ran = new Random();
        Hashtable allSockets = new Hashtable();
        WebSocketServer server = new WebSocketServer("ws://37.157.196.207:8080");
        Timer timer = new Timer(40);
        bool gameRunning = false;

        server.Start(socket =>

...

socket.OnMessage = message =>
{
    JsonObject json = new JsonObject();
    json["logic"] = JsonObject.Parse(message);
    json["logic"]["ship"]["id"] = (int)allSockets[socket];
    string back = json.ToString();

    foreach (IWebSocketConnection s in allSockets.Keys)
        if(s != socket)
            s.Send(back);
};

A v Controlleru - před zobrazením stránky vytvořím instanci:

public ActionResult Sea()
{
    new SeaManager();

    return View(user);
}

Co dělám špatně? Děkuji.

Editováno 23.11.2012 15:11
 
Nahoru Odpovědět 23.11.2012 15:09
Avatar
matesax
Redaktor
Avatar
matesax:

Problém skoro vyřešen, jen se mi spojení předčasně ukončí:

Časová značka: 25.11.2012 9:13:57
Chyba: Spojení se serverem ws://37.157.196.207:8080/ bylo v průběhu načítání stránky ukončeno.
Zdrojový soubor: http://kos.lusorion.com/Scripts/Sea/sockets.js
Řádek: 3

Kde mám hledat chybu? Děkuji.

 
Nahoru Odpovědět 25.11.2012 9:15
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 43 zpráv z 43.