Tilesets aleatórios

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

Tilesets aleatórios

Mensagem por Markituh em Qui 09 Jun 2011, 10:08

Olá! Estou desenvolvendo um projeto, e gostaria de saber como eu posso criar tilesets aleatórios surgirem na view! Aliás, na room, já que já deu para ter a idéia de que é um jogo infinito. Bom, não são bem tilesets, são terrenos acidentados. Eu havia pensado num método que poderia dar certo:
Código:
Desenho os tipos de terreno num background e uso draw_sprite_part juntamente com um irandom ou choose
Mas gostaria de outras opniões.

___________

"Não deixe para amanhã o que se pode fazer hoje"

Links úteis:
Índice de Tutoriais
Manual online do GMS

Markituh

Ranking : Sem avaliações
Número de Mensagens : 2183
Data de inscrição : 11/10/2009
Reputação : 106
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Tilesets aleatórios

Mensagem por saim em Sex 10 Jun 2011, 11:59

Markituh, a quanto tempo!
Sua idéia é boa, mas eu gostaria de entender melhor do que se trata a dúvida. O jogo é infinito ou a fase é infinita? Tipo, o background fica fixo ou tem uma movimentação infinita?

Acho que você sabe como criar uma background a partir de uma surface, não sabe? Se for coisa fixa, eu sugiro fazer isso: crie a surface, mande partes aleatórias de backgrounds pra lugares não-aleatórios (de forma a preencher toda a surface), crie a bg e mande ela pra room. Se for infinito, faça a mesma coisa, mas numa surface grande o suficiente para que o jogador não perceba que você usou o tiled background.

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: Tilesets aleatórios

Mensagem por Markituh em Qua 15 Jun 2011, 12:31

Opa, sim, foi muito tempo! Esperava que não entendesse, então vamos por partes, como diria Jack O Estripador:

Eu tenho um jogo infinito sabe, não acaba até que você perca o objetivo dado(morrer ou algo do tipo). Eu queria que viessem obstáculos do lado direito da fase para o player ultrapassá-los. Mudei minha idéia quanto a um terreno acidentado, seria muito complicado, acho que vou com tiles retos mesmo. O que eu queria saber é um terreno acidentado, mas como desisti e sei muito bem fazer com objetos, acho que este tópico se tornou inútil.

PORÉM, ele não se tornou de verdade. Seria possível eu manter os tiles proporcionais? Algo como criar conexões entre os tiles? É porque ficaria algo muito estranho eu ter um bloqueio de 10 cm e depois vir um de 2 metros. Espero que tenha entendido agora o que quero. E se possível, responda com urgência, é para o concurso quinzenal.

___________

"Não deixe para amanhã o que se pode fazer hoje"

Links úteis:
Índice de Tutoriais
Manual online do GMS

Markituh

Ranking : Sem avaliações
Número de Mensagens : 2183
Data de inscrição : 11/10/2009
Reputação : 106
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Tilesets aleatórios

Mensagem por saim em Qua 15 Jun 2011, 17:05

Faça o obstáculo depender do anterior, variando dentro de uma range.
Código:
NovoTamanho=median(TamanhoMinimo, TamanhoMaximo, Tamanho+random(2*variacao)-variacao)

PS: minha entrada também é um jogo infinito Smile mas não tem nada a ver com esse seu

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: Tilesets aleatórios

Mensagem por Markituh em Qua 15 Jun 2011, 17:47

Hmmm... Usando o median, eu teria que checar o valor real que ele retornou e criar um objeto de acordo com isso, certo? Vou testar seguindo esse esquema

___________

"Não deixe para amanhã o que se pode fazer hoje"

Links úteis:
Índice de Tutoriais
Manual online do GMS

Markituh

Ranking : Sem avaliações
Número de Mensagens : 2183
Data de inscrição : 11/10/2009
Reputação : 106
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Tilesets aleatórios

Mensagem por saim em Qui 16 Jun 2011, 01:00

É. não precisa do median pra isso, o median é só pra limitar os valores. Claro que você vai ter que atualizar o valor de "Tamanho", depois (provavelmente pode substituir "NovoTamanho", no código, por "Tamanho", de uma vez).

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: Tilesets aleatórios

Mensagem por Markituh em Qui 16 Jun 2011, 19:08

Hmmm... Perdão minha ingenuidade mas, poderia fazer um exemplo disso? Não consegui captar muito bem o esquema

___________

"Não deixe para amanhã o que se pode fazer hoje"

Links úteis:
Índice de Tutoriais
Manual online do GMS

Markituh

Ranking : Sem avaliações
Número de Mensagens : 2183
Data de inscrição : 11/10/2009
Reputação : 106
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Tilesets aleatórios

Mensagem por saim em Qui 16 Jun 2011, 21:27

eu ainda não tenho certeza se entendi o que você está fazendo, mas vou te fazer um exemplo a partir do seguinte pré-suposto: você tem um objeto de um pixel de altura e quer criar colunas formadas pro alturas desse objeto não muito diferentes umas das outras. O código abaixo é pra algum controller.

create:
Código:
tamanho=room_height/2
varia=30
alarm[0]=room_speed
alarm[0]:
Código:
var i;
for(i=0; i<tamanho;i+=1){
  instance_create(room_width, room_height-i, obj_wall) //cira as instâncias até na altura do tamanho
  }
tamanho=median(0, room_height, tamanho+random(2*varia)-varia) //atualiza o tamanho pra próxima coluna
alarm[0]=room_speed


Última edição por saim em Sex 17 Jun 2011, 09:34, editado 1 vez(es)

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: Tilesets aleatórios

Mensagem por Mr.Brum em Sex 17 Jun 2011, 08:35

cara... dá ua olhada no meu jogo RALLY e ver se é o que vc tá procurando, se for posso te mandar a engine...


flws..

Mr.Brum

Ranking : Nota C
Número de Mensagens : 913
Idade : 25
Data de inscrição : 28/04/2011
Notas recebidas : D + D + C + C + D + B
Reputação : 41
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 0

http://mrbrumgames.blogspot.com/

Voltar ao Topo Ir em baixo

Re: Tilesets aleatórios

Mensagem por Markituh em Qua 22 Jun 2011, 11:05

Nem deu tempo de entregar o jogo xD Mas assim, o objeto é criado várias vezes até chegar ao tamanho. Isso não gera lag? Acho que isso foi para fazer com que apareça um detalhe abaixo para não ficar vazio, mas acho que posso fazer isso com o Draw.

___________

"Não deixe para amanhã o que se pode fazer hoje"

Links úteis:
Índice de Tutoriais
Manual online do GMS

Markituh

Ranking : Sem avaliações
Número de Mensagens : 2183
Data de inscrição : 11/10/2009
Reputação : 106
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Tilesets aleatórios

Mensagem por Mr.Brum em Qua 22 Jun 2011, 11:45

Mas assim, o objeto é criado várias vezes até chegar ao tamanho. Isso não gera lag?

para não acontecer isso, não deixe o código "solto" em eventos repetitivos(step,draw) .

Mr.Brum

Ranking : Nota C
Número de Mensagens : 913
Idade : 25
Data de inscrição : 28/04/2011
Notas recebidas : D + D + C + C + D + B
Reputação : 41
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 0

http://mrbrumgames.blogspot.com/

Voltar ao Topo Ir em baixo

Re: Tilesets aleatórios

Mensagem por saim em Qua 22 Jun 2011, 12:07

off-topic:
Markituh escreveu:Nem deu tempo de entregar o jogo
Pena. Lembro que eu entri na comunidade pra poder participar de um concurso. Foi graças a você (você tinha uma dúvida e postou na outra comunidade, tals). Até hoje não te vi em nenhum concurso!
markituh escreveu:Mas assim, o objeto é criado várias vezes até chegar ao tamanho. Isso não gera lag? Acho que isso foi para fazer com que apareça um detalhe abaixo para não ficar vazio, mas acho que posso fazer isso com o Draw.
Depende. Se for um pixel só, de altura, até pode gerar, mas por causa da quantidade de objetos na tela, não pelo código que os cria (loops são bem rápidos, precisa de uma quantidade imensa de iterações pra começar a ter lag).
Agora, realmente eu entendi que você precisava de uma coluna sólida da parte de baixo da tela até o topo. Se não for o caso, é fácil adaptar o código pra criar só uma instância (quem sabe, até mudar o image_yscale dela e manter a coluna sólida com um objeto só).

Edit: Ah, e como disse o mrbrum22, o código está num alarm.

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: Tilesets aleatórios

Mensagem por Markituh em Qua 22 Jun 2011, 13:15

Hmmm... As vezes a primeira parede é mais alta que o player, aí fica lolz. Na verdade, eu queria fazer espécies de pisos que vem aparecendo, mas é claro que eles não percam a proporção entre si, que é como eu já disse antes: aparecer um piso de 2 cm e depois um de 2 metros.

Usar o image_yscale seria interessante, mas a imagem ficaria esticada - o que obviamente não fica nada legal - e o valor tinha que ser decimal, pois um yscale equivale à altura da sprite. Para ser mais exato, o que eu quero é isso:

O cenário está em movimento, se o player colidir com o piso vermelho na direita (seja no pé, mão, braço etc) o jogo acaba - nessa parte seria legal colocar uma animação de tombo, e para isso, os pisos teriam que ter larguras iguais a do player, evitando certos bugs de colisão. O único jeito de usar yscale sem esticar seria a imagem ser totalmente limpa no preenchimento, ou seja, ser totalmente vermelha, sem detalhes adicionais(que é a que eu tenho). Nesse modo, a base da sprite seria a room_height, e o tamanho seria definido como a room_height menos a variável tamanho e jogar esse resultado no yscale, estou certo?
Código:
with(instance_create(room_width, room_height-32, obj_wall)) {
image_yscale = other.tamanho
  }
tamanho=median(0, room_height, tamanho+random(2*varia)-varia) //atualiza o tamanho pra próxima coluna
alarm[1]=room_speed
Acho que não, o yscale altera digamos, o tamanho por dentro da sprite. A nossa única solução agora seria usar draw_sprite_stretched, então vamos alterar o Alarm para isso
Código:
instance_create(room_width, room_height-30, obj_wall)
tamanho=median(0, room_height, tamanho+random(2*varia)-varia) //atualiza o tamanho pra próxima coluna
alarm[1]=14 // Para ficarem juntos um do outro
Draw do obj_wall
Código:
draw_sprite_stretched(sprite_index,0,x,room_height-30-obj_player.tamanho,sprite_width,obj_player.tamanho)
Porém isso está alterando todas as instâncias. O que eu faço? Bom, como isso está no Draw e ele é executado o tempo todo, é óbvio que todas vão alterar. O que fazer? Salvar o tamanho numa variável local do obj_wall, que pode ser do mesmo nome(afinal, são variáveis locais). O alarm então ficaria assim
Código:
with(instance_create(room_width, room_height-30, obj_wall))
{
tamanho = other.tamanho
}
tamanho=median(0, room_height, tamanho+random(2*varia)-varia) //atualiza o tamanho pra próxima coluna
alarm[1]=14
É claro, definir antes no Create do obj_wall
Código:
tamanho = 0
E o Draw do obj_wall, apenas tiro o "obj_player." e deixo apenas "tamanho".

Só falta alguns ajustes, como por exemplo, aumentar um pouco a largura da sprite (está muito pequeno, o player morreria facilmente) e fazer ele pisar no obj_wall - outra coisa que pergunto se poderia me ajudar a resolver, estou com bugs horríveis de colisão. Não dá para ver (óbvio, pois não foi o ponto), mas o player fica travando ao andar no piso cinza, não sei porque. Está tudo nos conformes, Solid marcado e colisão com o objeto:
Código:
vspeed = 0
reached_the_jump = 0 // Uma variável (isso aqui limita os pulos)
Talvez a falta de move_contact_solid você diga, mas já tentei isso e não deu certo. Poderia me ajudar? Obrigado.

___________

"Não deixe para amanhã o que se pode fazer hoje"

Links úteis:
Índice de Tutoriais
Manual online do GMS

Markituh

Ranking : Sem avaliações
Número de Mensagens : 2183
Data de inscrição : 11/10/2009
Reputação : 106
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Tilesets aleatórios

Mensagem por saim em Qua 22 Jun 2011, 13:54

Antes de qualquer coisa: do jeito que está, o objeto é criado sempre no mesmo ponto. Mude o segundo argumento do instance_create pra "room_height-tamanho".
Outra coisa: se você define o "tamanho" do obj_wall no "with instance_create", não precisa definir no create. Não tem problema definir, só não precisa.

Ok, agora às dúvidas: daqui, eu não consigo ver as imagens, então vou tentar adivinhar o que rolou até a hora que eu chegar em casa, tá bom?

É perfeitamente possível usar o image_yscale. E fica muito mais fácil se você definir um sprite liso, como máscara, com origem no topo. Daí, no draw, você coloca o sprite que quiser, sem ter que esticar nada. Só tenha um pouco de cuidado no caso de sprites animados (o número de imagens igual facilita um bocado). Pro tamanho da sprite chegar até a base da tela, basta aplicar escala e geometria. Digamos que a altura da sprite seja "a" e a distância do topo dela até a base da tela seja "b" (ou tamanho, no caso): "image_yscale=b/a"
ou, em outras palavras:
Código:
image_yscale=sprite_get_height(sprite_get_mask(id))/tamanho

Com relação à colisão, eu NUNCA aprendi a usar move_contact de maneira satisfatória. Sabe o que eu fiz? Ao invés de tentar e tentar, resolvi criar meu próprio sistema de colisão. Só que eu acabo fazendo um pra cada jogo. Basicamente, eu checo se há colisão na próxima posição antes de me mover. Em caso positivo, entro num loop que dura até o valor da velocidade, checando por colisão pixel-a-pixel e me movo em todos os pixels em que não há colisão. Depois, zero a velocidade e gravidade, como em qualquer plataforma. Ah, isso não funciona se você usar as built-ins, tá?

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: Tilesets aleatórios

Mensagem por Mr.Brum em Qua 22 Jun 2011, 14:19

me parece que vcs estão querendo fazer um sistema de colisão com tiles...
Geralmente eu faço o seguinte:

Antes de me mover, eu checo se há um tile na minha frente:
Código:
if !tile_layer_find()...

nunca testei em plataformas, mas nos meus jogos isométricos(que é muito mais difícil de fazer esse sistema de colisão)sempre funcionou.

O segredo é vc separar os tiles que vão ser colisivos em um único layer...
Outra coisa, é atenção no layer usado, para que eles não "tampem" o player.Use um layer maior que o depht do player.

Spoiler:
Tava fazendo um jogo, com mapas muito grande, e detalhados,e isso caía como uma luva pra não causar leg.

Mr.Brum

Ranking : Nota C
Número de Mensagens : 913
Idade : 25
Data de inscrição : 28/04/2011
Notas recebidas : D + D + C + C + D + B
Reputação : 41
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 0

http://mrbrumgames.blogspot.com/

Voltar ao Topo Ir em baixo

Re: Tilesets aleatórios

Mensagem por Markituh em Qua 22 Jun 2011, 14:28

Bom, quanto ao segundo argumento do instance_create, eu deixei room_height-30 pois a base da parede é no piso cinza (onde o player pisa antes de aparecer as paredes). Mas acho que não faz diferença definir o segundo argumento, já que o sprite_stretched já realiza tal. Quanto ao image_yscale, vou tentar algo do tipo. Mas ainda assim eu tenho de definir a Y como a base(piso cinza) menos o tamanho. Ficaria assim:
Código:
y = room_height-30-tamanho
image_yscale=sprite_get_height(sprite_get_mask(id))/tamanho
O desgosto é que o Game Maker avisa que a função sprite_get_mask não existe. Mas, eu posso fazer um script que faz isso.
Código:
/*****************************
* Script sprite_get_mask(id)
*****************************/
var mask,_id;
_id = argument0;
mask = _id.mask_index;
return mask;

___________________________________________
ERROR in
action number 1
of Draw Event
for object obj_wall:

Error in code at line 2:
image_yscale=sprite_get_height(sprite_get_mask(id))/tamanho
^
at position 54: Division by 0.
Mas se tamanho for 0? E 0 vindo do obj_player, não do Create do obj_wall. Então eu teria de fazer um IF para checar se tamanho é igual a zero, e se for, considerar o tamanho como 1, correto? Bom, parece dar certo, porém continuo a ter problema: o room_height-30-tamanho não resolve, e se eu substituir tamanho por image_yscale é o mesmo que nada - a imagem cresce para baixo, e as vezes, aparece aquele detalhe de sprite esticada (o contorno preto fica grosso).

O que seria viável fazer é considerar a altura da sprite como a altura total que ela pode atingir, certo? E também voltar a considerar room_height-30-tamanho. Eu estava errado, dessa vez ficou MUITO PIOR. Aparece traços pretos mais grossos ainda! Não acha que é melhor usar draw_sprite_streched não? Aguardo resposta

Sobre a colisão, parece fazer sentido, já que o sistema de colisão em linguagens como C, C#, C++ etc são feitas manualmente, passo a passo. Lembro-me que um membro postou um tópico perguntando como fazer isso em C++, talvez possa me ajudar. Mas a lógica seria eu usar colision_line para checar colisões com o solo abaixo do player, e se não estiver colidindo, acrescentar a Y, se estiver, deixar a Y igual a Y (parando). Estou certo? Vou tentar aqui

@Mrbrum Olá! Lembro-me de ter visto esse tipo de esquema numa engine do Jiraya, é muito interessante, mas não é uma colisão de tiles que quero fazer, já que é impossível fazer tiles se moverem. Obrigado pela participação, se quiser ajudar com algo, leia minhas mensagens anteriores e as do saim para ver se consegue entender.

___________

"Não deixe para amanhã o que se pode fazer hoje"

Links úteis:
Índice de Tutoriais
Manual online do GMS

Markituh

Ranking : Sem avaliações
Número de Mensagens : 2183
Data de inscrição : 11/10/2009
Reputação : 106
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Tilesets aleatórios

Mensagem por saim em Qua 22 Jun 2011, 14:58

Os dois erros foram causados por enganos meus, Markituh.
Primeiro, a função é "object_get_mask", não "sprite_get_mask", que realmente não existe.
Segundo, eu inverti a ordem dos fatores. O image_yscale deveria ser "tamanho/sprite_get_height(objet_get_mask(id))". Corre o risco do resultado ser 0 e a mask do sprite não ser desenhada, dando negativo em checagens de colisão. Pra resolver, proíba o tamanho de ser 0.
Na hora de definir o tamanho, coloque "median(30, room_height, tamanho-variacao+random(2*variacao))". Isso também te elimina o stress de ter que colocar o "-30" no instance_create (nossa, que alívio imenso, né?).

draw_sprite_stretched não muda o tamanho da mask. Você continua com uma mask do tamanho original do sprite, só o desenho fica esticado, o que te permitiria passar por baixo dos objetos sem detectar colisão. Já usar image_yscale e colocar qualquer coisa no draw event te faz ver um sprite sem escala nenhuma e ainda colidir ao passar por baixo dele.

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: Tilesets aleatórios

Mensagem por Markituh em Qua 22 Jun 2011, 15:16

Hmmm... Já está podendo ver imagens? Espero que sim, pois precisas ver isso:

Não sei como descrever isso, mas vamos lá: A sprite fica acima do programado com "Motion Blurs" pretos abaixo e acima dela. Ficou pior que antes >.< Desculpe ficar te enchendo o saco, mas afinal dúvidas são dúvidas não são? Happy

___________

"Não deixe para amanhã o que se pode fazer hoje"

Links úteis:
Índice de Tutoriais
Manual online do GMS

Markituh

Ranking : Sem avaliações
Número de Mensagens : 2183
Data de inscrição : 11/10/2009
Reputação : 106
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Tilesets aleatórios

Mensagem por saim em Qua 22 Jun 2011, 15:59

Ainda não posso... deixa eu garantir algumas coisas enquanto isso:
- a origem do sprite está no topo dele?
- você está usando um sprite retangular, chapado?
- você está usando um sprite pra mask e outro pra aparecer na tela?
- pro sprite aparecer na tela, você está usando a função "draw_sprite"?

A resposta pra todas as perguntas deveria ser "sim". Se for, realmente temos um problema. Se não, faça com que seja e teste de novo.

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: Tilesets aleatórios

Mensagem por saim em Qui 23 Jun 2011, 09:04

Markituh, realmente tá todo bugado, esse código que te passei. Foi mal.
Tente esse aqui, no controller. Depois eu volto a escrever, explicando cada linha, se você não entender alguma coisa:

Create Event:

Código:
Talarm=15
alarm[0]=Talarm
tamanho=30
varia=30


Alarm Event for alarm 0:

Código:
with instance_create(room_width, room_height-tamanho, obj_wall){
    tam=other.tamanho
    image_yscale=(tam-30)/sprite_height
    hspeed=-sprite_width/other.Talarm
    }
   
tamanho=median(room_height-30, 31, tamanho-varia+random(2*varia))
   
alarm[0]=Talarm

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: Tilesets aleatórios

Mensagem por Markituh em Qui 23 Jun 2011, 15:12

- A sprite é sim chapada, toda retangular.
- A origem está no padrão, 0 em ambos os eixos.
- Não defini a mask pois ainda não estou trabalhando com colisão, primeiro vou resolver a parte gráfica.

Hmmm... É, que bom que descobriu que o código estava com problemas! Teistei aqui e funcionou! Só falta fazer a parte da colisão (já fiz uma mask do tamanho da sprite). Então, pode me mostrar um exemplo daquele sistema de colisão que você havia falado?

___________

"Não deixe para amanhã o que se pode fazer hoje"

Links úteis:
Índice de Tutoriais
Manual online do GMS

Markituh

Ranking : Sem avaliações
Número de Mensagens : 2183
Data de inscrição : 11/10/2009
Reputação : 106
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Tilesets aleatórios

Mensagem por saim em Qui 23 Jun 2011, 17:03

É plataforma, né?
Normalmente eu uso hsp e vsp como variáveis de velocidade no momento e ignoro a direção. Pra gravidade, eu uso _grav. A movimentação horizontal e vertical são independentes, apesar de acontecerem ao mesmo tempo. O step fica mais ou menos assim:

Código:
repeat(hsp){
    if !place_meeting(x+keyboard_check(vk_right)-keyboard_check(vk_left), y, obj_wall){
        x=median(0, room_width, x+keyboard_check(vk_right)-keyboard_check(vk_left))
        }
    }

grav=(!place_meeting(x, y+1, obj_wall))*0.5
_vsp=min(_vsp+_grav, max_vsp) //constante, se _grav=0

if keyboard_check_pressed(ord('W')) && _grav==0
    vsp=-5

if vsp!=0 //como é muito código, melhor evitar rodar quando possível
    if !place_meeting(x, y+vsp, obj_wall){
        y+=vsp
        }
        else{ //só quando GARANTE uma colisão
            while(!place_meeting(x, y+sign(vsp), obj_wall)){
                y+=sign(vsp)
                }
            vsp=0
        }

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: Tilesets aleatórios

Mensagem por Markituh em Seg 27 Jun 2011, 12:43

Sim, é plataforma. Exclui o código que trabalha com o hsp pois o boneco não se move na horizontal, são as walls. Bem, o código não funciionou como eu esperava - tenho dois objetos para colidir, o piso cinza(para pisar enquanto não vem as paredes) e as paredes(que não são apenas paredes, são paredes e ao mesmo tempo pisos). Quando eu aperto a tecla definida para pulo ele vai para baixo, e não para cima (e também só pula quando as walls estão perto.

___________

"Não deixe para amanhã o que se pode fazer hoje"

Links úteis:
Índice de Tutoriais
Manual online do GMS

Markituh

Ranking : Sem avaliações
Número de Mensagens : 2183
Data de inscrição : 11/10/2009
Reputação : 106
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Tilesets aleatórios

Mensagem por saim em Seg 27 Jun 2011, 15:48

Acho que você só está checando por colisões com as paredes que se movimentam. Isso explicaria tudo.
Bom, ambos objetos podem ter um mesmo parent sem eventos, daí você checa por colisões com esse parent. Isso deve resolver tudo. Afinal, o código foi usado naquele meu DAN0 (concurso #007) que, apesar de ter seus bugs, tem a movimentação funcionando.
Agora, se tirar o código do hsp, ele vai ser capaz de atravassar a parede. Talvez seja o caso de ADAPTAR o código. Mas antes, teste essa idéia do parent e me diga se funcionou.

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: Tilesets aleatórios

Mensagem por Markituh em Seg 27 Jun 2011, 16:29

A colisão parece estar legal, só que eu não consigo pular. Há algo errado no código?
Código:
// Gravidade

_grav=(!place_meeting(x, y+1, obj_parentfl))*0.5
vsp=min(vsp+_grav, max_vsp) //constante, se _grav=0

if keyboard_check_pressed(ord('W')) && _grav==0
    vsp=-5

if vsp!=0 //como é muito código, melhor evitar rodar quando possível
    if !place_meeting(x, y+vsp, obj_parentfl){
        y+=vsp
        }
        else{ //só quando GARANTE uma colisão
            while(!place_meeting(x, y+sign(vsp), obj_parentfl)){
                y+=sign(vsp)
                }
            vsp=0
        }
obj_parentfl é o parent que eu criei.

___________

"Não deixe para amanhã o que se pode fazer hoje"

Links úteis:
Índice de Tutoriais
Manual online do GMS

Markituh

Ranking : Sem avaliações
Número de Mensagens : 2183
Data de inscrição : 11/10/2009
Reputação : 106
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Tilesets aleatórios

Mensagem por saim em Seg 27 Jun 2011, 17:33

Nada errado, pelo que eu vejo... a menos que a posição ATUAL esteja retornando uma colisão. Tente iniciar o jogo com o player no topo da tela.
Ah, por via das dúvidas, coloque uma mask retangular, ocupando todo o sprite.

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: Tilesets aleatórios

Mensagem por Conteúdo patrocinado Hoje à(s) 23:12


Conteúdo patrocinado


Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum