Avatar
Petr Nymsa
Redaktor
Avatar
Petr Nymsa:

Už zase otravuju :D. Splácal jsem jednoduchou 2D kameru z ptačí perspektivy. Funguje tak, že vždy centruje na hráče, nebo se o to aspoň snaží. Dneska jsem nad tím strávil skoro celý den a nějak mi to přestává myslet a zároveň to potřebuju dávat dokupy.

Další věcí je optimalizace vykreslování. Snažím se vždy vykreslit jenom část objektů které jsou aktuálně vidět, to problém není.

Poslední věcí, jak udělat aby se camera přestala pohybovat, dky žse blížím ke konci mapy ? Když se nepřestane pohybovat, vypadá to že hráč stojí na místě a okolní svět se hýbe.

Prosím postrčte mě správným směrem, už toho mám az dnešek dost, ale budu mít ještě víc :D

Odpovědět 11.5.2013 16:37
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Petr Nymsa
Redaktor
Avatar
Petr Nymsa:

Jo a ještě posílám kód kamery :`

public class Camera
   {
       public Matrix Transform { get; private set; }
       Viewport view;
       Vector2 origin;

       public Camera(Viewport view)
       {
           this.view = view;

       }

       public void Update(Rectangle rectangle)
       {
          this.origin=new Vector2(rectangle.X + (rectangle.Width / 2 - view.Width/2), rectangle.Y + (rectangle.Height / 2 - view.Height/2));
            Transform = Matrix.CreateScale(new Vector3(1, 1, 0)) * Matrix.CreateTranslation(new Vector3(-origin.X, -origin.Y, 0));
       }

   }
Nahoru Odpovědět 11.5.2013 16:41
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Frunta
Redaktor
Avatar
Odpovídá na Petr Nymsa
Frunta:

Tohle jsem také nedávno řešil a mám to udělané tak, že s pohybem hráče ověřuji jeho souřadnice, jestli není v okrajové zóně, pokud ne, tak posunu hráčem a nastavím posunutí kamery podle jeho souřadnic, pokud je v okrajové zóně, tak jen posunu hráčem.

Tohle je ověřování souřadnice Y.

if(hrac.y >= obrazovka.vyska/2 - hrac.vyska/2 && hrac.y + hrac.vyska <= mapa.vyska - obrazovka.vyska/2 + hrac.vyska/2)
        posunuti.y = hrac.y + hrac.vyska/2 - obrazovka.vyska/2;

A tohle je vykreslení hráče.

vykreslit(hrac.obrazek, hrac.x - posunuti.x, hrac.y - posunuti.y);

Doufám, že jsem to dobře popsal a že to k něčemu bude.

Editováno 11.5.2013 17:11
 
Nahoru Odpovědět 11.5.2013 17:09
Avatar
Frunta
Redaktor
Avatar
Odpovídá na Petr Nymsa
Frunta:

Dvojité odeslání příspěvku.

Editováno 11.5.2013 17:10
 
Nahoru Odpovědět 11.5.2013 17:09
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na Frunta
Petr Nymsa:

Zjišťuju že jsem ve stavu kdy nevnímám ani sám sebe :D .. musím asi na chvilku na vzduch.

posunuti = posunuti kamery ?

No přiznám se že ta kamera je tak nějak splácaná podle internetu.Ten origin je střed posunutí kamery, tedy zaměřená na hráče, problém je že to vlastně není uprostřed obrazovky. POtřeboval bych aby ta kamera byla opravdu uprostřed obrazovky, ted když chodím bludištěm hráč je jakoby furt na kraji obrazovky a svět se hýbe. Dokud nejsi na okraji tka to vypadá celkem dobře.

Takže vždy kontrola zda se neblíží ke kraji a zastavím posun kamery ale pouze posunu hráče ? Jo to by šlo. Jinak vykreslování mám přes ten Matrix takto

g.spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, null, null, null, null, camera.Transform);


           g.spriteBatch.End();

Už dneska asi nemůžu pokračovat -> brain.Dispose() :D

Díky :)

Nahoru Odpovědět 11.5.2013 17:17
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Frunta
Redaktor
Avatar
Odpovídá na Petr Nymsa
Frunta:

Ano, posunutí asi znamená posunutí kamery. Ale nevím jak je to v C# se souřadnicemi. Já mám X = 0 a Y = 0 v levém horním rohu.

 
Nahoru Odpovědět 11.5.2013 17:26
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na Frunta
Petr Nymsa:

No to je tne problém, standartně je souřadnice také [0,0] ale kvůli těm Matrix transformacím to mám jinak a já tomu nerozumím :D. Někdo, kdo dělá v XNA a tohle řešil ?

Nahoru Odpovědět 11.5.2013 17:32
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Petr Nymsa
Redaktor
Avatar
Petr Nymsa:

Dokázal by mě někdo navést správným směrem jak udělat jednoduchou kameru z ptačí perspektivy ? Peru se s tím a nemůžu to nějak dát dokupy :@

Nahoru Odpovědět 12.5.2013 17:27
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Petr Nymsa
Redaktor
Avatar
Petr Nymsa:

Kdokoliv :D už jsem bezradnej...

Nahoru Odpovědět 12.5.2013 17:49
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Petr Nymsa
Redaktor
Avatar
Petr Nymsa:

Tak jsem se nakonec ponížil vykrást cizí kód, vcelku chápu funkčnost, ale jedna věc mi nefunguje. Potřebuju vykreslovat pouzey ty objekty, které jsou vidět na obrazovce. V tom kódu tam už je metoda, která by měla pravděpodobně fungovat ale nefunguje korektně (kod je zde http://stackoverflow.com/…llows-sprite). Nasměroval by mě někdo kudy kam ? Už z toho blbnu a ani pořádně už neuvažuju. Kvůli tomuhle jsem se zasekl.

Nahoru Odpovědět 12.5.2013 21:20
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Odpovídá na Petr Nymsa
Luboš Běhounek (Satik):

To urcovani toho, co videt bude a co ne je ve 2D proste jen kolize dvou obdelniku - pokud se obdelnik obrazovky a obdelinik odpovidajici boundingboxu objektu protnou, pak objekt vykreslis, jinak ne, musis samozrejme do toho zahrnout veci jako zvetseni obrazku, pripadne rotaci.

Jinak to s tim posunem kamery - pres matice nevim, ale jinak bych to resil proste posunem a kraje pres min/max, neco jako

view.x = player.x-(screen.width/2)

a s tema krajema

view.x = min(map.width-screen.width,max(0,player.x-(screen.width/2)))
Editováno 12.5.2013 23:15
Nahoru Odpovědět 12.5.2013 23:14
:)
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 11 zpráv z 11.