Avatar billede jasperDK Nybegynder
20. maj 2003 - 12:09 Der 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..

Håber det er til at forstå??
Avatar billede driis Nybegynder
20. maj 2003 - 14:59 #1
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
Avatar billede driis Nybegynder
20. maj 2003 - 15:24 #2
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:

#include <windows.h>
#include <iostream>

using namespace std ;

#define WAIT 125
#define SCR_WIDTH    80
#define SCR_HEIGTH    25
#define A_CHAR "@"

int main()
{
    HANDLE h = GetStdHandle( STD_OUTPUT_HANDLE ) ;
    COORD pos = { SCR_WIDTH / 2, SCR_HEIGTH / 2 };
    COORD old = pos ;

    system("cls") ;

    pos.X = SCR_WIDTH / 2 ;
    pos.Y = SCR_HEIGTH / 2 ;
    SetConsoleCursorPosition(h,pos) ;
    cout << A_CHAR ;

    while ( !(GetAsyncKeyState(VK_ESCAPE) & 0x8000 ) )
    {
        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 ) ;

        if ( pos.X != old.X || pos.Y != old.Y )
        {
            SetConsoleCursorPosition(h,old) ;
            cout << " " ;
            SetConsoleCursorPosition(h,pos) ;
            cout << A_CHAR ;
            old = pos ;
            Sleep( WAIT ) ;
        }
    }
    return 0 ;
}
Avatar billede jasperDK Nybegynder
20. maj 2003 - 16:30 #3
Vil du også forklare lidt om det du har lavet det?
Avatar billede driis Nybegynder
20. maj 2003 - 16:54 #4
Selvfølgelig:

#include <windows.h>
#include <iostream>

using namespace std ;

// 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.
}
Avatar billede driis Nybegynder
20. maj 2003 - 16:57 #5
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 )
Avatar billede jasperDK Nybegynder
20. maj 2003 - 18:58 #6
Tusind tak Driis
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester