How would I make text draw reverse?

Discussion in 'Programming' started by BMatjasic, Jun 23, 2016.

Tags:
  1. BMatjasic

    BMatjasic Member

    Joined:
    Jun 22, 2016
    Posts:
    77
    Hello guys,

    Recently I've been working on a chat system in which I came to a small problem. I've created a script named draw_lines in which I've added the following code:

    Code:
    var xx = argument0;
    var yy = argument1;
    var yyy = yy
    for(var i=0; i < ds_list_size(lines); i++) {
    
        var map = ds_list_find_value(lines, i);
        var pname = ds_map_find_value(map, "pname");
        var pcolor = ds_map_find_value(map, "pcolor");
        var text = ds_map_find_value(map, "text");
        var tcolor = ds_map_find_value(map, "tcolor");
            draw_set_halign(fa_left);
            draw_set_color(pcolor);
            draw_set_font(fnt_name);
            var str = string(pname) + " : ";
            draw_text(xx, yy - 24*i,str);
            draw_set_color(tcolor);
            draw_set_font(fnt_text);
            draw_text(xx + string_width(str)*1 , yy -  24*i,  text);
    
    }
    And this is the script in which I add line:

    Code:
    var pname = argument0;
    var pcolor = argument1;
    var text = argument2;
    var tcolor = argument3;
    
    var map = ds_map_create();
    
    ds_map_add(map, "pname", pname);
    ds_map_add(map, "pcolor", pcolor);
    ds_map_add(map, "text", text);
    ds_map_add(map, "tcolor", tcolor);
    
    ds_list_add(lines, map);
    So the text currently appears like this:

    [​IMG]

    How would I be able to make the first message appear at the bottom and the following messages up?

    Thanks in advance!

    PS: Great to be back on community again!
     
  2. Mishtiff

    Mishtiff Guest

    Hi friend,

    I am not entirely certain, but here is my thought:

    -change your for loop to the following-

    for(var i = ds_list_size(lines); i > -1; i--) {

    (Edited so you could only see my changes)

    Also: I believe in your wins/losses area in the picture: Looses should be Losses* :)
     
    Last edited by a moderator: Jun 23, 2016
    DaMuffin likes this.
  3. BLang

    BLang Member

    Joined:
    Jun 21, 2016
    Posts:
    109
    Yup, you just have to invert your loop. However, I have to point out that the solution Mishtiff posted is going to throw an error.

    What it should look like is:
    for (var i=ds_list_size(lines)-1; i>-1; i--)

    This is because ds_list_size returns the total amount of items in the list, but their actual indexes start from 0, which means that if there's, say, 50 items in the list, the index of the last item will actually be 49.
     
    DaMuffin likes this.
  4. Mishtiff

    Mishtiff Guest

    good catch BLang!
     
  5. BMatjasic

    BMatjasic Member

    Joined:
    Jun 22, 2016
    Posts:
    77
    Thank you for your help friends, but I must inform you that I've already tried that method and retried it now and it still doesn't work. :/ It seems completly logical to me, but somehow it still prints the last message at the top instead on the bottom. @Mishtiff thank you for noticing the grammar mistake :p
     
  6. rui.rosario

    rui.rosario Guest

    The mistake is that although you inverted the loop you still use i to set the y displacement, so even if you start at say index 20, it will still calculate to yy - 24*20 instead of yy - 24*0

    I would change the code to
    Code:
    var xx = argument0;
    var yy = argument1;
    var yyy = yy
    var size = ds_list_size(lines) - 1;
    for(var i = size; i >= 0 ; i--) {
    
        var map = ds_list_find_value(lines, i);
        var pname = ds_map_find_value(map, "pname");
        var pcolor = ds_map_find_value(map, "pcolor");
        var text = ds_map_find_value(map, "text");
        var tcolor = ds_map_find_value(map, "tcolor");
            draw_set_halign(fa_left);
            draw_set_color(pcolor);
            draw_set_font(fnt_name);
            var str = string(pname) + " : ";
            draw_text(xx, yy - 24*i,str);
            draw_set_color(tcolor);
            draw_set_font(fnt_text);
            draw_text(xx + string_width(str)*1 , yy -  24 * (size - i),  text);
    
    }
    As you can see, in the last line I adapt the y displacement to be in the inverse order. With this line of thought I believe you won't even need the reversed loop
     
    Last edited by a moderator: Jun 24, 2016
    BMatjasic likes this.
  7. Mishtiff

    Mishtiff Guest

    You are welcome BMatjasic! rui.rosario has your answer as well! I did not see your post until now that it was not working, but it would make sense that it prints in the same fashion, considering how your draw_text at the end is set up. I hope he solved your issue! :)
     
    BMatjasic likes this.
  8. BMatjasic

    BMatjasic Member

    Joined:
    Jun 22, 2016
    Posts:
    77
    By some strange reason I get text drawn over the second. Why is that so?

    http://prntscr.com/bkzzos

    I am running out of ideas :/
     
  9. Mishtiff

    Mishtiff Guest

    let me look over the code again and see what i can find

    EDIT: Can you repost the code at its current point please
     
  10. rui.rosario

    rui.rosario Guest

    Does it have newline characters? (Or in this case what GM acknowledges as a new line, the # character)

    If so you may need to adapt the code to the vertical size of the string

    EDIT: Something like:
    Code:
    var xx = argument0;
    var yy = argument1;
    var yyy = yy
    var size = ds_list_size(lines) - 1;
    for(var i = size; i >= 0 ; i--) {
    
        var map = ds_list_find_value(lines, i);
        var pname = ds_map_find_value(map, "pname");
        var pcolor = ds_map_find_value(map, "pcolor");
        var text = ds_map_find_value(map, "text");
        var tcolor = ds_map_find_value(map, "tcolor");
    
           // Use the yy variable to store the next position to draw in
           yy -= string_height(str) + 8; // The 8 here is for a little displacement
    
            draw_set_halign(fa_left);
            draw_set_color(pcolor);
            draw_set_font(fnt_name);
            var str = string(pname) + " : ";
    
            draw_text(xx, yy, str);
    
            draw_set_color(tcolor);
            draw_set_font(fnt_text);
            // Btw, why *1?
            draw_text(xx + string_width(str)*1 , yy,  text);
    }
    
     
  11. BMatjasic

    BMatjasic Member

    Joined:
    Jun 22, 2016
    Posts:
    77
    Guys I've fixed it! draw_clear_alpha solver the problem, so text doesn't remain in the same position. Works like a charm. Thanks for your time and help, I'll mark this post as solved.
     

Share This Page

  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice