Conectar-se
Quem está conectado
17 usuários online :: Nenhum usuário registrado, Nenhum Invisível e 17 Visitantes

Nenhum

Ver toda a lista


Compartilhe
Ver o tópico anteriorIr em baixoVer o tópico seguinte
avatar
Ranking : Sem avaliações
Data de inscrição : 11/10/2009
Número de Mensagens : 2184
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 106

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuário

Tilesets aleatórios

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.
avatar
Ranking : Nota B
Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Número de Mensagens : 2964
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 121

Prêmios
   : 1
   : 0
   : 3
Ver perfil do usuário

Re: Tilesets aleatórios

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.
avatar
Ranking : Sem avaliações
Data de inscrição : 11/10/2009
Número de Mensagens : 2184
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 106

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuário

Re: Tilesets aleatórios

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.
avatar
Ranking : Nota B
Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Número de Mensagens : 2964
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 121

Prêmios
   : 1
   : 0
   : 3
Ver perfil do usuário

Re: Tilesets aleatórios

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
avatar
Ranking : Sem avaliações
Data de inscrição : 11/10/2009
Número de Mensagens : 2184
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 106

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuário

Re: Tilesets aleatórios

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
avatar
Ranking : Nota B
Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Número de Mensagens : 2964
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 121

Prêmios
   : 1
   : 0
   : 3
Ver perfil do usuário

Re: Tilesets aleatórios

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).
avatar
Ranking : Sem avaliações
Data de inscrição : 11/10/2009
Número de Mensagens : 2184
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 106

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuário

Re: Tilesets aleatórios

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
avatar
Ranking : Nota B
Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Número de Mensagens : 2964
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 121

Prêmios
   : 1
   : 0
   : 3
Ver perfil do usuário

Re: Tilesets aleatórios

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)
avatar
Ranking : Nota C
Notas recebidas : D + D + C + C + D + B
Data de inscrição : 28/04/2011
Número de Mensagens : 913
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 41

Prêmios
   : 1
   : 0
   : 0
Ver perfil do usuáriohttp://mrbrumgames.blogspot.com/

Re: Tilesets aleatórios

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..
avatar
Ranking : Sem avaliações
Data de inscrição : 11/10/2009
Número de Mensagens : 2184
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 106

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuário

Re: Tilesets aleatórios

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.
avatar
Ranking : Nota C
Notas recebidas : D + D + C + C + D + B
Data de inscrição : 28/04/2011
Número de Mensagens : 913
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 41

Prêmios
   : 1
   : 0
   : 0
Ver perfil do usuáriohttp://mrbrumgames.blogspot.com/

Re: Tilesets aleatórios

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) .
avatar
Ranking : Nota B
Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Número de Mensagens : 2964
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 121

Prêmios
   : 1
   : 0
   : 3
Ver perfil do usuário

Re: Tilesets aleatórios

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.
avatar
Ranking : Sem avaliações
Data de inscrição : 11/10/2009
Número de Mensagens : 2184
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 106

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuário

Re: Tilesets aleatórios

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.
avatar
Ranking : Nota B
Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Número de Mensagens : 2964
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 121

Prêmios
   : 1
   : 0
   : 3
Ver perfil do usuário

Re: Tilesets aleatórios

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á?
avatar
Ranking : Nota C
Notas recebidas : D + D + C + C + D + B
Data de inscrição : 28/04/2011
Número de Mensagens : 913
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 41

Prêmios
   : 1
   : 0
   : 0
Ver perfil do usuáriohttp://mrbrumgames.blogspot.com/

Re: Tilesets aleatórios

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.
avatar
Ranking : Sem avaliações
Data de inscrição : 11/10/2009
Número de Mensagens : 2184
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 106

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuário

Re: Tilesets aleatórios

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.
avatar
Ranking : Nota B
Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Número de Mensagens : 2964
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 121

Prêmios
   : 1
   : 0
   : 3
Ver perfil do usuário

Re: Tilesets aleatórios

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.
avatar
Ranking : Sem avaliações
Data de inscrição : 11/10/2009
Número de Mensagens : 2184
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 106

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuário

Re: Tilesets aleatórios

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
avatar
Ranking : Nota B
Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Número de Mensagens : 2964
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 121

Prêmios
   : 1
   : 0
   : 3
Ver perfil do usuário

Re: Tilesets aleatórios

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.
avatar
Ranking : Nota B
Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Número de Mensagens : 2964
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 121

Prêmios
   : 1
   : 0
   : 3
Ver perfil do usuário

Re: Tilesets aleatórios

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
Ver o tópico anteriorVoltar ao TopoVer o tópico seguinte
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum