Diskuze: Grafika - manipulacia s objektami

C# .NET .NET (C# a Visual Basic) Grafika - manipulacia s objektami American English version English version

Avatar
Lunil
Člen
Avatar
Lunil:

Zdravim, mam celkom taky navrharsky dotazik.
Dopredu sa ospravedlnujem za tonu textu.

Rozmyslal som, ze by som pretvoril jednu stolnu hru na PC. (Pre zaujimavost je to Dungeons & Dragons alebo Draci doupie ). Cela logika a system hry je aj tak rieseny cez komunikacne zariadenie (skype atd...), takze najpodsatnejsie elenty su pre mna sietove spojenie, chat-pole, info okna a hracia plocha. Tu som s navrhom zamrzol.

Poziadavky na hraciu plochu:
Stvorcekova siet o rozmeroch X, Y policok
Vlozenie objektu(obrazku) o rozmeru XxY policok
Presunutie objektu po hracej ploche
Zrusenie urciteho objektu
Oznacenie objektu
klasika Undo/Redo
Zoom
Ulozenie/nacitanie hracieho planiku

do budocnosti :
Zmena velkosti Objektov na planiku (s tym, ze sa prejde na okraj objektu a tahanim sa meni velkost [podone ako pri winokne])
viacnasobne oznacenie objektov na planiku a manipulacia s nimi

Tu na fore som narazil na podobnu vec :
http://www.itnetwork.cz/…f7372609480c
Kde ku koncu je radene vsetko kreslit na jednu bitmapu. Napad dobry, ale neviem si predstavit posuvanie objektov pomocou mysky, Jedine zeby vzdy ked niekam klikne, vytvorila by sa bit mapa s danym pozadim stvorceka a ta by sa hybala pod myskou, ale toto mi pride, ze sa to asi takymto stylom nerobi.
(Hlavne ak do buducna oznacim viacej stvorekov, alebo by som ich chces zvecsovat-zmensovat.)

Davnejsie som robil nieco podobne. Vytvoril som canvas ktory reprezentoval nejaku plochu a na nu som nahadzal XY canvasou co predstavovali nejake znacky. S presuvanim to bolo Ok, ale akonahle som riesil nieco ako zmena velkosti, posuvanie viacej objektov naraz narazil som prestne na problem aky bol spominany v tom poste a to je blikanie.

Kukal som aj XNA (priznam sa nemam to uplne prejdeny cely tutorial co je tu v materialoch) len neviem ako by to dopadlo so sietovanim. (Popravde asi so vsetkym, kedze XNA som videl az dnes prvy krat :-D, ale keby bolo treba, tak aj to presprtam)

Mohli by ste mi prosim poradit ako sa taketo veci riesia (Manipulacia s objektami na hracom planiku)? Chcem to spravit poriadne a spravne.

Za odpovede vopred dakujem.

Odpovědět 25.10.2012 23:32
Neustalym resetovanim pocitaca ho dovedieme do pozadovaneho stavu. O:-)
Avatar
loob
Člen
Avatar
loob:

Pokud kreslíš přímo do windows formu (okna programu), tak si udělej vlastní bitmapy (nepoužívej pictureboxy) a nastav vlastnost formu DoubleBuffered na true (můžeš to udělat v designeru). Blikání při vykreslování přestane.

Každopádně, pokud se bude jednat o větší hru, tak to dělej přes xna, které řeší všechny věci pro vývoj her včetně síťování.

Nahoru Odpovědět 27.10.2012 12:08
Beskyde, Beskyde, kdo po tobě SCSI
Avatar
matesax
Redaktor
Avatar
Odpovídá na Lunil
matesax:

Rozhodně použij XNA. Kreslit na bitmapu? - ne - XNA... :) Objekt bude komponentka s vlastním vykreslováním - v update si pohlídáš hover - v hover click. Totéž u kláves - pohlídáš si GetState() v každé komponentce v update... Políčka vygeneruješ cyklem - já bych si postavil jeden velký obrázek a cyklus provedl jdenou. Cyklus bude projíždět x a y herní plochy vydělené velikostí jednoho políčka a podle určítého pravděpodobnostního modelu do zadané pozice vynásobené velikostí políčka přidá objekt...

Aby to bylo jasné - Update se pravidelně volá - a je v něm logika. Draw se také pravidelně volá - ale je tam vykreslování...

Editováno 27.10.2012 12:30
 
Nahoru Odpovědět  +1 27.10.2012 12:27
Avatar
David Čápka
Tým ITnetwork
Avatar
Nahoru Odpovědět 27.10.2012 12:37
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
matesax
Redaktor
Avatar
Odpovídá na Lunil
matesax:
public override void Update(GameTime gameTime)
{
    if (hover = Bounds.Intersects(new Rectangle(Mouse.GetState().X, Mouse.GetState().Y, 5, 5)))
    {
        if (MouseHover != null)
            MouseHover(this, new MouseEventArgs() { MouseState = Mouse.GetState() });

        if ((click = Mouse.GetState().LeftButton == ButtonState.Pressed) && Click != null)
            Click(this, new MouseEventArgs() { MouseState = Mouse.GetState() });
    }

    base.Update(gameTime);
}

Kde Bounds je rozměr objektu. A velikost kurzoru jsem zvolil 5x5. Obě události se ukládají do boolů - hover a click - a tak s nima můžeš dále nakládat...

Editováno 27.10.2012 12:39
 
Nahoru Odpovědět 27.10.2012 12:37
Avatar
Lunil
Člen
Avatar
Lunil:

Dakujem za rady
Troska som sa dnes viacej zavrtal do XNA.
Co sa tyka tej hracej plochy, tak to bude fakt jednoduchsie. Co neviem google alebo tutorial(tie videa tam co su pri tom auticku to je proste parada). Trosku som uviazol na jednom dvoch detailikov (zatial).

spriteBatch.Be­gin(SpriteBlen­dMode.none);
SpriteBlendMo­de.none <- toto mi ani za toho nechce poznat a neviem v com je problem, aj ked som to nasiel pod enum na stranke msdn

druhy detailik :
vsimol som si, ze co sa tyka zobrazenia, tak si taker vsetko musim spravit sam. Takze sa vynara otazka, ako spravit nieco take ako TextBox + ListBox + ako nastavit Obejkt aby ked sa nakreslil boli na nom scroolbary(ho­rizontalne aj vertikalne). Pre plochu napr. 5000x2000 pixelov v zobrazovacom okne 800x600 by sa aj hodili.

bonusova otazka :
Predstavme si ze mame hraciu plochu oramovanu ako pri tetrise (predpokladam, z v mojom pripade to bude musiet byt objekt), na tento objekt sa vlozi dalsia vrstva a to budu vertikalne a horizontalne ciary, vznikne sachovnica a na poslednu vrstvu sa budu vkladat obrazky.
Povedzme ze tuto hraciu plochu budem chciet zmensit alebo zvecsit. Z tutorialu auticko je tam manipulacia scale. Cize veskery suradnicovy system budem tymto cislom prenasobovat a upravovat. Ale nejde to spravit automaticky? Ze mu poviem tieto objekty su medzi sebou prepojene(ukotvene) a pri zmene scale vsetko podla toho prepocitaj ?

ps1: Dakujem za rady doteraz :)
ps2: Urcite sa potom este obratim so sietovanim na vas, ale to az neskorsie, treba ist krok po kroku :)
ps3: V pripade zaujmu, rad kod co momentalne robim mozem niekde zverejnovat, nemam s tym problem. (aj ked este momentalne nie je co, kedze to este nic nevie :-) )

Nahoru Odpovědět 27.10.2012 17:16
Neustalym resetovanim pocitaca ho dovedieme do pozadovaneho stavu. O:-)
Avatar
Kit
Redaktor
Avatar
Odpovídá na Lunil
Kit:

Pokud objekt vypropaguje manipulaci s rozměry do svých vnořených objektů, tak to fungovat bude.

Nahoru Odpovědět 27.10.2012 17:26
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Lunil
David Čápka:

To None by skoro mělo být s velkým, nevím, co to znamená nejde, asi to něco píše, možná ti to nabízí přidat using, kdo ví.

XNA nemá nic na formulářové prvky, ale je velmi triviální je naprogramovat. Určitě pro to bude nějaká knihovna na netu, ale jednodušší je snad si to napsat než se prosekávat nějakým cizím kódem. Scrollbary jsou též triviální, když použiješ tzv. nůžky.

Udělej si zdejší tutoriály, všechno je tam vysvětlené.

Nahoru Odpovědět 27.10.2012 19:49
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
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 8 zpráv z 8.