20. maj 2003 - 12:09Der er
5 kommentarer og 1 løsning
Rykke fra sted til sted.
Jeg vil ligesom i f. eks counter strike, få en eller anden lille ting, til at bevæge sig når man trykker på w eller f. ( I couter strike rykker figurene sig). F. eks At et t vil rykke ned ad når man trykker s, og det vil rykke op når man trykker w, til venstre når man trykker d og til højre når man trykker a..
Du vil altså lave en slags animering, afhængig af hvad der trykkes på. Det, du skal gøre er, at kontrollere om en af de taster, du vil reagere på, er trykket ned. Derefter sletter du figuren og tegner den lidt længere henne i den rigtige retning. Dernæst venter du et tidsrum, før du igen ser efter, hvad der er trykket på - og derefter lader programmet reagere igen.
Så ser det ud som om figuren bevæger sig. Men hvis du ingen idé har om hvordan det skal laves, vil jeg nok foreslå dig at lære noget generel C++ programmering først
Jeg har flækket et meget simpelt eksempel sammen her, hvor du kan styre et @ rundt i et konsol vindue med piletasterne. Jeg har brugt Windows funktioner til at styre det, men det kan naturligvis implementeres på mange forskellige måder:
// Her defineres konstanter, der bliver brugt #define WAIT 125 // Ventetid i ms mellem hvert flyt #define SCR_WIDTH 80 // Vinduets bredde (standard 80) #define SCR_HEIGTH 25 // Vinduets højde (standard 25) #define A_CHAR "@"
int main() { HANDLE h = GetStdHandle( STD_OUTPUT_HANDLE ) ; // Returnerer et handle til konsolvinduet // definér 2 COORD strukturer, som repræsenterer et punkt i vinduet. COORD pos = { SCR_WIDTH / 2, SCR_HEIGTH / 2 }; COORD old = pos ;
// slet skærmen system("cls") ;
// Sæt cursorens position til pos SetConsoleCursorPosition(h,pos) ; // udskriv et @ cout << A_CHAR ;
// while ( der ikke er trykket escape) while ( !(GetAsyncKeyState(VK_ESCAPE) & 0x8000 ) ) { // Hvis der bliver trykket på en piletast, så opdater koordinatet if ( GetAsyncKeyState(VK_LEFT) & 0x8000 ) pos.X = ( pos.X > 0 ? pos.X - 1 : 0 ) ; if ( GetAsyncKeyState(VK_RIGHT) & 0x8000 ) pos.X = ( pos.X < SCR_WIDTH - 1 ? pos.X + 1 : SCR_WIDTH ) ; if ( GetAsyncKeyState(VK_UP) & 0x8000 ) pos.Y = ( pos.Y > 0 ? pos.Y - 1 : 0 ) ; if ( GetAsyncKeyState(VK_DOWN) & 0x8000 ) pos.Y = ( pos.Y < SCR_HEIGTH - 1 ? pos.Y + 1 : SCR_HEIGTH ) ;
// Hvis vi har et nyt koordinat if ( pos.X != old.X || pos.Y != old.Y ) { // Slet det gamle tegn ved at skrive space henover SetConsoleCursorPosition(h,old) ; cout << " " ; // Skriv et nyt @ på den nye position SetConsoleCursorPosition(h,pos) ; cout << A_CHAR ; old = pos ; Sleep( WAIT ) ; // Vent WAIT = 125 ms før vi fortsætter. } } return 0 ; // Når der er trykket escape ryger vi ud af første while - løkke, // og der returneres 0. }
Det skal måske lige bemærkes, at GetAsyncKeyState returnerer en short int, hvor MSB er sat, hvis tasten er trykket ned. ( 8000 hexadecimalt skrives 1000 0000 0000 0000 binært )
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.