Página 1 de 1
desenhar apenas 50 circulos
Enviado: Sex Jul 29, 2016 3:31 am
por JustJJ
Olá! me chamo JJ e estou começando a estudar gml no Game Maker Studio.
Eu peguei um exemplo e modifiquei para desenhar apenas 50 circulos, mas o programa continua desenhando vários círculos até preencher toda a tela.
aonde estou errando?
Events: Draw
Actions:
randomize();
draw_set_colour(c_green)
for(var yy = 0; yy < 50; yy += 1)
{
//Desenha pixel
draw_circle(random(256), random(192),random(30),true)
}
Re: desenhar apenas 50 circulos
Enviado: Sex Jul 29, 2016 8:13 am
por Rodrigo Santiago
o evento draw acontece 30 vezes por segundo ( ou 60 dependendo da room_speed ) . O random retorna um numero aleatório em todas as vezes que ele for executado. Dai então dá um efeito de 'desenhando feito maluco sem parar' . No mais, isso não preencheria a tela, talvez vc esteja criando muitos objetos com esse draw.
Re: desenhar apenas 50 circulos
Enviado: Sex Jul 29, 2016 10:41 am
por JustJJ
na verdade eu coloquei um objeto apenas. E tenho a impressão de que ele fica num loop eterno.
Parece que conta de 0 a 50 e volta a contagem com novos numeros aleatórios.
Eu achava que era como programar em Basic, C ou Pascal, pois neles o "for n =0 to 50" só se repetem quando inserimos um loop.
Aqui parece que o loop se dá automaticamente. :/
Re: desenhar apenas 50 circulos
Enviado: Sex Jul 29, 2016 11:03 am
por AxeInLine
E a culpa é disso aqui:
Rodrigo Santiago escreveu:o evento draw acontece 30 vezes por segundo ( ou 60 dependendo da room_speed ) .
Ou seja, toda vez que o draw for executado num segundo, o for também será executado, gerando assim a ideia de loop eterno.
Existem várias formas de contornar esse problema, dependendo do que tu queres, dava pra fazer assim:
No create, iniciar uma variável qualquer com o valor false;
E depois alterar o draw para isso:
Código: Selecionar todos
randomize();
draw_set_colour(c_green)
if (sua_var == false){
for(var yy = 0; yy < 50; yy += 1)
{
//Desenha pixel
draw_circle(random(256), random(192),random(30),true)
}
sua_var = true;
}
Claro que isso é só uma gambiarra, mas acho que já te dá uma ideia do que está acontecendo... Ou não...
Re: desenhar apenas 50 circulos
Enviado: Sex Jul 29, 2016 3:07 pm
por Rodrigo Santiago
JustJJ escreveu:na verdade eu coloquei um objeto apenas. E tenho a impressão de que ele fica num loop eterno.
Sim o game está em um loop eterno , é chamado de Game Loop, os eventos STEP, DRAW, ocorrem em loop ate o fim do objeto ou do jogo, os eventos KEYBOARD(sem ser pressed ou released), COLLISION ocorrem também em loop, mas, só enquanto o ato for verdadeiro. No mais VOCê PRECISA desse loop, nao pode desenhar so 1 vez ... pq ai vai durar apenas 1/30 segundos =|
Tente o seguinte :
CREATE
Código: Selecionar todos
lista_x = ds_list_create();
lista_y = ds_list_create();
lista_raio = ds_list_create();
for(var i = 0; i < 50 ; i += 1 ){
ds_list_add(lista_x, random(256)); //coloquei na lista o valor de x
ds_list_add(lista_y, random(192)); //coloquei na lista o valor de y
ds_list_add(lista_raio,random(30)); //coloquei na lista o valor do raio
}
DRAW
Código: Selecionar todos
var tx,ty,traio;
for(var i = 0; i < 50 ; i += 1){
tx = ds_list_find_value(lista_x,i);
ty = ds_list_find_value(lista_y,i);
traio = ds_list_find_value(lista_raio,i);
draw_circle(tx,ty,traio,true);
}
DESTROY
Código: Selecionar todos
ds_list_destroy(lista_x);
ds_list_destroy(lista_y);
ds_list_destroy(lista_raio);
A lista vai armazenar as posições geradas aleatoriamente, no draw vai desenhar elas ( tem q ser repetido mesmo, mas agora não vai ficar feito maluco ) , e no destroy vc tem q deletar as listas da memoria
Re: desenhar apenas 50 circulos
Enviado: Sex Jul 29, 2016 6:15 pm
por JustJJ
Na primeira tentativa:
obj_001
events: create
actions: paraloop = false;
events: draw
actions:
execute piece of code:
randomize();
draw_set_colour(c_green)
[size=100]if (paraloop == false);[/size]
{
for(var yy = 0; yy < 50; yy += 1)
{
//Desenha pixel
draw_circle(random(256), random(192),random(30),true)
}
}
[size=100]paraloop = true;
[/size]
Tentei de diversas formas, modificando linhas e continua no erro:
In Object object0, in Event DrawEvent action number 1 at line 6: malformed if statement
fui no help tentei reescrever o programa, mas não faço idéia de como corrigir esse erro XD.
Edit: Desde já agradeço pelo feedback de vocês:
Rodrigo Santiago
AxeInLine
Tentei de várias maneiras encontrar o erro na primeira listagem, mas sem êxito XD XD XD.
Tentando agora com a listagem sugerida pelo Rodrigo Santiago...
Re: desenhar apenas 50 circulos
Enviado: Sáb Jul 30, 2016 2:39 pm
por AxeInLine
O erro sugere que há algo mal feito no if, e nesse caso, algo bem simples, não pode haver aquele ponto e vírgula , então, na linha três do draw, só tirar o ponto e vírgula que deve funcionar.
Re: desenhar apenas 50 circulos
Enviado: Sáb Jul 30, 2016 7:43 pm
por JustJJ
XD XD XD
realmente não vi esse detalhe! Obrigado
AxeInLine, pela observação.
Agora foi.
Aprender Game Maker Studio está sendo interessante.
estou entendendo melhor a mecânica do Game Maker graças a ajuda de vocês.
Rodrigo Santiago :
Cara, achei sensacional esse comando de listagem.
Os números aleatórios ficam armazenados nas variáveis. desenhando os em loop vira praticamente um cenário.