játékfejlesztés.hu
FórumGarázsprojectekCikkekSegédletekJf.hu versenyekKapcsolatokEgyebek
Legaktívabb fórumozók:
Asylum:    5500
FZoli:    4893
Kuz:    4455
gaborlabor:    4449
kicsy:    4304
TPG:    3402
monostoria:    3284
DMG:    3172
HomeGnome:    2919
Matzi:    2528

Pretender:    2498
szeki:    2440
Seeting:    2306
Geri:    2197
Orphy:    1893
Joga:    1791
Bacce:    1783
MaNiAc:    1735
ddbwo:    1654
syam:    1491
Korábbi postok
> 1 < [2] [3] [4] [5] [6] [7] [8] [9] [10] [15] [20] [25] [30] [35] [40] [45] [50] [55]
Ferke - Tag | 27 hsz       Online status #161929   2011.08.30 11:36 GMT+1 óra  
Sziasztok!
Valaki eltudná nekem mondani nagyvonalakban, hogy hogyan zajlik XNA alatt egy 3D karakter animálása? Mármint van leanimált karakterem és az érdekel, hogy hogyan tudom azt XNA-ben pl.: mozgás szimulálására használi egy beállított gomb lenyomásakor. Maga a folyamatra vagyok kiváncsi hogy a karakter egy álló state-ből ha lenyomom mondjuk a W-gombot, akkor a meginduljon előre. (3D character movement).
TY

   
Pretender - Törzstag | 2498 hsz       Online status #161902   2011.08.30 08:03 GMT+1 óra  
Vagy csinálsz egy sprite osztályt, meg akkor mondjuk egy Ellenseg osztályt, ami a viselkedéseket tudja szimulálni (~ AI).
Azt viszont nem értem, hogy miért kell több Ellenseg lista... Ha csak egy van, akkor tök egyszerű.

Megjegyzem, new-olni nem szoktak render loopban (listát pláne nem)

   
Parallax - Tag | 609 hsz       Online status #161888   2011.08.30 01:03 GMT+1 óra  
new Rectangle azért az nem valami performancia megoldás így a render loop-ba izomból szerintem. Egyszerűbb és gyorsabb csak simán értékeket adni a tagoknak.

A második ötlet jónak jó, de alapvetően zagyvaság a progi ezért kell hozzá ilyen megoldást írnod. Megint az van, amit már írtam, az Ellenseg, vagy mi volt az osztály saját magát ellenőrizze, hogy ütközik e másokkal és kész.

   
Pixi - Tag | 206 hsz       Online status #161882   2011.08.30 00:29 GMT+1 óra  
El sem hiszem, hogy működik:

Kód:
            foreach (ellenseg ell in ellensegek)
            {
                ell.forras = new Rectangle((int)ell.pont.X, (int)ell.pont.Y, 60, 50);
            }

            foreach (ellenseg2 ell2 in ellensegek2)
            {
                ell2.forras = new Rectangle((int)ell2.pont.X, (int)ell2.pont.Y, 60, 50);
            }


Csak ennyi volt a gondja

Amúgy meg én sem suliban tanulom, kénytelen vok itthon magam, + net, + ez a fórum ami sokat segített rajtam eddig.

Volna még egy olyan kérdésem így mellékesen, bár nem problémáról van szó...hogy ezt a foreach-ot ti hogyan oldjátok meg, ha azt szeretnétek, hogy egyszerre több különböző List-et lekezeljetek 1 helyen? Mert annyit tudok mozgatásnál van egy hátránya. Ha a dupla foreach-ben szeretném mozgatni 1-es sebességgel az ellenségeket, akkor ő ebben az esetben sokkal gyorsabban mozgatná, ezért külön kellett válasszam a kettőt, és csak abban az esetben használni a duplát, amikor törölni akarom az elemet, mert olyankor nincs olyan hogy mozgatás, csak eltávolítás. Pontosabban erre gondolok:

Kód:
            foreach (ellenseg ell in ellensegek)
                foreach (ellenseg2 ell2 in ellensegek2)
                {

                    if (ell.forras.Intersects(ell2.forras))
                    {
                        torles.Add(ell);
                        torles2.Add(ell2);
                    }
                }


És pont azért, mert a két Lista elemei között kell kapcsolatot teremteni. Jó ez így, vagy van ennél egyszerűbb megoldása is ennek?

   
Parallax - Tag | 609 hsz       Online status #161877   2011.08.30 00:14 GMT+1 óra  
Meg lehet persze, nem hétpecsétes titkok ezek. Azzal van csak a gond, amikor valaki tényként jelent ki saját hülyeségeket és arra is lusta, hogy utána nézzen a dolgoknak. Nagy zsiványok szoktak csinálni ilyeneket. Lehet vicces, de sakkozni is úgy tanultam, hogy fogtam 1-2 jó könyvet és átnéztem a nyitásokat, végjátszmákat stb, nem csak úgy leültem aztán sitty-sutty.

   
Bukta - Tag | 308 hsz       Online status #161867   2011.08.29 23:31 GMT+1 óra  
sztem sokan nem suliba tanultak meg programozni, én bejártam a szoftverfejlesztő szakmára is,de kb addig tartott a dolog h mi az a függvény meg eljárás meg változó... én is magamtól tanultam meg mindent még a szakmám előtt teljesen 0áról és igen a 21 napos könyvből. Elolvastam az egész könyvet és még most is van h előveszem ha vmi nem jut eszembe. Elég jó könyv, igaz vannak benne elsőre nehéz részek, de az is kitisztul idővel. Szal sztem meg lehet belőle tanulni programozni csak akarni kell.
Jah meg közbe forumon is kérdeztem az elején többet -, de aztán mikor rájöttem, h mindenki elküld a googléra ahelyett, h 2 szót bepötyögjön - utána 1re kevesebbet. Nah ennyi
ArgumenException: A megadott DependencyObject nem ehhez a Freezable elemhez tartozó környezet. Paraméter neve: context
:oO Mi a???
   
Parallax - Tag | 609 hsz       Online status #161859   2011.08.29 22:58 GMT+1 óra  
Én nem jártam prog specifikus suliba, autodidakta tanultam a szakmát. Ettől függetlenül nem mentem/megyek fejjel a falnak, csak magamnak raktam/rakom össze a tananyagot.

   
Kuz - Törzstag | 4455 hsz       Online status #161853   2011.08.29 22:31 GMT+1 óra  
Csak egy kérdés: nem suliban tanulod a programozást?
A memóriám már nem a régi. És ráadásul még a memóriám sem a régi...
Az élet attól szép, hogy bármi megtörténhet. És attól szar, hogy meg is történik...
Ha az egyik szinkronúszó megfullad, mit csinál a többi???

   
Parallax - Tag | 609 hsz       Online status #161851   2011.08.29 22:27 GMT+1 óra  
Én úgy kezdtem, hogy Gyuszika megy fel le a megy metódussal és lépteti az x, y koordinátáját, jó öreg Angster OOP könyv. C#-ot is hasonlóan kellene, csak nem tudom ahhoz van e konkrétan programozást taglaló könyv. Ilyennel még nem találkoztam (kivéve a 21 naposat, de az nem teljesen 100-as), csak a .NET, meg a szintaxist taglalókkal. Ha nem is ismeri a nyelvi elemek használatát magától nem hiszem, hogy rájön.

   
Kuz - Törzstag | 4455 hsz       Online status #161843   2011.08.29 22:15 GMT+1 óra  
Amikor majd 400 ellenfelet kell berakni, akkor jön rá, hogy talán van erre más mód is. Nem baj ez, mindenki így kezdi.
A memóriám már nem a régi. És ráadásul még a memóriám sem a régi...
Az élet attól szép, hogy bármi megtörténhet. És attól szar, hogy meg is történik...
Ha az egyik szinkronúszó megfullad, mit csinál a többi???

   
Parallax - Tag | 609 hsz       Online status #161838   2011.08.29 22:08 GMT+1 óra  
Kicsit olyan javascript szerű a kód, vagyis inkább struktúrált programozás szemléletű. Az Ellenseg osztály adatokon kívül semmit nem tartalmaz, ennyi erővel egy asszociatív tömb is lehetne. De ha már osztály, akkor a műveletei miért a Game1-ben vannak, miért nem őbenne? Ha frissíteni kell a rectangle-t akkor frissítse ő saját magának.

   
Kuz - Törzstag | 4455 hsz       Online status #161833   2011.08.29 21:55 GMT+1 óra  
Igen, xna-ban a rectangle a model betöltésénél létrejön, de nem frissíti magát (értem ezalatt, hogy nem csak a pozíciót, de az elfordulást - ugye ez az orientáció? - sem).
A memóriám már nem a régi. És ráadásul még a memóriám sem a régi...
Az élet attól szép, hogy bármi megtörténhet. És attól szar, hogy meg is történik...
Ha az egyik szinkronúszó megfullad, mit csinál a többi???

   
Pretender - Törzstag | 2498 hsz       Online status #161809   2011.08.29 21:03 GMT+1 óra  
Hát a rectangle-t (forras) hol frissíted?
Megjegyzem, először érdemes lenne egy kis programozás és tervezési elméletet tanulni

   
Pixi - Tag | 206 hsz       Online status #161798   2011.08.29 20:35 GMT+1 óra  
Sziasztok.

Valahogyan sikerült a Konstruktort működésre bírnom, de van egy nagyon érthetetlen probléma az egészben, pontosan akkor ha ütköztetni akarom két külön List-nek az elemeit, amelyeket foreach-ba teszek. Egyszerűen olyankor azt csinálja, hogy kitörli, vagy pedig be sem tölti az elemeket amelyeket létrehozok, de még nem is történik meg az ütközés, csak elindul a játék, a betöltött elemek teljesen külön pozícióban vannak, szóval nem értem mért csinál úgy mintha ütközne, olyan mintha egy kupacban lenne a Vectorokhoz rendelt forrás négyzet X és Y pontja, másra nem tudok gondolni. Viszont ha úgy tesztelem a programot, hogy egymáshoz viszonyítom az ellenség1 és az ellenség2 két külön osztály elemeinek a pontjait, és pl. megadok rá egy olyan feltételt, hogyha az ellenség2 X pontja nagyobb mint az ellenség1 X pontja, akkor tökéletesen működik, és eltünteti csak azt a két elemet amelyek találkoztak ott egymással, de ha Intersects-el akarom csinálni már indulásnál üres képernyőt ad, de hibaüzenet nincs. Íme a kód mellékelve:

http://data.hu/get/4182609/Foreach_teszt3.zip

Kód:
    class ellenseg
    {
        public Texture2D kep;
        public Vector2 pont;
        public Rectangle forras;
        public Rectangle rendeltetes;
        public int szamlalo;
        public bool kapcsolo;

        public ellenseg(Texture2D kep, Vector2 pont, Rectangle forras, Rectangle rendeltetes, int szamlalo, bool kapcsolo)
        {
            this.kep = kep;
            this.pont = pont;
            this.forras = forras;
            this.rendeltetes = rendeltetes;
            this.szamlalo = szamlalo;
            this.kapcsolo = kapcsolo;
        }
    }


.......ugyanez csak ellenseg2 néven......

Game1-ben

        static List<ellenseg> ellensegek = new List<ellenseg>();
        static List<ellenseg2> ellensegek2 = new List<ellenseg2>();

Contentnál:

            ellensegek.Add(new ellenseg(Content.Load<Texture2D>("kep"), new Vector2(400, 100), new Rectangle((int)Vector2.UnitX.X, (int)Vector2.UnitY.Y, 60, 50), new Rectangle(0, 0, 60, 50), 0, false));
            ellensegek.Add(new ellenseg(Content.Load<Texture2D>("kep"), new Vector2(500, 200), new Rectangle((int)Vector2.UnitX.X, (int)Vector2.UnitY.Y, 60, 50), new Rectangle(0, 0, 60, 50), 0, false));
            ellensegek.Add(new ellenseg(Content.Load<Texture2D>("kep"), new Vector2(600, 300), new Rectangle((int)Vector2.UnitX.X, (int)Vector2.UnitY.Y, 60, 50), new Rectangle(0, 0, 60, 50), 0, false));

            ellensegek2.Add(new ellenseg2(Content.Load<Texture2D>("kep"), new Vector2(150, 100), new Rectangle((int)Vector2.UnitX.X, (int)Vector2.UnitY.Y, 60, 50), new Rectangle(60, 0, 70, 50), 0, false));
            ellensegek2.Add(new ellenseg2(Content.Load<Texture2D>("kep"), new Vector2(100, 200), new Rectangle((int)Vector2.UnitX.X, (int)Vector2.UnitY.Y, 60, 50), new Rectangle(60, 0, 70, 50), 0, false));
            ellensegek2.Add(new ellenseg2(Content.Load<Texture2D>("kep"), new Vector2(50, 300), new Rectangle((int)Vector2.UnitX.X, (int)Vector2.UnitY.Y, 60, 50), new Rectangle(60, 0, 70, 50), 0, false));

"(int)Vector2.UnitX.X, (int)Vector2.UnitY.Y"    Én valamiért ebben kételkedek, mivel itt szeretném a létrehozott Vectorhoz csatolni a hozzá tartozó forrás négyzetet, és lehetséges, hogy itt nem is az történik amire én gondolok, de máshogy nem tudtam megadni, szerintetek?

Update:

            List<ellenseg> torles = new List<ellenseg>();
            List<ellenseg2> torles2 = new List<ellenseg2>();

itt meg valamiért trükközni kellett ha törölni akarom, nem tudom miért, de most nem is ez a gond...

            foreach (ellenseg ell in ellensegek)
            {
                if (ks.IsKeyDown(Keys.Right))
                    ell.pont.X++;
                if (ks.IsKeyDown(Keys.Left))
                    ell.pont.X--;
            }

            foreach (ellenseg2 ell2 in ellensegek2)
            {
                if (ks.IsKeyDown(Keys.D))
                    ell2.pont.X++;
                if (ks.IsKeyDown(Keys.A))
                    ell2.pont.X--;
            }

//ezekkel mozgatom őket

            foreach (ellenseg ell in ellensegek)
                foreach (ellenseg2 ell2 in ellensegek2)
                {
                    if (ell2.pont.X > ell.pont.X)     //ÍGY MŰKÖDIK
                    {
                        torles.Add(ell);
                        torles2.Add(ell2);
                    }

                    /*if (ell.forras.Intersects(ell2.forras))  //EZ NEM AKAR MŰKÖDNI!
                    {
                        torles.Add(ell);
                        torles2.Add(ell2);
                    }*/
                }

            if (torles.Count > 0)
                foreach (ellenseg ell in torles)
                    ellensegek.Remove(ell);

            if (torles2.Count > 0)
                foreach (ellenseg2 ell2 in torles2)
                    ellensegek2.Remove(ell2);

//ezek viszont működnek ha a Vector pontokhoz való viszonyítás feltételével tesztelem.


A kérdés egyszerű, mit rontottam el?

   
Pixi - Tag | 206 hsz       Online status #155973   2011.07.10 01:05 GMT+1 óra  
Asszem sima Windows Media Video CBR módban kell kódolni és nem CBR (Two Pass)-ban úgy már nem akarja lefuttatni. Sony Vegas-ban szoktam ezt csinálni, de a sima Movie Maker alapból így kódolja Windows XP-n.

   
SANTANTICA - Tag | 19 hsz       Online status #155624   2011.07.06 08:28 GMT+1 óra  
a videó fileokkal mi baja az XNA-nak?
semmilyen formátumot nem akar befogadni már a csak ha a contentbe teszem is hiba jelzést ad futtatáskor.


na meg van, nem mindegy hogy hogyan van kódolva :/

Ezt a hozzászólást SANTANTICA módosította (2011.07.06 09:30 GMT+1 óra, ---)

   
Pretender - Törzstag | 2498 hsz       Online status #154965   2011.06.25 21:50 GMT+1 óra  
Megjegyzés: ha később csak a kirajzolás sorrendje lesz a fontos, van a game componentnek egy draworder property-je, vagy valami ilyesmi (persze lehet, h csak a drawable game componentnek van, nem emlékszek, régen xna-ztam már)

   
SANTANTICA - Tag | 19 hsz       Online status #154964   2011.06.25 21:33 GMT+1 óra  
jó, úgy néz ki működik, kezelhető a dolog, szerintem rendben lesz....
igazából a sorrendek a fontosak a komponenseknél, azzal kell kicsit manipulálni.

köszönöm.

Idézet
Pretender :
b+ én is ezt mondtam xD


   
Pretender - Törzstag | 2498 hsz       Online status #154961   2011.06.25 21:16 GMT+1 óra  
b+ én is ezt mondtam xD

   
SANTANTICA - Tag | 19 hsz       Online status #154960   2011.06.25 21:15 GMT+1 óra  
ok ezt kipróbálom

Idézet
Asylum :
Addig ne add hozzá a component listához amig le nem futott a main menü.


   
Asylum - Törzstag | 5500 hsz       Online status #154959   2011.06.25 21:09 GMT+1 óra  
Addig ne add hozzá a component listához amig le nem futott a main menü.
C++ fordítóval és macival alszom
http://darthasylum.blog.hu/
   
Pretender - Törzstag | 2498 hsz       Online status #154958   2011.06.25 21:07 GMT+1 óra  
Nézd, van 5db xna tutorial, ami ugyan nem game componenteket használ, de az annyira nem is fontos. Ott van egy primitív screen manager, ami megoldja ezeket a problémákat.

   
SANTANTICA - Tag | 19 hsz       Online status #154957   2011.06.25 20:57 GMT+1 óra  
de ügye a Game1 Initialize() részén debütál a Components.....

onnatól meg le is fut rögtön, még bármi rajzolás elött.

még ez sem lenne baj ha lenne valami load screen megoldás mindenek elött.....

   
Pretender - Törzstag | 2498 hsz       Online status #154956   2011.06.25 20:48 GMT+1 óra  
Hát attól függ, hogy mikor adod hozzá a componentet... az rögtön meg is hívja a Load-ját..
Kód:
- program indul
- főmenü hozzáadása
- új játék indítása
- játék komponensek hozzáadása

vagy nem tudom, hogy mire gondolsz...

   
SANTANTICA - Tag | 19 hsz       Online status #154954   2011.06.25 19:53 GMT+1 óra  
üdv, egy kérdés

bonya megcsinálni azt hogy egy külön GameComponent LoadContent()-je ne hajtódjon végre az elején? csak akkor mikor ezt én akarom?
vagy felül lehet bírálni a loadot?

konkrétan szeretném, ha elöbb egy címképernyő menüvel jelenne meg (ez is külön GameComponent) és a többi összes modell, textura stb csak akkor ha kezdődik egy új game (természetesen ezek is önálló classban)

szóval ne a fekete képernyő legyen másodpercekig mig mindent betölt, majd főmenü.....
remélem érthető, mit szeretnék

   
Pretender - Törzstag | 2498 hsz       Online status #153970   2011.06.09 20:11 GMT+1 óra  
Igen, az a másik lehetőség, csak ahhoz kell "map editor" szerintem, hogy kényelmes legyen felépíteni

   
Parallax - Tag | 609 hsz       Online status #153968   2011.06.09 20:07 GMT+1 óra  
Mukievil: A pálya le van tárolva, hogy van e ott fal vagy nincs a tömbben. Ezenfelül minden pályaszakasz egy négyzet ahol a fal vonala is ott lehet. Ütközésnél nem a konkrét textúrát nézed, hanem egy ún bounding map-ot. Fizikához általában mindig van egy közelítő alakzat, amivel szoktak ütközést vizsgálni. Nem feltétlenül pont olyan recés valami kell lehet ez egy vektorizált egyszerűsített valami is, hogy ne pazaroljuk az időt.

   
Mukievil - Tag | 26 hsz       Online status #153963   2011.06.09 19:43 GMT+1 óra  
Na nekem ez a layeres fekszik a legjobban! Akkor utána járok, ha nemsikerül akkor még lehet kérek egy kis segítséget!

Köszönöm!

   
Pretender - Törzstag | 2498 hsz       Online status #153961   2011.06.09 19:37 GMT+1 óra  
gyűjtheted őket mondjuk külön layerekbe (ha nem egy textúrába töltöd be az egész pályát), vagy tényleg fogsz egy másik textúrát (nézz utána a per-pixel collision detection-nek, nem tudom pontosan hogy működik) ahol definiálod, hogy mi az, amivel ütközhet a játékot (szóval ahol fal van, ott berajzolod, ahol nincs, ott üresen hagyod)
A második megoldásod lesz az, amire mi gondolunk. Először megnézed, hogy az adott négyzetben van-e, ha igen, akkor vizsgálod bonyolultabban. Gondolj csak bele, fölösleges egy per-pixel collision detection a pálya másik felén lévő fallal, ha még csak a közelében sincs

   
Mukievil - Tag | 26 hsz       Online status #153959   2011.06.09 19:20 GMT+1 óra  
Akkor lehet én nem értem teljesen!
Felosztom az egészet x*y négyzetre, és amelyikbe beleér a karakter azt megvizsgálom ? És minden egyes négyzetnek megadom, hogy átjárhato e vagy sem ?

vagy

Beleér egy négyzetbe, és azon belül elkezdem vizsgálni, hogy mikor ér a falhoz ? Na de egy képből akkor mitöl tudom, hogy az fal e vagy sem ?

   
Parallax - Tag | 609 hsz       Online status #153954   2011.06.09 18:45 GMT+1 óra  
Mukievil: Attól, hogy kilóg egy része miért ba a négyzetre osztásnál? x * y hálóra felosztod. Mindegyikben lesz egy darabka és azzal számolsz, ahogy Pretender is írta először rectangle-t, majd perpixelt. De csak ott ahol a játékos van a környezetében.

Ez már editor kérdés, hogy alapvetően tile-szerűen építi fel a pályát a rendszer és ott határozod meg hogy mi ütközzön egyátalán és hogyan.

Ezt a hozzászólást Parallax módosította (2011.06.09 18:51 GMT+1 óra, ---)

   
Mukievil - Tag | 26 hsz       Online status #153914   2011.06.09 13:55 GMT+1 óra  
Itt egy kép!

Ehhez hasonló, ezen belül mászkálna egy karakter, amire tudok húzni négyzetet az ütközés vizsgálathoz, az nem gond. Csak hát a képen belüli falakkal nem tudom hogy kéne foglalkozni. Ezért gondoltam a kétrétegű képbe, ahol a második rétegen lennének, a falak, fények, hasadékok jelezve. Tehát pl ha fekete azt tömörnek veszi, ha piros, oda letesz egy fényforrást, ha zöld, akkor meg mondjuk lyuknak feltételezem, és ezek alapján döntöm el hogy a karakter mit csináljon.

http://kepfeltoltes.hu/view/110609/teszt_1_www.kepfeltoltes.hu_.jpg

A segítséget előre is köszönöm!

   
Kuz - Törzstag | 4455 hsz       Online status #153913   2011.06.09 13:37 GMT+1 óra  
Esetleg, ha mutatsz egy minta falat/játékost, akkor könnyebben tudunk segíteni.
A memóriám már nem a régi. És ráadásul még a memóriám sem a régi...
Az élet attól szép, hogy bármi megtörténhet. És attól szar, hogy meg is történik...
Ha az egyik szinkronúszó megfullad, mit csinál a többi???

   
Pretender - Törzstag | 2498 hsz       Online status #153912   2011.06.09 13:29 GMT+1 óra  
Lehet perpixel ütközést is vizsgálni, csak nem tudom mennyire költséges. Először mindenképpen érdemes egy nagy rectangle-be befoglalni, azokra megvizsgálni először, és ha azzal ütközött, akkor érdemesebb komolyabban utánajárni.
Nézd meg a per pixel collision-t, nem tudom mennyire lehet lassú, nem sokat foglalkoztam 2d-vel

   
Mukievil - Tag | 26 hsz       Online status #153911   2011.06.09 13:12 GMT+1 óra  
Igen 2d felülnézet! A lényeg hogy van egy képem egy terepről, aminek a széle fal. Persze valamilyen kis négyzetekre le tudom bontani. De akkor levágom a képről a falrészt, négyzetekre bontom, és azt külön teszem be ? Csak akkor az elég bonyolult lesz egy idő után.

Még kezdő vagyok, úgyhogy lehet hülyeségeket írok.

   
Parallax - Tag | 609 hsz       Online status #153904   2011.06.09 12:28 GMT+1 óra  
Idézet
Mukievil :
Sziasztok!

Az lenne a kérdésem, hogy az ütközést hogy lehet a legjobban megoldani, egy bonyolult formájú alapterületnél, az oldalsó falakat.

A falakat külön képenként betenni, és akkor reactangle collision-t használni?

Olyat nem lehet csinálni, hogy két rétegű a kép, és mondjuk a második rétegen, feketével szinezem a falakat, és azt vizsgálom, hogy ha fekete, akkor nem lehet átmenni rajta ?

Vagy milyen módszerek vannak erre ?


Kis négyzetekre lehet közelíteni a páláyt nem? Vagy annál is recésebb? Ha lehet, akkor csak a mozgási irányban kell a játékos szomszédos négyzetét ellenőrizni, hogy ott van e akadály.

   
Pretender - Törzstag | 2498 hsz       Online status #153903   2011.06.09 12:27 GMT+1 óra  
Ezek szerint gondolom 2d-ről van szó.

   
Mukievil - Tag | 26 hsz       Online status #153895   2011.06.09 11:35 GMT+1 óra  
Sziasztok!

Az lenne a kérdésem, hogy az ütközést hogy lehet a legjobban megoldani, egy bonyolult formájú alapterületnél, az oldalsó falakat.

A falakat külön képenként betenni, és akkor reactangle collision-t használni?

Olyat nem lehet csinálni, hogy két rétegű a kép, és mondjuk a második rétegen, feketével szinezem a falakat, és azt vizsgálom, hogy ha fekete, akkor nem lehet átmenni rajta ?

Vagy milyen módszerek vannak erre ?

   
terbed - Tag | 233 hsz       Online status #151728   2011.05.09 18:48 GMT+1 óra  
Elég idegesítő, hogy frissítem a wp dev tool-t és a következő hibát kapom mikor futtatni szeretném a kódodt:

Kód:
Error 1 Connection failed because of invalid command-line arguments. 0 0


Valaki tudna segíteni? Tegyem újra az egsz vs-t ?

Szerk.:
Még most sincs megoldva

Ezt a hozzászólást terbed módosította (2011.05.18 19:45 GMT+1 óra, ---)
   
Pretender - Törzstag | 2498 hsz       Online status #149744   2011.03.27 17:46 GMT+1 óra  
ezért kell mondjuk azt csinálni, hogy van a jelenlegi pozíció, egy velocity vector, amiből meghatározod a következő pozíciót.
Kód:
void UpdateBegin() {
velocity = new Vector2(...);
positionNext = position + velocity;

átállítod a rectangle-t erre a pozícióra, és azzal vizsgálsz egy ütközést. Ha ütköztek, akkor mondjuk (egyszerű esetben) kiszámolod a két rectangle által közbezárt értéket (vízszintesen ez szélesség lesz, a magasság - y - pedig 0) és azt kivonod a positioNext-ből
Kód:
//UpdateBegin() meghívása után
DetectCollision(); //ütközésvizsgálat a positionNext-es rectangle-el
Vector2 diff = ComputeDifference(); //kiszámolod a két rectangle közötti különbséget
positionNext -= diff;

Majd ezután az egész után beállítod a játékos pozícióját (amivel rajzolsz!) a positionNext-re.
Kód:
position = positionNext


És ez csak egy egyszerű példa

   
Pixi - Tag | 206 hsz       Online status #149735   2011.03.27 14:31 GMT+1 óra  
Azt hiszem kb. kezdem érteni mire gondolsz...ahogyan a képet megnéztem eszembe jutott, hogy ezt az eltolás technikát már valamikor használtam, de később valamiért pont hogy ezt akartam elkerülni. Mert ok hogy felállítom azt a logikát, hogy ha az elemnek ütközik, akkor tolja vissza azzal a sebességgel amivel halad, így olyan mintha egy helyben állna. De itt jött a probléma...vagyis pontosabban az, hogy van nekem több elemem is, amire ugyanazt a logikát írom, képzeld el hogy egymás tetején két különböző elem. Pl. egyik tégla, a másik blokk...és egymás tetején állnak, de a játékosom függőlegesen éppen akkora, mint amekkorák azok egymás tetején...és ha ugyanaz a logika van adva mindkettő esetében, akkor amolyan rángatós visszamozgatás történik. mert egyszerre ütközik mindkettővel, s ekkor a sebessége is dupla olyan gyors lesz amivel vissza kell mozgatnom.

   
fpeti - Törzstag | 1295 hsz       Online status #149723   2011.03.27 04:19 GMT+1 óra  
Idézet
Pixi :
"akkor annyiszor ismételnéd egy frame-en/update-en belül az ellenőrzést"
Igen, de maga a megvalósítás nem tudom hogyan néz ki, milyen kóddal kell megoldani.



Van a mozgó objektumodnak egy koordinátája, és egy mozgási iránya, ami lehetne egy normált vektor. A mozgási irányt beszorozva az aktuális mozgási sebességgel és az eltelt idővel (az előző frame/update óta) és hozzáadva a pozíciójához megkapod a 2 pontot, ami között elmozdult ebben a frameben. Ha az elmozdulás x,y -ja nagyobb mint 1 akkor elmozdult több, mint 1 pixelt. Ilyenkor kell a kezdő és végpont között - mondjuk midpoint algoritmussal - végigmenni és minden pixelnyi elmozdulásnál nézni, hogy nekiment-e valaminek. Ha igen, akkor ki kéne deríteni, hogy vízszintes, v függőleges oldalnak ment neki, s ebből új irányt számolni, és azzal újra számolni az elmozdulás maradékát - ezzel elcsúszik a fal mellett.
- ez így elég bonyolult kezdésnek.

Arra gondoltam mi lenne, ha csak annyit mondanék, hogy a már megírt pixeles üközésvizsgálatodat futtatnád le többször, attól függően, mennyi idő telt el a frissítés óta. Itt is ki kell számolni, mennyit mozdult el ebben a frameben, mondjuk 3 pixelt az x tengelyen, 2-t az y-on, ekkor egy 3-as for-kell, és minden iterációban az x-hez 1-et kell adni, az y-hoz 2/3-at, és nézni, ütközik-e valamivel.
Csak elsőre tűnik bonyolultnak, csak át kell látni.
(lehetne jó kis cikket írni a témában..)

Bár van aki megtette, ha igazán kéne valami 2d fizikai tutiság, itt van ez, érdemes a példaprogikat kipróbálni:
policolly
Egyszerűsítve téglalapokra: kep

Ezt a hozzászólást fpeti módosította (2011.03.27 04:36 GMT+1 óra, ---)
   
Asylum - Törzstag | 5500 hsz       Online status #149721   2011.03.27 02:10 GMT+1 óra  
Jah, sorry kicsit másra gondoltam Igen, ilyen esetben framenként sem segit .

Esetleg keresheted egy sugár metszetét a bounding box-al, és ha a következö updateben már tulmenne akkor az ütközéshez rakod.
C++ fordítóval és macival alszom
http://darthasylum.blog.hu/
   
Pixi - Tag | 206 hsz       Online status #149720   2011.03.27 01:03 GMT+1 óra  
"akkor annyiszor ismételnéd egy frame-en/update-en belül az ellenőrzést"

Igen, de maga a megvalósítás nem tudom hogyan néz ki, milyen kóddal kell megoldani.

   
Kuz - Törzstag | 4455 hsz       Online status #149719   2011.03.27 00:08 GMT+1 óra  
fpeti megoldása (ami az én gondolatmentem érthetőbb formába öntése volt ) miért nem jó?
A memóriám már nem a régi. És ráadásul még a memóriám sem a régi...
Az élet attól szép, hogy bármi megtörténhet. És attól szar, hogy meg is történik...
Ha az egyik szinkronúszó megfullad, mit csinál a többi???

   
Pixi - Tag | 206 hsz       Online status #149713   2011.03.26 21:27 GMT+1 óra  
Asylum: azt a framenként ellenőrzést hogyan valósíthatom meg? Elég 1x bevinni a Game1-ben valahová, vagy minden mozgásnál külön kell megadnom több sorban?

   
fpeti - Törzstag | 1295 hsz       Online status #149711   2011.03.26 21:02 GMT+1 óra  
Idézet
Pixi :
Amúgy meg sima Rectangle - Rentangle Intersects-re gondolok...



Mi lenne, hogy ha az elmozdulás nagyobb, mint 1 pixel, akkor annyiszor ismételnéd egy frame-en/update-en belül az ellenőrzést - végigmozgatod az úton, amit egy update alatt megtett. Nem szégyen ez , fizikai mocik is használják, Havokban meg is lehet adni per object hányszor nézzen ütközést kezdő és végpont között (4 a default).

Igazából kétféle megközelítés van, az egyik, hogy egymáshoz se érjenek - ez a per pixel ellenőrzés, a másik a nem determinisztikus módszer, amikor megnézik, hogy egymásba lógnak-e, és ha igen, akkor kitalálják, hogy melyik irányba tolják szét őket. Ált. arra, amerre a legkisebb elmozdulás kell, hogy ne érjenek egymáshoz. Ekkor extrém esetben előfordulhat, hogy kis méretű testek átmennek egymáson. Ez a 3d-ben bevett, mert ott nincsen pixelnyi elmozdulás (hacsak nem voxeles), de 2d-ben is nagyon gyors tud lenni. A per pixeles lassabb, de nagyon pontos.
   
Asylum - Törzstag | 5500 hsz       Online status #149708   2011.03.26 19:05 GMT+1 óra  
Ezért szoktam én framenként ütközést vizsgálni. Mivel NEM lehet olyan általános felosztást megadni ami minden sebességre jó.
C++ fordítóval és macival alszom
http://darthasylum.blog.hu/
   
Kuz - Törzstag | 4455 hsz       Online status #149705   2011.03.26 18:02 GMT+1 óra  
A matek annyira nem erősségem. Ha semmi más nincs, az aktuális pozíciót, meg a növelés utáni pozíciót azt minden update-kor tudod. Legrosszabb esetben olyat is csinálhatsz, hogy a két pozíció közt felosztod a pozíciókat egységnyi részekre, és megnézed, hogy ezen részek valamelyikén volt-e ütközés. Ha ez ígynem érthető, fent vagyunk chat-en.
A memóriám már nem a régi. És ráadásul még a memóriám sem a régi...
Az élet attól szép, hogy bármi megtörténhet. És attól szar, hogy meg is történik...
Ha az egyik szinkronúszó megfullad, mit csinál a többi???

   
Pixi - Tag | 206 hsz       Online status #149704   2011.03.26 17:58 GMT+1 óra  
Igen jól mondod. Átugrásról van szó. És mivel tudom figyelembe venni a köztes pillanatokat is? Nem tudom ezzel kapcs. honnan induljak ki?

   
Korábbi postok
> 1 < [2] [3] [4] [5] [6] [7] [8] [9] [10] [15] [20] [25] [30] [35] [40] [45] [50] [55]