ved hjælp af directdraw med delphi

, det viser, hvordan vi kan begynde at anvende directx bibliotek i delphi programmer og så viser en enkel anvendelse af freeware bibliotek delphix.,, hvis du nogensinde har prøvet at gøre hurtigt skærm produktion i henhold til windows, du ved, det er ikke nogen let opgave.med alle de tricks, muligt, at det stadig er desværre langt fra kommercielle spil hastigheder.men jeg vil vise dig, hvordan man bruger directx i deres programmer til smidig hurtigt produktion, der kan planlægges i mikrosekunder ikke minutter!,,, for et par år siden, at microsofts udviklere indså, at vinduer var ikke et spil platform, og lovede at ændre dette.i 1995 var kortvarig fløj op.denne lov hurtigt produktion i 256 farver transportformer vinde 3.1 og vinde 95.det var hurtigt, men begrænset og hurtigt erstattes af directx.det er en familie af api - grænseflader til hurtig output og input.din apps kan bruge videokort, lydkort og tvinger feedback joysticks gennem directx.jeg vil se på directdraw visuel api - og komme tilbage til de andre i fremtiden.andre directx apis omfatter directsound for soundcards, directinput til joystick osv. direct3d for 3d - grafik og directplay for multi - spiller.selv om directx er nu i version 6, 1, directdraw har været stort set uændret, siden version 3.version 3 f er en indbygget i vinde nt 4.,,, windows styrke er, at det arbejder med mange forskellige skærme, video kort og i flere resolutioner og farve.det kræver en masse kode mellem din app og video kort hardware og den tykke api 'er, hvorfor vinduer output serier er langsom.dette var også tilfældet med de autoriserede toldklarerere, da det dukkede op, og spil udviklere gik direkte til metal, i stedet for at bruge den bios eller dos api rutiner.indtil for to år siden, de fleste spil blev stadig skrevet til dos, selv dem, der leder efter windows 95.nu, sandsynligvis 99% anvendelse directx, og snart er det windows ce micros vil køre kommercielle arcade maskiner med directx.,,, directx /directdraw støtter en tynd api - tilgang med par lag mellem hardware og din app.directx er bygget på kom - komponenten objekt model, således at nye versioner kan frigives uden at bryde din nuværende kode.hvis din app arbejder med directx version 5, det er sikret, at arbejde med directx 6, 7... 308.,,, directdraw giver oplysninger til din app, hvad hardware features video eller lydkortet er, og hvad er kopieret i software.det directx fremgangsmåde sikrer, at deres software vil køre på kort endnu ikke udviklet, og vil være i stand til at bruge deres avancerede funktioner.på bagsiden, betyder det, at du er nødt til at skrive to eller tre forskellige måder at gøre tingene på og vælge de bedste (= den hurtigste metode på runtime.,,, directx og delphi, selv om c og c + + er det vigtigste sprog ifor directx, delphi er meget velegnet til ir.blake sten gjorde første directx header oversættelse fra c - delphi og borland er charlie calvert har børstet om emnet i hans delphi - 2 /4 '-' bøger.hr. hiroyuki hori i japan har udviklet delphix - en fremragende række frie delphi komponenter til directx.disse er til rådighed fra mange steder på nettet eller hans hjemmeside på http: //////////////www.ingjapan. ne. hori /jp /.du bliver også nødt til at installere directx version 5 eller højere.du har sikkert fået det på dit system nu, hvis du har købt en kamp i de sidste år.windows 98 og den fremtidige nt5 kom med directx byggede på.nt 4 -, service - pakning 3 støtter også directx 3.,,, jeg vil nu vise dig de væsentlige punkter i directdraw programmering, og hvordan de kan få det bedste ud af det delphix komponenter med et eksempel - app.hvis du bruger delphix, vil du opdage, at mr. hori hjælp filer er måske ikke helt klart, men du får fuldstændig kildekode og en række gode prøve programmer til at overvinde den.delphix er et fremragende stykke software, og så kan du skrive på arcade kvalitet lege i delphi, der bruger det.,,,,,, selv hvis du ikke er i spil, programmering, ekstra fart, at directdraw giver lader dig skabe ansøgninger med flimmer fri høj hastighed produktion som radaren viser, oscilloskoper, scroller, kort osv. jeg har brugt det til en nedad kort og det fremkalder en skærm, fuld af 256 farver hexagons på 1024 x 768 beslutning (hver hex passer ind i et rektangel, 32 pixels bredt med 34 dybe) i 26 m i en p2 300 udstyret med en avs matrox millenium - kort.det er næsten 40 billeder pr. sekund, slet ikke dårligt for delphi..,,, directdraw, microsoft har ikke smidt ud den gdi.en af de store smerter af dos spil udvikling var outputting tekst, især med at skabe deres egne skrifttyper eller besked bitmaps.heldigvis blev den gdi arbejder med directdraw, således at truetype skrifttyper, kan anvendes.i de fleste af gdi fungerer, så længe lidt omhu.selvfølgelig gdi output er ikke meget hurtigt, så du må kun bruge det til at skabe tekst, menuer osv.,,, ved at komme i gang, vil du have directx header filer - der er ikke noget bedre sted end delphix bibliotek.det leveres directx.pas er overvældende 300kb størrelse.det omfatter alle directsound osv. apis optegnelser, guids osv. hvis du har tænkt på i ørkenen i de sidste fem år, kan de være bekendt med guids, men de er blot en samling af tal, som denne [(5c690320-0bd2-11d3-89df-00409545e8e7)], som entydigt identificerer genstande og klasser i vinduerne.microsoft har guids omtanke indeholder din net - kort "mac - adresse til alle ord og excel - filer oprettet på pc 'en. hvis du gør ctrl skift g i delphi ide, de sidste 12 cifre i den udvikling, der skabes, er dit netværk, kort mac - adresse (hvis de har et netværkskort).,,, er det ikke svært at directdraw arbejde med, bare en smule besværligt i steder.her er mit femte punkt begyndere vejledning for at komme i gang.først skaber en directdraw objekt.det er en video kort /overvåge struktur, og i henhold til windows 98 vil støtte flere anordninger.dette er definitionen af directdrawcreate.,,, funktion directdrawcreate, (lpguid: pguid;,, lplpdd: idirectdraw;,, punkouter: iunknown): hresult,,,,,,,, hvor der er en punkouter parameter, giv nul.dette krav bør vende tilbage til en dd_ok værdi (= 0).alt andet er en fejl og bør behandles af din kode...,,, næste skridt er at specificere de kooperative plan.den vil have hele skærmen udelukkende eller at dele det?de fleste kampe i fuld skærm mode din app kan vælge den skærm tilstand og beslutning om at bruge.hvis du bruger den i vinduet, din app ikke bør ændre transportform.,,, dwflags parameter, lader du angive, om man anvender fuld skærm eller ikke, eller om din app kontrol skærmen, så ingen andre app kan ændre det, og selv om brugeren kan ctrl alat del at genstarte.,,, funktion setcooperativelevel (hwnd: hwnd; dwflags: dword): hresult;,,, det muligt at anmode directdraw genstand for alle understøttede billedopløsninger.de fleste video kort støtte mange former, men højere hyppighed /farve former kan have behov for større båndbredde, end din monitor kan klare.skifter til disse transportformer, ikke vil fungere og kunne forlade overvåge i en unsynched stat, så sørg for at omfatte en advarsel, når du distribuere deres apps.endnu bedre, så brugeren til at vælge mode fra en liste.jordskælv, og mange spil bruger denne fremgangsmåde.,,, trin 3 er skærmen tilstand.dette gælder kun, hvis du vil have fuld skærm adgang.,,, funktion setdisplaymode (dwwidth, dwheight, dwbpp: dword): hresult;,,, dwbpp er vertical pixel scale, dvs. 8 til 256 farver.640x 480 8 sandsynligvis er en sikker satsning på en pc.,,, trin 4, hvor overflader er skabt.alle billeder, der blev afholdt i overflader.det er bare blokke af ram med et valgfrit billede og din app kan skabe overflader i de vigtigste pc - system ", eller i den video kort ram.ikke svært at gætte på, at billeder i video - ram billeder er hurtigst til kopi til video ram, selv om avs - kort kan få data fra din pc - ram meget hurtigt.,,, createsurface skaber en flade i henhold til overfladen beskrivelse parameter.,,, funktion createsurface (denne lpddsurfacedesc: ddsurfacedesc;,, lplpddsurface: idirectdrawsurface; punkouter - iunknown): hresult;,,, det største overflade er skærmen og er kendt som den primære overflade.ajourføring af dette direkte kan føre til skærmen raster fangst af billeder, som de er udarbejdet.dette giver en klipning eller river virkning, og du kan undgå det ved hjælp af en blok af video ram som en buffer.den primære overflade er altid vises, men din app altid skriver tilbage til buffer og opfordrer den anden metode.dette medfører, at de primære overflade og buffer (swap positioner og din monitor nu viser et nyt image, som er den hemmelige glatte computeranimation, og der kan ske op til 70 gange pr. sekund,,, en primær overflade af 1024 x 768 i 256 farver, plus en buffer finder 1.5mb video ram.så en video kort med 4mb video ram har 2.5mb tilbage til opbevaring af dine billeder.du ville måske foretrække at tildele en stor blok af ram på de vigtigste pc - hukommelse, gør alle manipulationer i det og derefter kopi til video kort overflade skal vises.der er mange teknikker for at ajourføre hastighed og det sjove er dem ud.at finde ud af, hvilken del af skærmen har ændret sig, og kun at kopiere det er en måde at begrænse trafikken.ikke alle har avs - - så burde du prøve din app på så mange systemer som muligt.,,,,,, det er alt, der er.trin 5 læner sig tilbage og tænker - - nu kan jeg bruge directdraw.der er et par mindre komplekse, få dine billeder fra bitmap filer eller ressourcer til en directdraw overflade.den bitmap skal være påfyldt hukommelse og så kopieret ind buffer.vinduer bitmaps indeholde en palet, og normalt er oplagret på hovedet.kan du have det sjovt kodning det selv eller anvende delphix bibliotek er komponenter til bitmap og palet forvaltning.,,, direkte adgang til video - ram, hvis din app har til direkte at ændre det på video hukommelse, så skal angive et rektangulært område, lås at vinde eksklusiv adgang til ram, ændre eller læse pixels og endelig til at løslade den lås.den kode låsen og lås bør holdes så kort vinduer er stoppet.,,, pas på banen!,, ikke om fodbold.hver overflade er på banen.den justerede bredde i byte.hvis du manipulerer med billeder på byte niveau, må du være klar over dette.kastet af en overflade er ofte forskellige til bredden.hver pixel linje begynder beg 'bytes fra den foregående.dette kan ske, fordi bredde er et ulige antal bytes og kastet runder op til nærmeste dobbelt ord eller bare sådan video kort gør det.bredden er 105, men banen kan være 108.den første linje er 0 bytes fra starten, og den næste, 108, 216 osv.,,, ved hjælp af gdi gdi, ikke er et stort problem.den gdi er lidt fast i sine metoder og bruger altid den samme blok af video, ram.det betyder, at et system for meddelelse (som en unhandled undtagelse) må ikke anføres, hvis du bruger side rundt og viser den anden blok af ram.men du kan kalde fliptogdi til den primære overflade være gdi eller getgdisurface for at få et fingerpeg til overfladen objekt.,,,,,,, mister deres data, mister billeder i video - ram er et mindre problem, hvis brugeren har en alat regning.alt er tabt.men directx holder øje med "mistet" status af overflader og vil give en overflade har fejl, hvis du prøver at bruge det.din app bør have en kontaktperson for at genskabe de overflader og lade billeder tilbage.,,, de ulemper,.,, og det vigtigste er, at debugging - fuld skærm directx apps er svær.adgang til video hukommelse er gjort af midlertidig standsning af vinduer.medmindre du har det behageligt at arbejde på det laveste niveau. dette kan være en tur i softice område, er der ingen vej på jorden, du kan gå igennem din kode mellem en lås... lås par.en måde at komme uden om dette er at anvende et hul procedure at sætte strenge parameter til en log filen, eller ser vindue i gexperts.,,, hvis du ved, c og c + + naturligvis microsoft give en gratis directdraw sdk mange eksempler, og sandsynligvis det mest oplysende hjælpe fil, jeg nogensinde har set.jeg anbefaler i directx 'bog fra microsoft presse på, for at alle de oplysninger om directx.microsoft presse, isbn: 1572316969.en anden bog er vinduer spil programmering for dummies "af andre lamothe udgiver idg bøger på verdensplan, inc. isbn: 0764503375, men igen er det, c /c + + baseret.,,, delphix, har lært at gøre enkle directdraw ting i delphi, du har nu et valg - at udvikle deres egne komponenter eller anvende dem, der er fastsat for - som delphix.jeg har ingen forbindelse med forfatteren, undtagen beundring for et fremragende stykke arbejde, og hans generøsitet ved at give det væk.hvis du er ny delphix, det kan være lidt overvældende, og jeg foreslår, at du udskriver prøver og demoer og gennemgå dem i detaljer.her er min oversigt over med dem.,,, en tdxform er en modificeret form, som skal benyttes som stamfader form ikke tform - det er et budskab, håndtering, herunder håndtering af undtagelser og skifter primære overflade til gdi så beskeder.en dxdraw komponent er faldet på det og de egenskaber, der er fastsat for beslutning og farve dybde.dette er tilfælde, der håndterer at beskæftige sig med opstart og afslutning af objekt.disse kontakter er, hvor din app skal gøre sin lastning af billeder og forberede spillet loop.,,, der er den vigtigste kamp loop er faktisk en timer drevet begivenhed kontaktperson.timeren holder øje med alle lag 'en, så du kan se, om din kode tager for lang tid at løbe.,,, der er image og imagelist komponenter, der lod dig oprettet bitmap billeder på bestemt tid, og de kan angive, i hvilken type ram (pc - system eller video) billederne er placeret.,,, restoresurface kontaktperson, der er så din app kan lade billeder, efter at brugeren alat øje og mister den video, ram indhold.,,, tdirectdrawsurface klasse gennemfører næsten alle de directx overflade funktionalitet.overflader kan oprettes overalt i alle størrelser og billeder blitted hurtigt med frivillig tilpasning og rotation mellem overflader.de fleste video kort har en hardware blitter og directdraw vil bruge denne.billeder er sjældent rektangulær, men som altid er defineret i en rektangulær blok.et kort, at rutinemæssige henleder 150 hexagons på under 4 ms, dvs. hver tager ca. 26 mikrosekunder.,,, oprettelse af en buffer automatisk er gjort, hvis de dxdraw. doflip mulighed er sandt.bemærk, at produktionen går tilbage til buffer - i dette tilfælde, og du kan ikke se noget, før dxdraw.flip kaldes.hvis doflip mulighed er falsk, som løber i et vindue, produktion går direkte, og du skal ikke kalde dxdraw.flip (selv om det ikke skader). koden for radar. exe.,, 370 linjer kode, jeg har skrevet en lille simulering af luftfartøjer, der flyver i tilfældig retning - er meget barebones funktionalitet, så forvent ikke sammenstød, påvisning eller eksplosioner.. nøglerne er øsu til at forlade, "" at tilføje et fly og alt-1, 2 - eller 3 - til at skifte til højere skærmopløsninger 640 af 480, 800 x 600 og 1024 x 768.,,, - fly i tre forskellige farver, flyv tilfældigt over skærmen på lidt forskellige hastigheder og lejer, og nogle vil blinke.der er 25 til at begynde med, men af en nøgle, og dette tal vil stige hurtigt.luftfartøjet er vist som rektangel omkring skærmen koordinater, og denne tekst er produktionen af bnp textout rutine. dette går tingene lidt.at se effekten af denne prøve med 100 fly så kommentere disse strækninger nedenfor i den metode, tplane.movendraw og løbe igen.alle, der vil blive udstillet, skal de vedlægge ramme.det er tegnet af en forsamling kode. jeg var bare blær!,,, hvis fflashcount > = 0, med fdxdraw.surface.canvas, begynder, brush.color: = fcolor;,, str. = inttostr (fx) + inttostr (rå);,, textout (fx, fy, str.,, udslip,,,,,, note, anvendelse af udslip i denne del af koden.det er en metode til tdirectdrawsurface og det frigør klare af de underliggende display - sammenhæng.hver gang du bruger en gdi ringer, skal du ringe til løsladelse.,,, - - kan du nu have flere luftfartøjer (rektangulære rammer gnidningsløst komme omkring skærmen.dets værd at prøve det med giver mulighed for og handicappede at se, hvilken forskel, hvis nogen, der gør.,,, hvordan det fungerer,.,, meget af det æsel arbejde ved at fastsætte egenskaber i dxdraw komponent. - eg skærmopløsning, fuld skærm eller windowed, doflip osv. osv.,,, jeg bruger en tstringlist til hold alle fly objekt.disse er skabt med tilfældige koordinater og bevægelighed retninger.i tiden kontakt, alle fly flyttede hvert billede af den vilkårligt fastsat x - og y - udligninger, hoppende fra skærmen kanter.skærmen er godkendt, og alle luftfartøjer, tegnes, hver gang.,,, teksten øverst til venstre, viser, hvor mange fly er på skærmen, og lag 'en.en normal lag - værdi er 1.alt er produktionen i en ramme.hvis dette går til 2 eller derover (lean på et centralt), luftfartøjet bevægelighed bliver tørret kød, som det tager længere tid end ét billede periode at tegne.prøv at undgå det.,,, de uudnyttede drawframe metode drager den ramme af kvadratisk eller rektangulær form i hvidt og meget hurtigt.både denne og den uudnyttede drawrect metode er gode eksempler på direkte adgang til video - ram via lås... lås og rutiner bruge banen medlem af overfladen deskriptor (dds) til at flytte fra en pixel - linje til den næste.,,, noter til delphi 4,0 og nt 4 brugere, der er to versioner af delphix til rådighed og begge vil arbejde med delphi - 3, de tidligere har en mindre zip fil (606kb).den anden (841kb) har en delphi 4,0 specifik kode (overbelastning og misligholdelse parametre) og støtter directx 6, men programmer bygget med det, vil ikke løbe under vinde nt 4,0 - stedet, du vil få fejl "grænseflade ikke støtte".anvendelse af den tidligere version i denne sag.,,, ---------------------, zip fil indeholdt har kilde filer, men ikke directx kode.dette kan hentes på http: //www.yks. ne. hori /jp /~ delphix-e.html eller forskellige andre steder.,,, sagen for denne artikel kan downloades her - ddraw.zip,



Previous:
Next Page: