Procedure + netværk

Tags:    delphi

Hejsa :)

Hej jeg har lavet et 4 på stribespil. Til at simulere et fald af brikkerne har jeg brugt en delay-funktion, men der er lige nogle ting jeg vil have helt på plads. Jeg har en procedure, som jeg lige skal være helt sikker på, at jeg har forstået.

Fold kodeboks ind/udKode 


Proceduren er let at bruge, men hvad er en DWORD? Umiddelbart fungerer den vel som en Integer i denne sammenhæng. Og GetTickCount? Så vidt jeg har forstået er det et antal millisekunder siden opstart, men jeg er ikke helt sikker på af hvad. Application.Processmessages; har jeg forstået som den der skaber det egentlige delay, men er ikke helt sikker på denne funktion. Har haft det i en bog, men den har jeg mistet. Jeg kunne godt tænke mig i hjalp med at smide lidt ord på. Det ville jeg være meget taknemmlig for.

Desuden overvejer jeg at lave sådan at man kan have programmet åbent og så spille over netværk. Altså tænker jeg på, at et træk på den ene computer skal vidreføres til den andens program, som man spiller med. (aktivere en procedure?). Jeg ved ikke hvordan dette helt fungerer. Jeg har aldrig arbejdet med netværk før, men har i nogle ideer til, hvordan jeg kunne komme i gang? Nogle gode guides eller noget? Jeg er åben for indlæring!

Tak på forhånd!



2 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 6 karma
Sorter efter stemmer Sorter efter dato
dword er en type der kan indeholde et positivt tal. Den er blot unsigned så det kan kun være positive tal.
Gettickcount returnerer ganske rigtigt antal millisekunder siden et bestemt tidspunkt. mener vist at det er opstart af computeren?
application.processmessages; går ind og checker for events for dine forms. den vil skabe en lille pause idet den checker for disse events. det bliver gjort så mange gange det nu er nødvendigt indtil at der er gået et bestemt antal millisekunder. Fordelen ved at pause med processmessages er at du uden videre kan flytte formen og bruge komponenterne derpå imens, modsat hvis du brugte en funktion som sleep.

spil over netværk er noget tungt noget at gå igang med. Du har muligheden for at gå helt lowlevel med delphi og oprette din egen winsock wrapper men dette kræver meget kendskab til pointere og lign.
Et alternativ ville være at bruge Indy netværkskomponenterne. Jeg må indrømme at jeg ikke selv har fået dem til at virke men de skulle virke meget fint og de vil dække dine krav.
Her er lidt læsning om indy men det kan være tungt:
http://delphi.about.com/gi/dynamic/offsite.htm?zi=1/XJ&sdn=delphi&zu=http%3A%2F%2Fwww.swissdelphicenter.ch%2Fen%2Fshowarticle.php%3Fid%3D4



application.processMessages... Her tager APPLIKATIONEN og PROCESSERER de MESSAGES den måtte have.

Crash kursus i Windows programmering:
"Alt" i Windows kører i events. Hver event bliver lagt i en kø: Windows Message Que.

Når din applikation (og alt andet der kører på din windows) har tid, håndteres den kø der ligger til præcis den applikation.

Så når skærmen skal gentegnes (ved flyt skærm eller lign) gøres dette først når programmet har tid.

Et eksempel er:

Opret en løkke der kører med i := to 1000000
Inde i løkken opretter du en tekstfil, skriver 'banan' på linie et, saver til disk, opretter en ny, checker om den eksisterer, sletter hvis indholdet er det samme... Eller et eller andet der tager lidt tid...

Når du starter løkken, opdager du at dit program går "i stå". Prøv at starte programmet, og skifte over til et andet program, træk det andet program ind foran dit, og skift så tilbage til dit.... Skærmen opdateres ikke...

OK, smid nu en application.processMessages ind i løkken, og prøv så...
Du oplever to forskelle.
1) Skærmen gentegnes ret hurtigt og programmet ser pænt ud.
2) Det tager pludselig meget længere tid at håndtere din løkke.

Jeppe har ret i at sleep vil stoppe dit program, det giver ganske enkelt besked til Windows om "Lad være med at udføre mig de næste xxx millisekunder".

For at få brikkerne til at falde på plads, så det ser ud som om de bevæger sig kan du istedet benytte en trådsikker timer (kan downloades i 1000 forskellige afskygninger tror jeg, søg efter TThreadTimer og Delphi på Google). Det ville jeg nok anbefale.. Og så lave en nedarving fra TShape (hvis det er den du bruger), der aggregerer med ThreadTimer og en metode der tager ny position som parameter. Metoden flytter så self 1 pixel af gangen..

Men der er jo et hav af muligheder.

Jeg vil ikke anbefale at begynde at lave WinSocket komponenter selv. Hvis du ikke kan bruge INDY af forskellige årsager (HUSK ANTIFREEZE KOMPONENTEN), så kan jeg på det varmeste anbefale de Delphi-komponenter der følger med, men ikke er installeret. Søg i Delphi's RTL, eller VCL biblioteker efter en pas-fil der implementerer TClientSocket og/eller TServerSocket

/Jens






t