• Hey Guest! Ever feel like entering a Game Jam, but the time limit is always too much pressure? We get it... You lead a hectic life and dedicating 3 whole days to make a game just doesn't work for you! So, why not enter the GMC SLOW JAM? Take your time! Kick back and make your game over 4 months! Interested? Then just click here!

GML Drawing multiple lines within a certain area.

darijs1

Member
Basically, im trying to make very simple grass, from single lines (draw_line). The problem is, i have 1 piece of grass ready to go, but i want as many as an "ammount" variable would say.

To explain more simply and easy to understand, i have the draw event saying "draw_line(x,y,xx,yy)"
now how do i draw as many as i want without rewriting the code 50 times. each "draw_line" would have their own randomized position within a range (32 in this case.)

ive copy/pasted scripts that do something like this with "i += blablabla" but ive never done this myself and have no idea how to do it or what it means.

my appologies if i havent been very clear or do not know what im talking about.
 
J

JON213

Guest
I would do something like this to draw the grass 50 times
Code:
repeat(50)
{
draw_line(x,y,xx,yy);
}
 

darijs1

Member
I would do something like this to draw the grass 50 times
Code:
repeat(50)
{
draw_line(x,y,xx,yy);
}
I thought so too, but thats not what this is about (atleast i think). The problem is i want each drawn line to have their own unique random variable (x,y+random(32))
But i cant just do that because it would randomize each line every step.
 

Slyddar

Member
This will do what you want, but not sure if it's a good use of resources.
Code:
//create
for (var i = 0; i < 50; i++) {
  x1[i] = random(32);
  x2[i] = random(32);
  y1[i] = random(32);
  y2[i] = random(32);
}

//draw
for (var i = 0; i < 50; i++) draw_line(x1[i], y1[i], x2[i], y2[i]);
A better method might be something like this:
Code:
global.asset_layer = layer_create(-10000);     //create asset layer, choose your depth
var gridsize = 32,
    w = room_width/32,
    h = room_height/32,
    spr_id,
    spr = s_grass;
for (var i = 0; i < w; ++i) {
    for (var j = 0; j < h; ++j) {
        spr_id = layer_sprite_create(global.asset_layer, i * gridsize, j * gridsize, spr);
        layer_sprite_index(spr_id, irandom(sprite_get_number(spr)));
        layer_sprite_speed(spr_id, 0);
    }
}
 
Last edited:

darijs1

Member
This will do what you want, but not sure if it's a good use of resources.
Code:
//create
for (var i = 0; i < 50; i++) {
  x1[i] = random(32);
  x2[i] = random(32);
  y1[i] = random(32);
  y2[i] = random(32);
}

//draw
for (var i = 0; i < 50; i++) draw_line(x1[i], y1[i], x2[i], y2[i]);
A better method might be something like this:
Code:
global.asset_layer = layer_create(-10000);     //create asset layer, choose your depth
var gridsize = 32,
    w = room_width/32,
    h = room_height/32,
    spr_id,
    spr = s_grass;
for (var i = 0; i < w; ++i) {
    for (var j = 0; j < h; ++j) {
        spr_id = layer_sprite_create(global.asset_layer, i * gridsize, j * gridsize, spr);
        layer_sprite_index(spr_id, irandom(sprite_get_number(spr)));
        layer_sprite_speed(spr_id, 0);
    }
}
It is indeed a terrible tax on resources. i was more interested on how this was done.This seems to be what i was looking for. thanks for the help.
 

TheouAegis

Member
Don't use Studio2, so not sure how efficient sprite layers are. I know they're more "permanent" than surfaces and you wouldn't need to check each step if the layer got destroyed like you would with a surface, but sprite layers seem to me like they would have to maintain a list of every grass sprite drawn to them, which would be a massive list in large rooms. Using pre-rendered grass sprites is still a lot better than drawing 10,000 lines, though.
 
Top