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 Bery.
-
AuthorPosts
-
2009-11-20 at 15:37 #1401OswaldMember
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.
2009-11-21 at 10:11 #5784BeryMemberHa 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 :)
2009-11-21 at 14:45 #5785OswaldMember“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.
2009-11-21 at 15:00 #5786OswaldMemberna, 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.
2009-11-25 at 18:13 #5787BeryMember“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 ;)
2009-11-25 at 19:34 #5788OswaldMemberazt 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.
2009-11-26 at 08:22 #5789BeryMemberAz é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.
2009-11-26 at 15:14 #5790OswaldMembertalá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? :)
2009-11-26 at 17:15 #5791BeryMemberÍ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 :)
-
AuthorPosts
- You must be logged in to reply to this topic.