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.