Egér kezelése : 800*600 VESA assembly
2003-04-18T14:17:56+02:00
2003-07-02T19:17:11+02:00
2022-07-19T22:46:41+02:00
putzjozsi
Üdv!
Egérkezelőt írogatok asm-ben. (800*600/65565)
Az egér mozgását így oldottam meg:
Ha volt elmozdulás
- visszaállítom az eredeti egér alatti képet az előző pozícióba
- lementem az egér alatti területet (az új pozícióban)
- kirakom az egeret az újpozícióba

vagy másképpen fogalmazva

call Put_Temp_Image
call Get_Eger_Area
call Put_Eger

A rutin megy, nem is ez a gond.
Az a probléma, hogy mikor kicsi az elmozdulás, (az új egérkurzor és a régi átfedné egymást) akkor ugyan azt a területet kétszer rajzolja a rutin.
Ez azt eredményezi hogy mozgás közben vagy világosabb, vagy sötétebb lesz a kurzor, attól függően hogy milyen a háttér.

Olyasmin gondolkodom, hogy leképezem valahova máshova a memóriába a "munkaterületet", ott elvégzem ezeket a változtatásokat és csak az eredményt rakom vissza a videómemóriába.
Érdemes nekifognom, vagy van valami könnyebb megoldás?
Esetleg egész másként kéne nekifogni az egérkezelőnek?
Mutasd a teljes hozzászólást!
Ez a jobbik eset, nekem inkább villogni szokott, próbálkozzál valami késleltető rutinnal, de lehetőleg ne akkor késleltesd, amikor éppen nem látszik az egér, hanem amikor nem.
Egyébként van egy jobb megoldás is csak az túl bonyolult főleg assemblyben:
-Amikor elmozdul az egér akkor létrehozol egy háttérképet annak a területnek ahová mozdul és letárolod benne a hátteret.
-Ezután rárajzolod a megfelelő helyre a régi hátteret (mármint az új háttérre)
-Visszarajzolod a régi hátteret, úgy hogy csak azokat a részeit rajzolod ki, amelyeket nem fed az új egérmutató, ezután már csak az új egeret kell kirajzolni.
Mutasd a teljes hozzászólást!

  • Anno. én is csináltam ilyet és az volt a gond hogy túl lassan vettem fel és raktam vissza a képet.

    Egyébként ez jellemző a grafikára , ha valmami sprite-t szeretnél mozgatni akkor muszáj backbufferelni de az egérnél nincs érteleme.
    Mutasd a teljes hozzászólást!
  • Ez a jobbik eset, nekem inkább villogni szokott, próbálkozzál valami késleltető rutinnal, de lehetőleg ne akkor késleltesd, amikor éppen nem látszik az egér, hanem amikor nem.
    Egyébként van egy jobb megoldás is csak az túl bonyolult főleg assemblyben:
    -Amikor elmozdul az egér akkor létrehozol egy háttérképet annak a területnek ahová mozdul és letárolod benne a hátteret.
    -Ezután rárajzolod a megfelelő helyre a régi hátteret (mármint az új háttérre)
    -Visszarajzolod a régi hátteret, úgy hogy csak azokat a részeit rajzolod ki, amelyeket nem fed az új egérmutató, ezután már csak az új egeret kell kirajzolni.
    Mutasd a teljes hozzászólást!
  • Hát asszem egyre gondoltunk. Ilyesmin spekuláltam, csak abban reménykedtem van egy pofonegyszerű megoldás, csupán nekem nem jutott eszembe.
    Tény, hogy nem lesz egyszerű leprogramozni assemblyben, de én imádok asm-ben programozni
    Kössz a segítséget!
    Mutasd a teljes hozzászólást!
  • A lustaság mégis erőt vett rajtam és tovább gondolkodtam. Úgy oldottam meg, hogy:
    Ha elmozdul az egér:
    - visszaállítok egy sort az előző pozícióban
    - kirajzolok egy sort a jelenlegi pozícióba úgy hogy közben mentem is azokat a pontokat amiket felülírok.

    El kellett még különítenem két esetet: lefelé vagy felfelé mozdult-e el az egér.

    A lényeg: semmi vibrálás meg effélék, gyönyörűen mozog

    Ha érdekel letöltheted a demót forráskóddal együtt. (745k a bmp képek miatt)

    Egér demó
    Mutasd a teljes hozzászólást!
  • Azt hiszem jobb lenne, ha rákeresnél a doksiban a HW_mouse_cursor jellegű dologra :)
    A másik, amire hamar rájössz majd, ha nincs hw cursor, akkor is jobb back bufferben csinálni a képet, és oda meg rárajzolod a kurzort utoljára és szia (a következő képet úgyis újra generálod)

    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd