Ved hjelp av Direct med Delphi

Dette viser hvordan du kan begynne å bruke DirectX biblioteket i Delphi programmer og deretter demonstrerer et enkelt program å bruke freeware bibliotek DelphiX.If du noen gang har prøvd å gjøre rask skjerm utgang under Windows, vil du vite at det er ingen enkel oppgave. Med alle triksene mulig det fortsatt faller sørgelig langt kort av kommersielle spill hastigheter. Men jeg skal vise deg hvordan du bruker DirectX i dine apps å gjøre jevn rask utgang som kan være tidsbestemt i mikro ikke minutter! For noen år siden, Microsofts utviklere innsett at Windows var ikke et spill plattform og de lovet å endre dette. I 1995 dukket den kortlivede ving. Dette tillot rask utskrift i 256 fargemoduser på Win 3.1 og Win 95. Det var rask, men begrenset og snart erstattet av DirectX. Dette er en familie av API-er for rask utgang og inngang. Appene dine kan bruke skjermkort, lydkort og selv force-feedback joystick gjennom DirectX. Jeg skal se på Direct den visuelle API og komme tilbake til de andre i fremtiden. Andre DirectX API inkluderer Direct for lydkort, Direct for joysticks etc, Direct3D for 3d-grafikk og Direct for multi-player. Selv om DirectX er nå på versjon 6.1, har Direct vært tilnærmet uendret siden versjon 3. Versjon 3 BTW er den ene bygget inn Win NT 4.0.Windows styrke er at det fungerer med mange forskjellige skjermer, skjermkort og i flere oppløsninger og fargedybder. Dette krever mye kode mellom App og skjermkortet maskinvare og denne "Tykt Api 'er grunnen til Windows utgangs rutiner er treg. Dette var også tilfelle med Dos når den først dukket opp, og spillutviklere gikk rett i bånn i stedet for å bruke BIOS eller DOS API rutiner. Inntil for to år siden, ble de fleste spill fortsatt skrevet for Dos, også de som kjører under Windows 95. Nå, sannsynligvis 99% bruker DirectX og snart det synes Windows CE mikroer skal kjøre kommersielle arkade maskiner bruker DirectX.DirectX /Direct støtter en tynn API tilnærming med få lag mellom maskinvaren og din App. DirectX er bygget på COM, Component Object Model, slik at nye versjoner kan bli løslatt uten å bryte den eksisterende koden. Hvis din app fungerer med DirectX versjon 5, er det garantert til å jobbe med DirectX 6, 7 ... 308! Direct gir informasjon til din App om hvilken maskinvare har videoen eller lydkortet har, og hva er emulert i programvaren. Denne DirectX tilnærming garanterer at programvaren vil kjøre på kortene ennå ikke utviklet, og vil være i stand til å bruke sine avanserte funksjoner. På nedsiden betyr det at du må skrive to eller tre forskjellige måter å gjøre ting og velge den beste (= raskest) metoden på runtime.DirectX og DelphiAlthough C og C ++ er de viktigste språkene ifor DirectX, er Delphi svært godt egnet til ir . Blake Stone gjorde første DirectX header oversettelse fra C til Delphi og Borland sin Charlie Calvert har børstet om emnet i hans Delphi 2/4 'Unleashed' bøker. Mr. Hiroyuki Hori i Japan utviklet DelphiX- en utmerket sett av gratis Delphi komponenter for DirectX. Disse er tilgjengelige fra mange steder på nettet eller hans hjemmeside på http://www.ingjapan.ne.jp/hori/. Du må også installere DirectX versjon 5 eller høyere. Du har sikkert fått det på systemet ditt allerede hvis du har kjøpt et spill i fjor. Windows 98 og fremtiden NT5 kommer med DirectX bygget i. NT 4, Service Pack 3 støtter også DirectX 3.0.I'll nå vise deg de vesentlige av Direct programmering og hvordan du får det beste ut av de DelphiX komponenter med et eksempel App. Hvis du bruker DelphiX, vil du finne at Mr. Hori hjelpefiler er kanskje ikke krystallklart, men du får komplett kildekode og en rekke gode eksempler på programmer for å overvinne dette. DelphiX er et flott stykke programvare, og du kan skrive nær arcade kvalitet spill i Delphi bruker det.Selv hvis du ikke er i spill programmering, den ekstra hastigheten som Direct tilbyr lar deg lage programmer med flimmerfritt høyhastighets utgang som radarskjermer, oscilloskop , rullende kart etc. Jeg har brukt det i en rulle kart og det trekker en skjerm full av 256 fargesekskanter på 1024 x 768 oppløsning (hver hex passer i et rektangel 32 piksler bred og 34 dyp) på 26 ms på en P2 300 utstyrt med et AGP Matrox Millenium-kort. Det er nesten 40 bilder per sekund, ikke i det hele tatt dårlig for Delphi..In Direct, har Microsoft ikke kastet ut GDI heller. En av de store smerter av Dos spillutvikling ble sende ut tekst, spesielt å ha for å lage din egen skrifter eller meldingspunktgrafikk. Heldigvis fungerer med Direct GDI slik at Truetype-skrifter kan brukes. Faktisk det meste av GDI fungerer, så lenge en bit av omsorg er tatt. Selvfølgelig GDI-utgang er ikke veldig fort, så du bør egentlig bare bruke det til å lage tekst, vil menyene etc.Getting StartedYou trenger DirectX header-filer-det ikke noe bedre sted enn DelphiX biblioteket. Den medfølgende Directx.pas er en heidundrende 300kb i størrelse. Det inkluderer alle Direct osv API poster, GUID etc. Hvis du har vært lurer på i Gobi for de siste fem årene, kan du bli kjent med GUID, men de er rett og slett en samling tall som dette [{5C690320-0BD2 -11D3-89DF-00409545E8E7}] som unikt identifisere objekter og klasser i Windows. Microsoft tenkt satt GUID inneholder dine nettverkskort 'Mac-adressen til alle Word- og Excel-filer som er opprettet på PCen. Hvis du gjør Ctrl-Shift G i Delphi Ide, de siste 12 sifrene i GUID generert er dine nettverkskort Mac-adresse (hvis du har et nettverkskort) .DirectDraw er ikke så vanskelig å jobbe med, bare litt fiddly på steder . Her er mine fem poeng nybegynnere guide for å komme i gang. Først opprette en Direct objekt. Dette representerer ett skjermkort /skjerm oppsett, og under Windows 98 vil støtte flere enheter. Dette er definisjonen av DirectDrawCreate.function DirectDrawCreate (lpGUID: PGUID; ut lplpDD: IDirectDraw; pUnkOuter: IUnknown): HRESULT; Anywhere det er en pUnkOuter parameter, bare passere null. Denne samtalen skal returnere en DD_OK verdi (= 0). Alt annet er en feil, og bør håndteres av din code..Step to er å spesifisere co-operative nivå. Ikke ønsker det hele skjermen utelukkende eller å dele den? De fleste spill kjører i fullskjermmodus slik at programmet kan velge skjermmodus og oppløsning å bruke. Hvis du bruker den i et vindu, bør programmet ditt ikke endre mode.The dwFlags parameter kan du oppgi om du bruker hele skjermen eller ikke, eller om din app styrer skjermen slik at ingen andre app kan endre det, og selv om brukeren kan Ctrl -Alt-Del på reboot.function SetCooperativeLevel (hWnd: HWND; dwFlags: DWORD): HRESULT; Det er mulig å be Direct objekt for alle støttede videomodus. De fleste skjermkort støtter mange moduser, men høyere frekvens /fargemoduser kan trenge høyere båndbredde enn skjermen din kan takle. Bytte til disse modusene vil ikke fungere og kunne forlate skjermen i en unsynched tilstand, så sørg for å inkludere en ansvarsfraskrivelse når du distribuerer dine apps! Enda bedre, få brukeren til å velge modus fra en liste. Quake og mange spill bruker denne approach.Step 3 er satt skjermmodus. Dette gjelder bare hvis du ønsker full skjerm access.function SetDisplayMode (dwWidth, dwHeight, dwBpp: DWORD): HRESULT; dwBpp er Bits per piksel, dvs. 8 til 256 farger. 640x 480 med 8 er sannsynligvis et sikkert kort på en hvilken som helst PC! Trinn 4 er hvor overflater er opprettet. Alle bilder er holdt i overflater. Dette er bare noen kvartaler av ram med en valgfri palett og din app kan skape overflater i hoved PC system ram, eller i skjermkortet ram. Ingen premier for å gjette at bildene i video-RAM bilder er raskest til å kopiere til video ram, selv om AGP-kort kan flytte data fra PC-ram veldig quickly.CreateSurface skaper en overflate i henhold til overflaten beskrivelse parameter.function CreateSurface (konst lpDDSurfaceDesc: DDSURFACEDESC; ut lplpDDSurface: IDirectDrawSurface; pUnkOuter: IUnknown): HRESULT; hovedflate representerer skjermen og er kjent som primærflaten. Oppdatere dette direkte kan føre til displayet raster fanger bildene som de er trukket. Dette gir en skjæring eller rive effekt, og du kan unngå det ved å bruke en annen blokk av video ram som Back Buffer. Primær Surface vises alltid, men appen alltid skriver til baksiden buffer og deretter kaller flip-metoden. Dette fører til at Primary Surface og Tilbake Buffer innholdet til å bytte posisjoner og skjermen viser nå den nye bildet som er hemmeligheten bak jevn dataanimasjon og kan skje opptil 70 ganger per sekund. En Primær Surface på 1024 x 768 i 256 farger pluss en tilbake buffer tar 1.5Mb av video ram. Så et skjermkort med 4MB-video ram vil ha bare 2,5 MB venstre for lagring av bildene dine. Du foretrekker kanskje å bevilge en stor blokk med ram i hoved PC-minne, gjør alle manipulasjoner i det og deretter kopiere denne til skjermkortet overflaten som skal vises. Det finnes mange teknikker for å optimalisere oppdatering fart og en del av moroa er å prøve dem ut. Å holde styr på hvilken bit av skjermen har endret seg og bare kopiere den biten er en måte å redusere trafikken. Ikke alle har AGP så du bør teste programmet på så mange systemer som possible.That er egentlig alt det er. Trinn 5 sitter tilbake og tenkning-wow jeg kan nå bruke Direct. Det er noen mindre komplikasjoner som å få bildene dine fra bitmap-filer eller ressurser til en Direct overflate. Den bitmap må være lastet inn i minnet og deretter kopiert inn i ryggen buffer .. Windows bitmaps inneholde en palett og lagres vanligvis opp ned. Du kan ha det gøy koding dette selv eller bruke DelphiX bibliotekets komponenter for bitmap og palett management.Direct Tilgang til Video RamIf din App har å direkte endre piksler i videominne så må du angi et rektangulært område, ring lås for å få eksklusiv tilgang til ram, endre eller lese piksler, og til slutt ringe låse opp for å slippe den. Koden den låse og låse bør holdes kort som Windows er stopped.Watch Pitch! Nei det er ikke om fotball. Hver overflate har en pitch. Dens den justerte bredde i byte. Hvis du manipulere bilder på byte-nivå, må du være klar over dette. Stigningen av en overflate er ofte forskjellig bredde. Hver piksel linjen starter 'pitch' byte fra den forrige. Dette kan skje fordi bredden er et ulikt antall bytes og banen runder opp til nærmeste dobbel ord eller sin akkurat slik skjermkortet gjør det. Bredden kan være 105, men banen kan være 108. Den første linjen er 0 byte fra starten, den neste 108, så 216 og så on.GDIUsing GDI er ikke et stort problem. GDI er litt fast i sine måter, og alltid bruker samme blokk med video ram. Dette betyr at en systemmelding (som en ubehandlet unntak) ikke kan vises hvis du bruker side bla og vise den andre blokken ram. Men du kan ringe fliptoGDI å gjøre det primære overflaten være GDI eller GetGDISurface å få en peker til overflaten object.Losing Dine DataLosing bilder i video ram er et mindre problem hvis brukeren gjør en Alt-Tab. Alt er tapt. Men DirectX holder styr på "tapt" status av overflater og vil gi en "Surface tapte 'feil hvis du prøver å bruke det. Din app bør ha et behandlingsprogram for å gjenskape overflater og legg bildene tilbake in.The ulemper .... Det viktigste er at feilretting fullskjerm DirectX Apps er vanskelig. Tilgang videominne gjøres ved å midlertidig stoppe Windows. Med mindre du er komfortabel å jobbe på det aller laveste nivået; dette kan være en spasertur i softice territorium, er det ingen måte på jorden du kan gå gjennom koden din mellom en Lock..unlock par. En vei rundt dette er å bruke en dump prosedyre for å føye strenger parameter til en loggfil, eller en debug vindu som i Gexperts.If du vet C eller C ++ selvfølgelig Microsoft tilbyr en gratis Direct SDK med mange eksempler og sannsynligvis den mest informative hjelpe fil jeg noensinne har sett. Jeg anbefaler 'Inside DirectX' bok fra Microsoft trykk for all bakgrunnsinformasjon om DirectX. Microsoft Press; ISBN: 1572316969. Et alternativ bok er Windows Game Programming for Dummies av Andre Lamothe utgiver IDG Books Worldwide Inc; ISBN: 0764503375, men igjen dette er C /C ++ based.DelphixHaving lært hvordan du gjør enkle Direct ting i Delphi har du nå en valg-utvikle dine egne komponenter eller bruke de som er definert for deg-ut DelphiX. Jeg har ingen sammenheng med forfatteren unntatt beundring for en utmerket jobb og hans generøsitet i å gi den bort. Hvis du er ny på DelphiX, kan det være litt overveldende, og jeg foreslår at du skriver ut prøvene og demoer og studere dem i detalj. Her er min oversikt om bruk dem.En TdxForm er en modifisert form som må brukes som stamfar form, ikke TForm- det spiller noen meldingshåndtering, inkludert håndtering av unntak og bytter primære overflaten til GDI slik at du ser meldinger. En DxDraw komponent slippes på det og egenskapene satt for oppløsning og fargedybde. Dette har hendelsesbehandlinger å håndtere initialisering og avslutte objektet. Disse handlers er der appen må gjøre sitt lasting av bilder og forberede for spillet sløyfen hovedspillet sløyfe er faktisk en tidtaker drevet hendelsesbehandling. Timeren holder styr på alle lag, slik at du kan se om koden din er å ta for lang tid å run.There er bilde og imagelist komponenter som lar deg sette opp bitmap bilder på design-tiden, og du kan angi i hvilken type ram (PC system eller Video) bildene er plassert. En RestoreSurface håndterer er gitt slik at appen kan laste bildene etter bruker Alt-Tabs og mistet video ram contents.The TDirectDrawSurface klassen implementerer omtrent alt av DirectX overflaten funksjonalitet. Overflater kan lages hvor som helst, uansett størrelse og bilder blitted raskt med valgfri skalering og rotasjon mellom overflater. De fleste skjermkort har en hardware blitter og Direct vil bruke dette. Bildene er sjelden rektangulære, men er alltid definert i en rektangulær blokk. Et kart tegning rutine trekker 150 sekskanter i opp til 4 ms dvs. hver tar rundt 26 microseconds.Creation av en back buffer blir automatisk gjort hvis Dxdraw.Doflip alternativet er sant. Legg merke til at produksjonen går til baksiden buffer i så fall, og du vil ikke se noe før dxdraw.flip kalles. Hvis doflip alternativet er falsk, som i å kjøre i et vindu, går utgang direkte og du trenger ikke å ringe dxdraw.flip (selv om det gjør ingen skade) sikret Code of Radar.Exe.In 370 linjer med kode, jeg har skrevet en liten simulering av fly som flyr i tilfeldig directions- dette er veldig bones funksjonalitet, så ikke forvent dueller eller eksplosjoner !. Tastene er ESC for å avslutte, 'A' for å legge til et fly og Alt-1, 2 eller 3 for å endre til høyere skjermoppløsning på 640 x 480, 800 x 600 og 1024 x 768.The fly i tre forskjellige farger fly tilfeldig over skjermen på litt forskjellige hastigheter og lagrene og noen blinker. Det er 25 til å begynne med, men hold nede A-tasten, og tallene vil øke virkelig rask. Flyet er vist som rektangler rundt skjermen koordinater og denne teksten er skrevet ut av GDI TextOut rutine; dette bremser ting ned litt. For å se effekten av dette, prøv det med 100 fly så kommenter bort disse linjene nedenfor i metoden tPlane.MovenDraw og løpe igjen. Alt som vises er den omsluttende rammen. Dette er tegnet av en rørlegger kode; Jeg var bare vise frem hvis fflashcount > = 0 deretter med fdxdraw.Surface.Canvas gjør begynne brush.color: = fcolor; str: = inttostr (fx) + inttostr (fy); textout (fx, fy, str); gi ut; end; merke til, bruk av frigjørings i denne bit av koden. Dette er en metode for TDirectDrawSurface og det frigjør håndtaket på underliggende Skjerm kontekst. Hver gang du bruker en GDI kaller du bør ringe release.You kan nå ha en mye mer fly (vel rektangulære rammer) jevnt suser rundt på skjermen. Det er verdt å prøve det ut med flipping aktiveres og deaktiveres for å se hvilken forskjell om noen som makes.How Det works.Much av esel arbeidet er gjort ved å sette eiendommer i DXDraw component.- f.eks Skjermoppløsning, full skjerm eller vindus, doFlip etc osv.Jeg bruker en tstringlist å holde hvert fly objekt. Disse er laget med tilfeldige koordinater og bevegelsesretninger. I timeren handler, er alle flyene flyttes hver ramme av tilfeldig spesifiserte x og y forskyvninger, spretter av skjermen kanter. Skjermen tømmes og alle fly tegnes på nytt hver tid.Det tekst øverst til venstre viser hvor mange fly er på skjermen og lag. En normal lag verdi er 1. Alt er produksjon i en ramme. Hvis dette går til to eller flere (lean på A-tasten), blir flybevegelse jerky som det tar lengre tid enn én ramme periode for å tegne. Prøv å unngå dette! Ubenyttet DrawFrame metoden trekker rammen av rektangler i hvitt og er veldig rask. Både denne og den ubrukte Drawrect metoden er gode eksempler på direkte tilgang til video ram via Lock..Unlock og begge rutiner bruke banen medlem av Surface Descriptor (DDS) til å bevege seg ned fra en pixel linje til next.Notes for Delphi 4.0 og NT 4.0 UsersThere finnes to versjoner av DelphiX tilgjengelig, og begge vil jobbe med Delphi 3.0, jo tidligere man har en mindre zip-fil (606Kb). Den andre (841Kb) har noen Delphi 4.0 spesifikk kode (overbelastning og standard parametere) og støtter DirectX 6 men programmer bygd med det, ikke vil kjøre under Win NT 4.0- stedet vil du få feilmeldingen "Interface støttes ikke". Bruk den tidligere versjonen i så fall .--------------------- Zip-filen inkludert har kildefiler, men ikke DirectX kode. Dette kan lastes ned fra http://www.yks.ne.jp/~hori/DelphiX-e.html eller diverse annen places.The fil for denne artikkelen kan lastes ned her - ddraw.ZIP



Previous:
Next Page: