☰ Menu

Scene.hu

Magyar demoscene portál – grafikusok, zenészek, programozók alkotói közössége

Home Forums A Demokészítés művészete Programozás Róka fogta Csuka

  • This topic has 8 replies, 2 voices, and was last updated 15 years ago by avatarBery.
Viewing 9 posts - 1 through 9 (of 9 total)
  • Author
    Posts
  • #1401
    avatarOswald
    Member

    az van, hogy egy text editort írok egy c64es mag outfitjéhez ami előreemésztett formázot szöveget exkrementálna ki magából.a text formázását a szövegben elhelyezett tagekkel lehet irányítani pl.: {center} {bold} stb. Nincsenek záró tagek mint htmlben.Képek is lesznek, a képek által elfoglalt helyet karakteres felbontásban egy 2 dimenziós tömbben tárolom, hogy a szöveg körbe tudja folyni őket.A tördelő algoritmus durván a következő:1. lescannelni a következő szakaszt hogy mennyi szöveg fér el a képek által szabadon hagyott területen2a. a szövegből kivágni a következő szakaszt ami az 1. pontban lemért területen elfér.2b. eközben a tagek scannelése, találat esetén azok skippelésea problémám a következő:ezzel a módszerrel ugyanabban a sorban nem tudok egy képet és egy szöveget összetördelni, hisz mire a kép tag feldolgozáshoz érek a (2.) lépésben addig az (1.) lépés már nyugtázta hogy nincs kép a szöveg elfér.illusztráció:a) a kép tag túl későn kerül feldolgozásrab) a kép tag a következő sorban már blokkolja a szövegetNem találok értelmes megoldást a problémára. Ha pl a kép tageket előre akarnám emészteni akkor meg az lenne a baj hogy a tördelés hiánya miatt nem tudom meddig tart egy oldal. meg szét kellene gyilkolnom a tag kimazsolázó rutint két részre.adja meg a user előre a szövegen kívül, hogy melyik oldalra hova akar képet ? :P ez meg nem lenen valami elegáns.

    #5784
    avatarBery
    Member

    Ha nincs záró TAG, akkor meddig tart a center, meg a bold, meg a többi? Egy szó vagy egy sor? Biztos, hogy jó ez így, hogy nincs záró TAG?  Ettől függetlenül én így csinálnám:  Tudod, hogy egy sor hány pixel, legyen ez LineWidth. A teljes szöveg mérete karakterekben legyen TextLength, a mutató, ami mutatja, hol jársz a feldolgozandó szövegben pedig Index. XSize-ban tároljuk, mennyi szabad hely van még az adott sorban. FullWidth-ben tároljuk, hogy az kiírandó sor összesen hány pixel széles lesz. LineArray-ban pedig az adott sort szövegestől, TAG-estől.Ez egy C-like metakód persze (a büdös életben soha nem programoztam még C-ben, de C-64 ASM-ban sem :)), amiben helyenként csak függvény (szubrutin, function ;)) neveket írtam, amik mögött azért egy relatív hosszabb kódrészlet van nyilván.XSize = LineWidth; // az elején nyilván miénk még a teljes sor FullWidth = 0; // egy sor szélességét ebben számoljuk összeIndex = 1; // Index a szöveg első karakterén áll LineArray = array(); // ez egy üres karaktertömbYpos = 0; // a lap tetejewhile (Index <= TextLength) do // ciklus a teljes szövegre     Word = GetWord; // kiveszünk egy szót Index-től kezdve    Index = Index + Length(Word); // a mutató átugorja az adott szót    if (Word <> TAG) // ha nem TAG a kivett szó    {      Width = GetFormatedWordWidth; // kiszámoljuk az adott szó szélességét      if (Width <= XSize) // elfér egy sorban    {        LineArray = LineArray + Word; // tároljuk a tömbünkben       XSize = XSize – Width; // a szó szélességével csökkent a szabad hely        FullWidth = FullWidth + Width; // Sor összélesség növelése     }      else       XSize = 0; // nem fér el, a sor végére értünk    }     else // egy TAG az adott szó    {             // nem csak a kép, a többi TAG-et is feldolgozzuk itt      if (SubStr(Word, 0, 4) == “{pic”) // ez bizony egy kép      {               Width = GetPicWidth; // kiszámoljuk a kép szélességét        if (Width <= XSize) // elfér még a sorban       {           LineArray = LineArray + Word; // tároljuk a kép TAG-et a tömbünkben          XSize = XSize – Width; // csökkent a szabad hely a sorban          FullWidth = FullWidth + Width; // Sor összélesség növelése        }         else         XSize = 0; // nem fér el a sorban, a sor végére értünk     }     else       ActiveTAG = Word;   }   if (XSize == 0) // Ha a sor végére értünk   {      if (ActiveTAG == “{center}”) // ha center TAG van       Xpos = (LineWidth – FullWidth) / 2; //közép kiszámolása    else       Xpos = 0; // ha balra igazított    // mivel nem értem a TAG kezelést, így nem tudom,     // hogy itt kell-e törölni az  ActiveTAG-et, vagy máshol     DrawLine (Xpos, Ypos); // LineArray-ből kirajzoli a sort képestől, szövegestől     XSize = LineWidth; // XSize ismét a teljes sor szélessége     FullWidth = 0; // nullázzuk a következő sorhoz     LineArray = []; // ürítjük a tömbünket is a következő sorhoz    // LineHeight-et közben lehet számolni a kép és a szöveg magasságokból    Ypos = Ypos + LineHeight; // következő sor kezdő pozíciója   }} // end whileA DrawLine a fentihez hasonló ciklust hajt végre, csak a LineArray-n megy végig és nem tárol, hanem rajzol (szöveget és képet).Innen már csak a kép körbefolyatást kell megoldani :) De az már csak pár plusz változó és feltétel használata :)

    #5785
    avatarOswald
    Member

    “Ha nincs záró TAG, akkor meddig tart a center, meg a bold, meg a többi?”addig amíg egy másik TAG mást utasítást nem ad.megtisztelő hogy ennyit dolgoztál vele, de attól tartok a metakódod nem oldja meg a problémát. A kép körbefolyatást elintézed egy mondattal, pedig épp az a probléma lelke:mielőtt belépnénk a metakódodba, nálam még van előtte egy ciklus ami lescanneli hogy mekkora is az XSize a képek által szabadon hagyott területen. Viszont a képek csak te metakódodnak megfelelő részen foglalják le a területet.ez a róka fogta csuka :)perpill az az ötletem, hogy amikor találok egy képet TAGet akkor flaggelem hogy akkor ez megvolt (lehet több kép egy sorban), lefoglalom a kép területét a szöveg elől, és loopback a rutinra ami az Xsize-ot meghatározza a szabad terület függvényében.bonyolult és nem valami tetszetős, de asszem nem lesz jobb.

    #5786
    avatarOswald
    Member

    na, megoldottam egy gotoval 2 perc alatt, igaz egy sorban csak egy kép TAG lehet, de ennyi elég lesz :D ha kép TAG-et találok akkor beállítok egy flaget a végtelen ciklust megelőzendő, és goto back az Xsize méretét meghatározó rutinra.

    #5787
    avatarBery
    Member

    A kép körbefolyatást elintézed egy mondattal, pedig épp az a probléma lelke” Mivel az tényleg csak egy flag, hogy képkörbeírás van, eltenni a kép magasságát, hogy tudjuk, mikor kell a flag-et törölni, meg a fennmaradó hely kezdő és záró X pozícióját meghatározni a kép alapján és azt behelyettesíteni az XSize-ba, meg a kezdő XPos-ba. Szóval az már tényleg nem sok. De az egy Goto az tényleg rövidebb ;)

    #5788
    avatarOswald
    Member

    azt hiszem nem vágod, hogy 1 passból nem megoldható a probléma – és ezen problémázok :)

    #1 adott sor Xsize meghatározása
    #2 adott sorban TAG kezelés és tördelés – ha jön kép tag akkor a #1ben megmért Xsize lehet hogy már nem korrekt többé, hisz a kép TAG az Xsizet befolyásolhatja, és vissza kell oda ugrani.

    ezzel az extra szopás az hogy 1 passban jobb lett volna megcsinálni, plussz ha korrekt akarsz lenni akkor valamiféle pointert kell használnod hogy hol volt az utolsó kép tag ahonnan backtrackeltél ez megint extra logika és szopás. a másik extra szopás meg az hogy újra kéne identelnem vagy 80 sor többszörösen egymásba agyázott ciklust/elágazást még egy while ciklusba, amit az editor auto nem támogat, ezek miatt basztam oda egy gotot, és tud csak 1 kép taget egy betördelt sorban.

    #5789
    avatarBery
    Member

    Az én metakódom sem egy menetes, hanem összeállítja sortörésig a szöveget – ha úgy tetszik egy sornyit – aztán kiírja. De az összeállításra egy menet tutira elég, ha megvan az a módszer, amivel ki tudod számolni egy szónak a szélességét a rá vonatkozó TAG-eket is figyelembe véve.

    Igaz, ez is csak 1 kép / sorra működik, ha körül akarsz képet folyatni szöveggel.

    #5790
    avatarOswald
    Member

    talán ott értjük félre egymást, hogy a metakódoddal szemben nálam:

    a) a kép nincs “tördelésnek alávetve” (nincs olyan hogy “már nem fér el a sorban”), a kép mindig megjelenik és a szövegnek kell alkalmazkodnia hozzá
    b) a kép pozícióját nem a TAG szövegben elfoglalt pozija határozza meg, hanem megadható.

    így is megcsinálod 1 menetben? :)

    #5791
    avatarBery
    Member

    Így nem :)

    De mondjuk ennek annyiban látom értelmét, hogy a képet jobbra vagy balra igazítod. Ha meg csak ennyi, akkor szerkesztéskor meg lehetne adni azt, hogy na innentől kép van, és ami most jön szöveg a kép tag után, annak körül kell folynia jobbra, vagy balra a képet és akkor megint elég az egy menet :)

Viewing 9 posts - 1 through 9 (of 9 total)
  • You must be logged in to reply to this topic.
Ugrás a lap tetejére Ugrás a lap aljára