Beweging

Status
Niet open voor verdere reacties.

turbojohn

Gebruiker
Lid geworden
26 jun 2007
Berichten
262
Hoi,

Voor een opdracht op school moet ik een liftfunctie in (GUI) C++ programmeren. Dus een virtuele lift. Alleen grafisch volstaat al. Ik heb het grafische gedeelte al, maar moet nu de lift naar boven zien te krijgen in een langzaam tempo. Hoe kan dit in c++?
 
Ik heb zelf de beweging inmiddels gevonden, (dmv een timerfunctie -> de timer heb ik bij events gekoppeld aan een functie die continu de Topwaarde =-1 doet, zodat hij langzaam stijgt), maar het probleem is dat de lift blijft stijgen, hij stopt niet bij een verdieping.
Ik heb devolgende code:
Code:
void __fastcall TForm1::BitBtn6Click(TObject *Sender)
{
int verdieping = 60;
Form1->BitBtn6->Font->Color = clRed; //fontkleur button voor de lift wordt rood, gebruiker ziet dat de liftfunctie in werking treedt. 


        while(Form1->Shape6->Top == 60) //60 is het aantaal pixels vanaf boven, daarmee geef ik de verdieping aan
        {
        Form1->BitBtn6->Font->Color = clBlack; //fontkleur button voor de lift wordt zwart
        Form1->Timer1->Enabled = false; //lift moet stoppen
        Form1->Shape7->Left = -11;  //Deur open naar links
        Form1->Shape8->Left = 506; //Deur open naar rechts
        }
}

void __fastcall TForm1::omhoog(TObject *Sender)  //Lift langzaam omhoog
{

Form1->Shape6->Top -= 1;
Form1->Shape9->Top -= 1;
Form1->BitBtn7->Top -= 1;
Form1->BitBtn8->Top -= 1;
Form1->BitBtn9->Top -= 1;
Form1->BitBtn10->Top -= 1;

}

Het nadeel is dat er met de while functie het programma vastslaat. De while kan niet samen met de GUI werken terwijl hij bezig is.
Hoe kan ik dit oplossen?
(btw, ik ben niet zoiemand die een ander mijn functie laat maken, ik zoek het liever zelf uit daar leer ik tenminste van, maar nu lukt het me echt even niet)...
 
Laatst bewerkt:
Ik zou eens op zoek gaan naar threads. Met een thread kan je je lift laten bewegen én blijft de GUI nog gewoon op de rest van je acties reageren.

Zo zou je het bijv. kunnen bouwen dat de lift stopt zodra je op een knop drukt ;)
 
Hoi, wat moet ik onder een 'thread' verstaan?
Ik ben maar een amateurtje in het programmeren, heb c++ omdat ik een HBO studie elektro volg. Hoe kan ik een thread opzetten of waar moet ik die vinden/zoeken?
Bedankt voor de reacties tot nu toe trouwens, ik krijg er zo wel meer inzicht in;)
 
Laatst bewerkt:
Hoi, wat moet ik onder een 'thread' verstaan?
Ik ben maar een amateurtje in het programmeren, heb c++ omdat ik een HBO studie elektro volg. Hoe kan ik een thread opzetten of waar moet ik die vinden/zoeken?
Bedankt voor de reacties tot nu toe trouwens, ik krijg er zo wel meer inzicht in;)

http://www.google.nl/search?hl=nl&q=c+++thread+tutorial&btnG=Google+zoeken&meta=
Beetje googlen doet wonderen ;)

Ikzelf heb met C++ nog nooit een thread gemaakt / gebruikt, dus kan je wat dat betreft niet helpen.
 
Hej,
Ja ik heb al gegoogeld, maar als ik niet weet wat het inhoudt ofzo dan kom ik ook niet verder. Ik heb ook al diverse forums bezocht, maar meestal ging het over problemen IN threads, niet WAT threads inhouden en hoe je ze maakt...
Het is de enige oplossing voor mijn probleem, dus als iemand mij kan helpen??:confused:
 
je hebt helemaal geen andere thread nodig, je moet er gewoon voor zorgen dat je omhoog functie niet meer aangeroepen wordt als de lift op een bepaalde verdieping beland is

probeer eens
Form1->Shape6->Top == 60
te vervangen door
Form1->Shape6->Top % 60 == 0

let op magic numbers( je wilt eigenlijk nergens nummers zien in je code, als het dan toch moet dan bovenin bij je defines )
 
Misschien kun je het een beetje zo doen:

Code:
int main()
{
    float dt = 0.0f;
    while ( running )
    {
        float startTime = GetTime();
        Input();
        Update( dt );
        Render();
        dt = GetTime() - startTime;
    }
}

void Input() {
    // verwerk hier je input
}

void Update( float dt ) {
    // doe hier dingen zoals de locatie van je lift updaten
    lift.y -= lift.speed * dt;
}

void Render() {
    // zorg hier voor de output op het scherm
    renderer.draw( lift.image, lift.x, lift.y );
}

Hehe, ik ben niet zo goed in uitleggen.. Maar het idee is dat je iedere frame een klein stukje van alles doet.

Eerst word er de input gecheckt ( of er iemand op een knop klikt bv ), daarna wordt alles binnen je programma geupdate ( bv je lift wordt een stukje omhoog geplaatst ), daarna wordt het scherm getekend en zijn de veranderingen zichtbaar. En dan begint hij weer van voren af aan ^^.
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan