Ampel



  • hi, bin neu hier und bin gerade dabie eine ampelschaltung zum machen.

    hab jetzt das problem das ich nicht weiss wie ich das hinbekommen soll mit einen schalter.

    ich will den schalter druecken und dann soll die ampel angehen und ablaufen, aber ich bekomm es einfach nicht.

    #include <cstdlib>
    #include <iostream>
    #include <graphics.h>

    using namespace std;

    int main(int argc, char *argv[])

    {
    int gdriver = DETECT, gmode, errorcode;
    int midx, midy, radius = 50;

    //Grafikfenster grösse 150x500
    initwindow(150, 500);

    //Linien im Grafikfenster für die Ampel
    line(140, 10, getmaxx()-9, getmaxy()-50);
    line(9, 10, getmaxx()-140, getmaxy()-50);
    line(9, 10, getmaxx()-9, getmaxy()-489);
    line(9, 449, getmaxx()-9, getmaxy()-50);
    outtextxy(10,467,"Signal kommt");

    //Linien im Grafikfenster für den Druckknopf
    line(140, 490, getmaxx()-9, getmaxy()-40);
    line(110, 490, getmaxx()-39, getmaxy()-40);
    line(140, 490, getmaxx()-39, getmaxy()-9);
    line(110, 459, getmaxx()-9, getmaxy()-40);
    floodfill(123,474,WHITE);

    //read result of initialization
    errorcode = graphresult();
    if (errorcode != grOk) //Wenn ein Fehler Auftritt
    {
    printf("Graphics error: %s\n", grapherrormsg(errorcode));
    printf("Press any key to halt:");
    getch();
    exit(1); //Mit einen Fehlercode beenden
    }
    //Kreis 1 im Grafikfenster für Ampel
    midx = getmaxx() / 2 + 2;
    midy = getmaxy() / 6 + 5;
    setcolor(RED);
    setfillstyle(1, RED);
    fillellipse(76, 88, 49, 49);
    circle(midx, midy, radius);

    //Kreis 2 im Grafikfenster für Ampel
    midx = getmaxx() / 2 + 2;
    midy = getmaxy() / 6 + 145 ;
    setcolor(YELLOW+YELLOW+YELLOW+YELLOW);
    setfillstyle(1, 255+200+0);
    fillellipse(76, 228, 49, 49);
    circle(midx, midy, radius);

    //Kreis 3 im Grafikfenster für Ampel
    midx = getmaxx() / 2 + 2;
    midy = getmaxy() / 6 + 285;
    setcolor(GREEN);
    setfillstyle(1, GREEN);
    fillellipse(76, 368, 49, 49);
    circle(midx, midy, radius);

    //Grafikfenster und Konsole schliessen
    getch();
    closegraph();
    //system("PAUSE");
    return EXIT_SUCCESS;
    }

    soweit ist es jetzt und unten rechts der schalter soll gedrueckt werden koennen, also das gebiet :I

    hoffe mir kann einer helfen

    mfg ExEcUt!oNeR



  • Hast du denn wenigstens den richtigen Compiler zum Quelltext?
    Meiner Erinnerung nach sollten das nur Compiler eines Anbieters übersetzen können.

    Also mal Butter bei die Fische 😉

    Und, wo ausser im Header deutet etwas auf C++ hin 😕

    Da lassen wir uns überraschen wo dieser Beitrag hin verschoben wird 🤡

    f.-th.



  • Ich arbeite mit dev-c++ und oben steht c/c++ Forum da muesste ich doch hier richtig sein oder nicht? ;).

    und wenn nicht bitte verschieben 🙂

    ExEcUt!oNeR



  • Der DEV ist zum
    1. schon mal ein wenig älter -> schau dir Code::Blocks 10.05 mit den MinGW 4.4.1 an.
    2. ohne Zusatzbibliothek geht bei dem Quelltext mit dem DEV gar nichts, oder hast du die Headerdatei "graphics.h" auf deinem PC?
    3. das ist C-Quelltext also gehören C-Header oben darüber und keine C++ Header.
    4. der von dir gefundene Quelltext ist fast 20 Jahre alt im Original.

    So nun hast du die Wahl das ganze neu aufzubauen, aber da musst du zu Klimmzügen greifen, denn Farbe ist weder in C noch in C++ vorgesehen.
    Oder DOS 5.0, oder ähnlich, installieren und einen Borland-Compiler von damals draufsetzen und das Resultat darauf laufen lassen 😃

    Du hast die Wahl 🕶
    f.-th.


  • Mod

    ExEcUt!oNeR schrieb:

    Ich arbeite mit dev-c++ und oben steht c/c++ Forum da muesste ich doch hier richtig sein oder nicht? ;).

    Zu DevC++ fällt uns vor allem dies hier ein:
    http://www.c-plusplus.net/forum/237002

    und wenn nicht bitte verschieben 🙂

    Die Frage ist: Wohin? Niemand macht mehr was in Dev C++.

    Du benötigst irgendeine Art Warteschleife, besser noch einen Wartethread (kann man bei Dev C++ Threads machen?). Nehmen wir mal an, eine Warteschleife:

    while(! programm_beendet)
    {
     if (pruefe_ob_button_gedrückt()) lass_ampel_laufen();
     if (pruefe_ob_programm_beendet()) programm_beendet=true;
     sleep(/*ein paar sekundenbruchteile*/);
    }
    

    Das sleep sorgt dafür, dass dein Programm nicht mit 100% Prozessorlast wartet. sleep ist jedoch kein Standardbefehl, da musst du mal gucken, wie das bbei dev c++ geht. Es geht jedenfalls darum, das Programm kurz warten zu lassen.

    Das Prüfen, ob button gedrückt wurde: Ich nehme an, irgendwoher bekommst du eine Mausposition? Sonst würdest du ja gar nicht erst fragen. Damit sollte es einfach sein, eine Funktion zu schreibendie prüft, ob die Maus im richtigen Bereich ist und ob sie gerade gedrückt ist.

    edit: f.-th. kennt sich da besser aus als ich: Wenn das alles Erweiterungen von Turbo C++ sind statt von Dev C++, dann kannst du alles vergessen was ich geschrieben habe, außer das über das Alter von Dev C++.



  • Hab noch etwas gefunden
    Mit der genannten Zusatzbibliothek geht das eventuell:
    http://www.techniker-forum.de/elektrotechnik-30/borland-bgi-graphics-h-devc-alternative-543

    Wenn so was verwendet wird, sollte darauf hingewiesen werden. So gibt es Kommentare wie von mir zuvor 😉

    MfG f.-th.





  • wir haben das programm in der schule bekommen, haben davor mit Robot Karol angefangen. ich denke mal ich muss das mit dem programm machen, bleibt mir ja nichts anderes ueber.
    er hat uns das programm gegeben und die aufgabe und sollen uns alles selbst erarbeiten, aber komm einfach nich weiter.
    keiner kann mir wirklich helfen 😞 ,da es entweder ein anderes programm ist oder weil ich es nicht verstehe ^^.
    im internet finde ich auch einfach nichts dazu -.-
    @f.-th bei punkt 1 kann ich garnichts mit anfangen
    @seppj das geht nicht ^^, muss dem ja auch sagen wo der schalter in meine grafik ist O.o bevor ich ihn druecken kann....

    im guten und ganzen ^^ ich weiss nicht weiter.

    mfg ExEcUt!oNeR



  • Okay, ich hab nicht erwartet das das bei dir so heftig wird.

    Also vom Auftragsteller verdonnert.

    Hier schon mal ein Link zu jemand der ähnliche Probleme hatte:
    http://www.c-plusplus.net/forum/p1803436

    Da ist auch so ein spezieller Quelltext zu sehen.

    Hast du die Bibliothek schon so eingebunden das du farbige Figuren auf dem Bildschirm darstellen kannst?

    MfG f.-th.



  • Bestätige bitte ob das folgende Bibliothek ist:
    http://codecutter.org/tools/winbgim/

    Im Zweifel könnte es mehrere ähnliche Projekte geben.
    Wenn es ein Anderes ist, dann den Namen und eventuell ein Link zu dem Teil.

    MfG f.-th.



  • so hab mal geguckt, das ist die bibliothek die du da gelinkt hast.

    ja meine ampel hab ich soweit.

    hab ein grafikfenster was 150*500 ist und dann einen kasten mit linien gemacht und 3 farbige kreise drin wie ne ampel.
    unten habe ich noch einen kleinen kasten gemacht der mein knopf darstellen soll zum drauf druecken zum starten der ampel.

    vielen dank fuer deine hilfe 🙂 f.-th

    mfg ExEcUt!oNeR



  • Ist folgender Quelltextausschnitt so beabsichtigt?

    //Kreis 2 im Grafikfenster für Ampel
        midx = getmaxx() / 2 + 2;
        midy = getmaxy() / 6 + 145 ;
        setcolor(YELLOW); //+YELLOW+YELLOW+YELLOW); oder sollte das wie du es hattest
        setfillstyle(1, YELLOW); //255+200+0); oder sollte das wie du es hattest
        fillellipse(76, 228, 49, 49);
        circle(midx, midy, radius);
    

    Kommentar im Quelltext. Oder ist der Quelltext schon mit Leuchte an/aus?

    Nun hast du ja erst den Anfang. Wenn du das per Maus starten möchtest und die Leuchten leuten sollen oder nicht, fehlt noch ein wenig Quelltext.

    MfG f.-th.



  • Hier noch ein wenig Quelltext:

    // dunkelgrauer Knopf
        setfillstyle(1, DARKGRAY);
        bar( 40, 460, 120, 480 );
        while (!dgray_clicked)
        {
    		if (ismouseclick(WM_LBUTTONDOWN))
    		{
    	    	getmouseclick(WM_LBUTTONDOWN, x, y);
    	    	dgray_clicked = (getpixel(x, y) == DARKGRAY);
    		}
    	}
    
        cout << "The mouse was clicked at: ";
        cout << "x=" << mousex( );
        cout << " y=" << mousey( ) << endl;
    

    Keine Ahnung ob ihr etwas damit anfangen könnt.

    MfG f.-th.



  • also das mit den farben geht irgendwie nicht anderes, das eine ist der aeusser ring von dem kreis und das andere der innere ^^, ich koennte einen weg machen aber das kann ich dann noch machen.
    anfangs hatte ich probleme mit der farbe deswegen steht da yellow,yellow usw da es dann dunkler wuerde.
    danke werde das mal ausprobieren mit dem knopf 😃
    melde mich obs klappt riesen dank jedenfalls fuer deine muehen.

    mfg ExEcUt!oNeR



  • ja wenn ich drauf druecke aufm den knopf soll es wie ne ampel laufen, die haben sollen dann lightred oder sowas werden.
    gibt ja amplen da sieht man die farbe bisschen, wie gesagt kann ich aber noch rausnehmen. mein quelltext ist bis jetzt nur die grafik das ist das einzige was ich hinbekomme ;I die ganze funktionen bin ich noch garnicht zu gekommen.

    Bei einem Mausklick auf dem Knopf ('Knpofdruck') soll unten im Fenster der Text 'Signal kommt' erscheinen

    Die Ampel ist Standardmäßig grün

    Nach erfolgten Knopfdruck soll die Ampel nach einer zufälligen Zeit (1 bis 15 Sekunden) für drei Sekunden auf gelb, dann auf rot springen

    Nach einer halbminütigen Rotphase geht die Ampel für eine Sekunde in die Rot/Gelbphase, danach in die Grünphase

    Zu Beginn der Gelbphase wird der Text 'Signal kommt' wieder gelöscht

    so das kommt noch dazu ;/



  • Die Infos, die ich noch weggelassen hab bekommst du schon hin 😃

    Muss gestehen das ich zu bequem bin das mit den Farben zu testen - Borland konnte nur 16 Farben bei 640x480 serienmässig.
    Teste das Ersetzen der Farbentexte mal mit Zahlen zwischen 0 und 255 ( oder höher ? ).
    Kannst ja eine Farbtafel programmieren, wenn sehen möchtest was bei Farben geht.

    Viel Spass noch
    f.-th.



  • da hoert der spass schon wieder auf 😞

    hab deins jetzt mit drin kommt :`dgray_clicked' undeclared (first use this function)
    -.-

    hab wieder schon gesucht kann ich aber nichts wirklich mit anfangen. naja dann wollte ich deine box ausprobieren. nehm mein kaestchen raus und will deins benutzen ist deins gruen statt darkgray... Wenn ich, wo die anderen farben stehen, ne farbe wegneheme wird mein ganzer rand rot gelb oder gruen, wenn ich alles raus nehme ist alle auf einmal weiss.

    ich dachte ich hab wenigstens die farben hinbekommen -.- scheint aber auch nichts zu passen.

    will dich damit ja nicht nerven aber so macht das echt kein spass-.- :(((

    mfg ExEcUt!oNeR



  • So schwer ist das aber nicht, da steht doch, es fehlen:

    int x, y;        // x and y pixel coordinates of a mouse click
        bool dgray_clicked;// Changes to true when a darkgray pixel is clicked
    

    Wenn du mehrere gleichfarbige Felder hast, halt zusätzlich die Koordinaten abfragen und da ein paar nebeneinander gleichzeitig 😃 Denn ob man zuverlässig ein einzelnes Pixel trifft?

    Beim Darstellen einer Leuchte, überlege mal ob du das nicht in eine Funktion bekommst, dann wird der Quelltext übersichtlicher.

    MfG f.-th.



  • 😉 so einfach ist das nicht 😛

    woher weiss ich das ich bool hinschreiben muss? -.-

    naja also soweit klappt es dass er sich beschwert, aber ich hab noch das problem mit den farben.

    wenn ich das kaestchen nach unten schreiben nimmt es die farbe von der letzte ampelfarbe an, erst gruen wenn ich das wegnehme orange und dann rot, wenn ich alles raus nehme seh ich nichts mehr.

    wenn ich es nach oben setzte ueber die ampelfarben dann wird es nur weiss egal welche farbe ich reinschreiben, nichmal schwarz will das scheiss ding werden.

    dann habe ich ueberall WHITE rein geschrieben da das feld ja eh weiss ist, hat aber nichts gebracht. hab auch noch else hingeschrieben, weil ich wollte das er schreibt das ich vorbei gedrueckt haben, aber sobald ich das programm starte hat er gleich "daneben" gesagt 😞
    dir x und y habe ich werte im weissen kasten genommen das sollte ja auch so richtig sein. wenn ich den knopf druecke hab ich ja noch dazu geschrieben muesste "Signal kommt" kommen. das kommt aber auch nicht.
    hat aber alles kein erfolg.

    // dunkelgrauer Knopf
    bar( 110, 459, 140, 490 );
    setfillstyle(1, WHITE);
    while (!dgray_clicked);
    {
    if (ismouseclick(WM_LBUTTONDOWN)) <---glaube da darf kein ; stehen wie du es geschrieben hast ^^ dann hat er keine abfrage gemacht. (glaube ich)
    {
    getmouseclick(WM_LBUTTONDOWN, x, y);
    dgray_clicked = (getpixel(123, 474) == WHITE);
    outtextxy(10,467,"Signal kommt");
    }
    }

    was du da bei den farben meinst weis ich nicht so recht habe jetzt ueberall das midx und midy raus genommen das ist dann ja doppelt, wenn ich aber setcolor wegnehme bleibt um rand ein weisser kreis 😞 muss also bleiben.

    /* midx = getmaxx() / 2 + 2;
    midy = getmaxy() / 6 + 5; */
    setcolor(RED);
    setfillstyle(1, RED);
    fillellipse(76, 88, 50, 50);
    //circle(midx, midy, radius);

    -.- ist mir echt schon peinlich 😕

    mfg ExEcUt!oNeR



  • weis nicht ob es was zu sagen hat, aber da stimmt glaube noch mehr nicht...
    wenn ich das auf mein laptop ziehe und daran arbeiten will ist kein kreis mehr da. -.- selbst wenn ich das alles zurueck mache was ich raus ge/* habe.

    bloedes programm 😕

    mfg ExEcUt!oNeR



  • Hier mal der Farbtest:

    #include <cstdlib>
    #include <iostream>
    
    #include <graphics.h>
    
    using namespace std;
    
    void leuchte(int posv, int posh, int lcolor)
    {
    	int hpos;
    	hpos = 20 + posh * 20;
    //    setcolor(lcolor);
        setfillstyle(1, lcolor);
        fillellipse(posv, hpos, 9, 9);
    
    }
    
    int main(int argc, char *argv[])
    
    {
        int gdriver = DETECT, gmode, errorcode;
        int i, p;
        int x, y;        // x and y pixel coordinates of a mouse click
        bool dgray_clicked;// Changes to true when a red pixel is clicked
    
    //Grafikfenster grösse 150x500
        initwindow(150, 500);
    
    //Linien im Grafikfenster für die Ampel
        line(140, 10, getmaxx()-9, getmaxy()-50);
        line(9, 10, getmaxx()-140, getmaxy()-50);
        line(9, 10, getmaxx()-9, getmaxy()-489);
        line(9, 449, getmaxx()-9, getmaxy()-50);
        outtextxy(10,460,"Farbtest");
    
    //read result of initialization
        errorcode = graphresult();
        if (errorcode != grOk) //Wenn ein Fehler Auftritt
        {
            printf("Graphics error: %s\n", grapherrormsg(errorcode));
            printf("Press any key to halt:");
            getch();
            exit(1); //Mit einen Fehlercode beenden
        }
    
    	for(i = 0; i < 20; i++)
    		leuchte( 50, i, i);
    
    // dunkelgrauer Knopf
        setfillstyle(1, DARKGRAY);
    	bar( 120, 460, 140, 490 );
        while (!dgray_clicked)
        {
    		if (ismouseclick(WM_LBUTTONDOWN))
    		{
    	    	getmouseclick(WM_LBUTTONDOWN, x, y);
    	    	dgray_clicked = (getpixel(x, y) == DARKGRAY);
    		}
    	   }
    
    // um folgendes zu starten -> Maus auf grauen Button klicken und anschliessend
    // Taste der Tastatur drücken solange sich Farbe ändert.
    	for(p = 0; p < 8000; p++)
    	{
    		getch();
    		for(i = 0; i < 20; i++)
    			leuchte( 80, i, p * 16 + i); // -> eventuell andere Werte als 16 testen
    	}
    
    //Grafikfenster und Konsole schliessen
        getch();
        closegraph();
    //system("PAUSE");
        return EXIT_SUCCESS;
    }
    

    Bedienung im Quelltext beschrieben.

    Erst sieht es so aus als ob nur 16 Farben da wären.
    Wenn ihr aber nach dem Mausklick auf den grauen Button, entweder die Tastatur quält oder einfach den Finger auf der Taste parkt, seht ihr das noch andere Farben möglich sind. Nur die Logik hab ich ( noch ) nicht 🤡

    Warum das bei dir auf dem Laptop anders aussieht? Keine Ahnung.

    MfG f.-th.


Anmelden zum Antworten