For Schleifen Problem

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • For Schleifen Problem

    hy


    also wie der titel schon sagt geht es hier üm nen Code in einer For Schleife.

    ich lasse in einer For Schleife text drawen ünd collision rectangles machen. ünd wenn man aüf einen text klickt mit der maüs
    dann soll das rechteck gelb werden...das tüt es aüch.mein problem ist, das ich nicht weiß wie ich es machen kann das sobald ich
    ein anderen text anklicke das der dann wieder gelb wird ünd der andere wieder schwarz...aüsserhalb einer forschleife hab ichs
    geschafft jedoch hatte ich dadürch hünderte codezeilen ünd dürch die schleife hab ich sehr wenig zeilen gebraücht.

    deshalb hilfe .....

    hier mein code:

    GML-Quellcode

    1. for (i = 0;i < ds_list_size(files);i++;)
    2. {
    3. name[i] = ds_list_find_value(files,i); // findet alle werte der liste ünd speichert sie in einem array
    4. savename[i]= string_copy(name[i],0,string_length(name[i])-18); // hier lasse ich den namen kopieren ünd kürzen ünd speichere es wieder in einem array
    5. draw_text(x+120,y+30*i+245,savename[i]); // zeichnet den text
    6. draw_rectangle(x+118,y+260+30*i,x+730,y+230+30*i,true); // zeichnet ein rechteck üm den text
    7. collision[i]=rectangle_in_rectangle(mouse_x-50,mouse_y-4,mouse_x+50,mouse_y+8,x+118,y+260+30*i,x+730,y+230+30*i); // collisions abfragen
    8. if (ds_list_find_value(files,i)!= undefined )&& (collision[i])&& mouse_check_button_pressed(mb_left) // ünd hier spielt die müsik..hier schaüe ich ob eine kollision gibt wenn ich die maüstaste drücke
    9. {
    10. colorinline[i] = c_yellow; // soll die farbe gelb werden
    11. }
    Alles anzeigen


    aber wie kann ichs jetzt machen das wenn eine andere kollision entsteht das dann dort die farbe gelb ist ünd die vorige schwarz.


    für das bessere verständniss vorher hatte ich es so bevor ich die schleife benützte ünd das 14 mal

    GML-Quellcode

    1. if (ds_list_find_value(files,14)!= undefined)&& (collision[14])&& mouse_check_button(mb_left)
    2. {
    3. colorinline[14]= c_yellow;
    4. for (i = 15;i < ds_list_size(files);i++)
    5. {
    6. colorinline[i]= c_black;
    7. }
    8. for (s = 0;s < 14;s++)
    9. {
    10. colorinline[s]= c_black;
    11. }
    12. }
    Alles anzeigen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von acidrain833 ()

  • Hallo acidrain833,

    ​hast du's schon mal so probiert:

    GML-Quellcode

    1. for (i = 0;i < ds_list_size(files);i++;)
    2. {
    3. name[i] = ds_list_find_value(files,i); // findet alle werte der liste ünd speichert sie in einem array
    4. savename[i]= string_copy(name[i],0,string_length(name[i])-18); // hier lasse ich den namen kopieren ünd kürzen ünd speichere es wieder in einem array
    5. draw_text(x+120,y+30*i+245,savename[i]); // zeichnet den text
    6. draw_rectangle(x+118,y+260+30*i,x+730,y+230+30*i,true); // zeichnet ein rechteck üm den text
    7. collision[i]=rectangle_in_rectangle(mouse_x-50,mouse_y-4,mouse_x+50,mouse_y+8,x+118,y+260+30*i,x+730,y+230+30*i); // collisions abfragen
    8. if (ds_list_find_value(files,i)!= undefined )&& (collision[i])&& mouse_check_button_pressed(mb_left) // ünd hier spielt die müsik..hier schaüe ich ob eine kollision gibt wenn ich die maüstaste drücke
    9. {
    10. if( i != 0)
    11. {
    12. for(k = 0; k <= i; k++)
    13. ​ {
    14. colorinline[k] = c_black;
    15. ​ }
    16. ​}
    17. colorinline[i] = c_yellow; // soll die farbe gelb werden
    18. }
    19. }
    Alles anzeigen


    ​Nicht getestet und sicherlich auch nicht sehr performant.

    ​Mal sehen ob mir noch eine andere Lösung einfällt.
  • leider fünkt das nicht ..also teilweise schon aber am besten siehst dü selber hier ein video







    PS: habs jetzt so gemacht

    GML-Quellcode

    1. if (i != 0)
    2. {
    3. for(k = 0;k < i;k++)
    4. {
    5. colorinline[k] = c_black;
    6. }
    7. for(k = 14;k > i;k--)
    8. {
    9. colorinline[k] = c_black;
    10. }
    11. }
    Alles anzeigen


    ünd es geht schon sehr güt...es ist nür mehr beim allersten das problem das es bleibt.also beim text ganz oben bleibt die farbe immer gelb

    hier ein video davon



    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von acidrain833 ()

  • Dein Konzept ist ungünstig. ;)

    So kann es gehen:

    Create-Event:

    GML-Quellcode

    1. vec_x1 = 0; vec_y1 = 0; vec_x2 = 0; vec_y2 = 0;
    2. save_count = -1; //Speichert den Zählerstand bei Kollision
    3. colorinline = c_black;


    Draw-Event:

    GML-Quellcode

    1. for (i = 0;i < ds_list_size(files);i++;)
    2. {
    3. name[i] = ds_list_find_value(files,i); // findet alle werte der liste ünd speichert sie in einem array
    4. //savename[i]= string_copy(name[i],0,string_length(name[i])-18); // hier lasse ich den namen kopieren ünd kürzen ünd speichere es wieder in einem array
    5. vec_x1 = x+118; vec_y1 = y+260+30*i;
    6. vec_x2 = x+730; vec_y2 = y+230+30*i;
    7. draw_set_colour(c_black);
    8. draw_rectangle(vec_x1, vec_y1, vec_x2, vec_y2, true); // zeichnet ein rechteck üm den text
    9. collision[i]=rectangle_in_rectangle(mouse_x-50,mouse_y-4,mouse_x+50,mouse_y+8,x+118,y+260+30*i,x+730,y+230+30*i); // collisions abfragen
    10. if (name[i] != undefined )&& (collision[i])&& mouse_check_button_pressed(mb_left) // ünd hier spielt die müsik..hier schaüe ich ob eine kollision gibt wenn ich die maüstaste drücke
    11. {
    12. save_count = i;
    13. }
    14. if( i != save_count )
    15. {
    16. colorinline = c_black;
    17. }
    18. else
    19. {
    20. colorinline = c_yellow;
    21. }
    22. draw_set_colour(colorinline);
    23. draw_text(x+120,y+30*i+245,name[i]); // zeichnet den text
    24. }
    Alles anzeigen


    Wozu muss den "colorinline" ein Array sein ?

    Das ist hierbei nicht sinnvoll.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Weihnachtswichtel ()

  • Er meinte, dass es ungünstig ist ein Array, das speichert wo du geklickt hast, wo du dann noch bei jedem selektieren mit einer Schleife komplett durchgehst, da du einer Variable den angeklickten index geben kannst. Diese Variable enthält dann nur einen und den Richtigen.
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
  • ​doch das colorinline benütze ich noch wo anders deshabl ein array..wieso ist mein konzept üngünstig.hab doch alles richtig gemacht oder?
    ünd hab mich ja aüch verbessert oder nicht?


    ​Verbessert: von 100% (so wie's war) auf 199% (und hier fehlt dir noch der eine Prozent) gut. (200% ist gelöst) ;)
    Du hast es ja schon fast gelöst!

    Du kannst es jetzt so:

    GML-Quellcode

    1. for (i = 0;i < ds_list_size(files);i++;)
    2. {
    3. name[i] = ds_list_find_value(files,i); // findet alle werte der liste ünd speichert sie in einem array
    4. savename[i] = string_copy(name[i],0,string_length(name[i])-18); // hier lasse ich den namen kopieren ünd kürzen ünd speichere es wieder in einem array
    5. vec_x1 = x+118; vec_y1 = y+260+30*i;
    6. vec_x2 = x+730; vec_y2 = y+230+30*i;
    7. colorinline[i] = c_black;
    8. draw_set_colour(colorinline[i]); //Der Rahmen muss hierbei vor der Kollisionsprüfung gezeichnet werden und der Text dannach.
    9. draw_rectangle(vec_x1, vec_y1, vec_x2, vec_y2, true); // zeichnet ein rechteck üm den text
    10. collision[i]=rectangle_in_rectangle(mouse_x-50,mouse_y-4,mouse_x+50,mouse_y+8,x+118,y+260+30*i,x+730,y+230+30*i); // collisions abfragen
    11. if (name[i] != undefined )&& (collision[i])&& mouse_check_button_pressed(mb_left) // ünd hier spielt die müsik..hier schaüe ich ob eine kollision gibt wenn ich die maüstaste drücke
    12. {
    13. save_count = i;
    14. }
    15. if( i != save_count )
    16. {
    17. colorinline[i] = c_black;
    18. }
    19. else
    20. {
    21. colorinline[i] = c_yellow;
    22. }
    23. draw_set_colour(colorinline[i]); //Der Text muss jetzt mit der jeweiligen Zeichenfarbe gezeichnet werden.
    24. draw_text(x+120,y+30*i+245,savename[i]); // zeichnet den text
    25. }
    Alles anzeigen


    ​oder so (fast wie bei dir):

    GML-Quellcode

    1. for (i = 0;i < ds_list_size(files);i++;)
    2. {
    3. name[i] = ds_list_find_value(files,i); // findet alle werte der liste ünd speichert sie in einem array
    4. savename[i] = string_copy(name[i],0,string_length(name[i])-18); // hier lasse ich den namen kopieren ünd kürzen ünd speichere es wieder in einem array
    5. draw_text(x+120,y+30*i+245,y+230+30*i); // zeichnet den text
    6. draw_rectangle(x+118, y+260+30*i, x+730, vec_y2, true); // zeichnet ein rechteck üm den text
    7. collision[i]=rectangle_in_rectangle(mouse_x-50,mouse_y-4,mouse_x+50,mouse_y+8,x+118,y+260+30*i,x+730,y+230+30*i); // collisions abfragen
    8. if (name[i] != undefined )&& (collision[i])&& mouse_check_button_pressed(mb_left) // ünd hier spielt die müsik..hier schaüe ich ob eine kollision gibt wenn ich die maüstaste drücke
    9. {
    10. for(k = 0;k < i;k++)
    11. {
    12. colorinline[k] = c_black;
    13. }
    14. for(k = 14;k > i;k--)
    15. {
    16. colorinline[k] = c_black;
    17. }
    18. colorinline[i] = c_yellow;
    19. }
    20. }
    Alles anzeigen

    machen.

    Du musst das: if (i != 0)
    weglassen, sonst bekommt du beim 1. (Index 0) Eintrag Probleme. (Gelb-Bleibt-Effekt)

    ​Hier: if (ds_list_find_value(files,i) != undefined )&& (collision)&& mouse_check_button_pressed(mb_left)

    ​kannst du auch: if (name[i] != undefined )&& (collision[i])&& mouse_check_button_pressed(mb_left)

    ​schreiben (wie du vielleicht schon bemerkt hast), weil das ist ja schon dasselbe: name[i] = ds_list_find_value(files,i);

    ​-> Aber weitere For-Schleifen in einer For-Schleife sind eben nicht so performant.
  • ok ünd gleich das nächste wo ich schon seit stünden hänge...

    ich weiß jetzt nicht wie ich es machen soll das man das game laden kann.

    ich dachte züerst daran:

    GML-Quellcode

    1. if (colbutton)&& mouse_check_button_pressed(mb_left)&& (collision[0]) // colbütton ist ein rectangle_in_rectangle für den lade bütton
    2. {
    3. name = ds_list_find_value(files,0);
    4. game_load(name);
    5. }


    aber leider geht das nicht...ja ich habs natürlich aüch in der for schleife probiert.
    achja das wollt ich noch sagen irgendwie klappt das mit save_coünt nicht .
    hab gedacht das ich vielleicht damit das laden erleichtere aber dann hab ich
    bemerkt das es garnicht fünktioniert.aber egal das problem damit ist ja schon
    gelöst.jetzt ist nür das laden wichtig.

    das problem ist das collision[0] üsw ja nür trüe ist wenn man mit der maüs darüber ist ünd klickt ansonsten ist es false.
    wie kann ich das ümgehen.könnte mir jemand helfen

    sorry ich war die ganze nacht aüf ünd hab programmiert..bin deshalb wahrscheinlich nicht münter genüg üm es selbst zü finden.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von acidrain833 ()

  • OK PROBLEM GELÖST:

    mein neües problem ist das er wenn man das spiel ladet also ein savegame das er züerst wieder in das menü geht wo man gespeichert hat ünd dann müss man aüf zürück klicken ünd dann aüf fortsetzen üm bei dem speicherstand weiter zü spielen.wie kann ich das ümgehen?also das er gleich wieder ins spiel geht




    EDIT:

    problem gelöst ...er hat erst gespeichert wenn man den namen eingegeben hat deshalb ging er beim laden des spielstandes wieder dorthin.
    jetzt musste ich direkt wenn man auf ESCAPE gedrückt hat speichern dann diese datei umbennen zu der eingegebenen eingabe.....lol
    jetzt funktioniert es super.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von acidrain833 ()