Obrigado por visitar a The Game Makers Brasil Use o fórum de Dúvidas para fazer perguntas. Se está em busca de aprender dê uma olhada nos tutoriais. |
como desenhar 3D 1 objecto usando sprites?
- Cambalinho
- Membro
- Reações: 0
- Mensagens: 59
como desenhar 3D 1 objecto usando sprites?
veja esta imagem:
ao observar esta imagem, nós podemos ver diversas subimagens para movimentos e a volta do monstro.
sem falar da animação... como posso juntar algumas subimagens para desenhar o monstro em 3D?
(assim, com a camara podia ver o monstro por completo)
ao observar esta imagem, nós podemos ver diversas subimagens para movimentos e a volta do monstro.
sem falar da animação... como posso juntar algumas subimagens para desenhar o monstro em 3D?
(assim, com a camara podia ver o monstro por completo)
Re: como desenhar 3D 1 objecto usando sprites?
Existia um tutorial de FPS feito para o antigo Game Maker e em um dos processos ensinava a técnica para desenhar os sprites dos monstros 2D em ambiente 3D.
O site original onde o tutorial estava (sandbox) já não existe mais mas você ainda pode encontrar os arquivos para download aqui:
https://enigma-dev.org/edc/games.php?game=43
Os editáveis foram feitos para o Game Maker 7, portanto você precisa ativar a opção "Used for 3D" nas properties dos Sprites e Backgrounds caso for usar o GameMaker: Studio.
O site original onde o tutorial estava (sandbox) já não existe mais mas você ainda pode encontrar os arquivos para download aqui:
https://enigma-dev.org/edc/games.php?game=43
Os editáveis foram feitos para o Game Maker 7, portanto você precisa ativar a opção "Used for 3D" nas properties dos Sprites e Backgrounds caso for usar o GameMaker: Studio.
- Cambalinho
- Membro
- Reações: 0
- Mensagens: 59
Re: como desenhar 3D 1 objecto usando sprites?
desculpa, só usam o sprite frontal e não usam, tambem, lateral e trás.
a minha questão é: como posso desenhar esse monstro dando 1 efeito 3D(incluir frente, trás e lateral)?
a minha questão é: como posso desenhar esse monstro dando 1 efeito 3D(incluir frente, trás e lateral)?
- WellingtonBecker
- Membro
- Reações: 0
- Mensagens: 57
-
Re: como desenhar 3D 1 objecto usando sprites?
Você poderia fazer isso com o blender no qual se modela em 3D, em seguida, cria-se sprites do angulo que quiser.
No link abaixo uma simples demonstração de como faze-lo.
https://www.youtube.com/watch?v=cCCO_thw164
No link abaixo uma simples demonstração de como faze-lo.
https://www.youtube.com/watch?v=cCCO_thw164
- Cambalinho
- Membro
- Reações: 0
- Mensagens: 59
Re: como desenhar 3D 1 objecto usando sprites?
wellingtonBecker, como voce viu, eu tenho as imagens o meu problema é como as desenho para dar o efeito 3D.
como era o Doom? não era assim ou usavam modelos?
como era o Doom? não era assim ou usavam modelos?
Re: como desenhar 3D 1 objecto usando sprites?
Nesse caso, você precisa encontrar uma forma de calcular uma variável angulo (Em relação ao player e direção de movimento do monstro) para indexar as sprites/subimagens de acordo.
Well, eu gostaria de ser mais especifico mas não conheço muito bem o funcionamento do 3D no GMS.
Well, eu gostaria de ser mais especifico mas não conheço muito bem o funcionamento do 3D no GMS.
- Cambalinho
- Membro
- Reações: 0
- Mensagens: 59
Re: como desenhar 3D 1 objecto usando sprites?
eu consegui alguma coisa, mas ainda noto erros:
erros:
1 - os ângulos ainda não estão correctos, a imagem pode variar mais do que devia;
2 - falta fazer com que a primeira imagem corresponda á direcção do monstro(a face).
podes me ajudar a corrigir esses cálculos?
Código: Selecionar todos
//evento Create:
z=40;
p=64;
w=64;
h=64;
image_speed=0;
angle=point_direction(x, y, objCamera.x, objCamera.y)
image_index=angle*(image_number)/360 *10;
//evento Step:
angle=point_direction(x, y, objCamera.x, objCamera.y)
image_index=ceil(angle*(image_number)/360 *10);
//evento Draw:
d3d_transform_set_identity();
d3d_transform_add_rotation_z(point_direction(x, y, objCamera.x, objCamera.y)+90);
d3d_transform_add_translation(x, y, z)
d3d_draw_wall(0+64,0+64, 0+64, 0, 0, 0, sprite_get_texture(sprCacodemon,image_index),1,1);
d3d_transform_set_identity();
1 - os ângulos ainda não estão correctos, a imagem pode variar mais do que devia;
2 - falta fazer com que a primeira imagem corresponda á direcção do monstro(a face).
podes me ajudar a corrigir esses cálculos?
Re: como desenhar 3D 1 objecto usando sprites?
O objCamera somente desenha a view ou também é o player?
Também não entendi o porquê do *10 ou do ceil no código.
Sugiro as seguintes alterações:
Create
Step
Quanto a face do monstro, imagino que será necessário organizar a colocação das subimagens da sprite para exibir corretamente.
Também não entendi o porquê do *10 ou do ceil no código.
Sugiro as seguintes alterações:
Create
Código: Selecionar todos
z=40;
p=64;
w=64;
h=64;
image_speed = 0;
angle = point_direction(x, y, objCamera.x, objCamera.y);
image_index = angle*image_number/360;
Código: Selecionar todos
angle = point_direction(x, y, objCamera.x, objCamera.y);
image_index = angle*image_number/360;
Quanto a face do monstro, imagino que será necessário organizar a colocação das subimagens da sprite para exibir corretamente.
- ValdeciVieira
- Moderador
- Reações: 8
- Mensagens: 122
- Localização: Rio de Janeiro, Brasil
Re: como desenhar 3D 1 objecto usando sprites?
Não sei ao certo oque você quer,mas eu fiz oque eu entendi (e nem me pergunte como eu fiz '-',eu simplesmente estava inspirado )
Obs :Tem 2 gifs uma com a opção "Interpolate colors between pixels" ativada e outra desativada só pra ver a diferença
Obs2:Esqueci de tirar o mouse :P
Fazer uma breve explicação aqui.
O Personagem ai tem 8 sprites viradas para 8 direções,o propio personagem tem uma direção só dele,mas dependendo de onde a camera (jogador) estiver ele muda de sprite (mas continua á olhar a direção propia).
Edit:Eu durmo cedo então se for isso mesmo oq vc procura envia a mensagem e tentarei responder o mais rapido possivel (eu estudo a tarde 13:00 até as 17:30) o resto desse tempo estou em casa (ae depende da internet xD)
Gif 1 (com "Interpolate colors between pixels")
Gif 2 (sem "Interpolate colors between pixels")
Obs :Tem 2 gifs uma com a opção "Interpolate colors between pixels" ativada e outra desativada só pra ver a diferença
Obs2:Esqueci de tirar o mouse :P
Fazer uma breve explicação aqui.
O Personagem ai tem 8 sprites viradas para 8 direções,o propio personagem tem uma direção só dele,mas dependendo de onde a camera (jogador) estiver ele muda de sprite (mas continua á olhar a direção propia).
Edit:Eu durmo cedo então se for isso mesmo oq vc procura envia a mensagem e tentarei responder o mais rapido possivel (eu estudo a tarde 13:00 até as 17:30) o resto desse tempo estou em casa (ae depende da internet xD)
Gif 1 (com "Interpolate colors between pixels")
Gif 2 (sem "Interpolate colors between pixels")
- Cambalinho
- Membro
- Reações: 0
- Mensagens: 59
Re: como desenhar 3D 1 objecto usando sprites?
sim Mega, é mesmo isso ;)
J_Marlon o '*10' é por causa de ter 1 numero superior a zero, porque esse calculo da-me numeros reais.
J_Marlon o '*10' é por causa de ter 1 numero superior a zero, porque esse calculo da-me numeros reais.
- ValdeciVieira
- Moderador
- Reações: 8
- Mensagens: 122
- Localização: Rio de Janeiro, Brasil
Re: como desenhar 3D 1 objecto usando sprites?
Ok então eu simplismente criei o objeto camera com esses codigos (eu peguei do tutorial que se eu não me engano vc mencionou em outro post
Edit:Obrigado cara,agora fiquei inspirado então vou continuar esse projeto para um jogo RPG ou de Tiro ou oq me sugerir melhor
Código: Selecionar todos
Create:
d3d_start(); //Inicia o 3d
direction = 0; //Direção da camera (horizontal)
pitch = 0; //Direção da camera (vertical)
z = 0; //Altura da camera
texture = background_get_texture(Txt_Floor) //Textura do chão
Step:
direction-=(display_mouse_get_x()-display_get_width()/2)/10; //Muda a direção (horizontal) com base no x do mouse na tela
pitch=clamp(pitch+(display_mouse_get_y()-display_get_height()/2)/10,-80,80); //Muda a direção (vertical) com base no y do mouse na tela
display_mouse_set(display_get_width()/2,display_get_height()/2); //Centraliza o mouse no centro da tela
if keyboard_check(vk_escape) {game_end()} //Fecha o jogo com a tecla "Esc" (já que o mouse fica preso no centro da tela)
var d=degtorad(direction); //Converte os graus da direção em radians
switch(keyboard_key){ //Faz a camera andar (da pra melhorar o codigo para fazer segurar mais de uma tecla)
case ord("A"):
x-=sin(d)*4;
y-=cos(d)*4;
break;
case ord("D"):
x+=sin(d)*4;
y+=cos(d)*4;
break;
case ord("S"):
x-=cos(d)*4;
y+=sin(d)*4;
break;
case ord("W"):
x+=cos(d)*4;
y-=sin(d)*4;
break;
}
Draw:
draw_set_color(c_white); //Define a cor como white (branca) para que o jogo não fique preto
d3d_set_projection(x,y,z+16,x+cos(degtorad(direction)),y-sin(degtorad(direction)),z-sin(degtorad(pitch))+16,0,0,1); //Meio complicado de explicar sugiro etudar :maluco:
d3d_draw_floor(0,0,0,room_width,room_height,0,texture,background_get_width(Txt_Floor),background_get_height(Txt_Floor)) //Desenha o chão do tamanho da sala
Agora o Obj_Megaman ou oque voce preferir
Create:
index = 0; //A subimg do sprite
xx1 = 1; //Estava tendo problemas com o sprite lateral que era menor que os demais então criei essas variaveis para mudar o tamanho da "wall" de acordo com o sprite
xx2 = 1; //Eu nem utilizei o yy1 e yy2 porque eles davam uma projeção errada ao objeto,fazendo com que ele não ficasse virado pra camera
yy1 = 1; //''
yy2 = 1; //''
direction = 0; //Direção do objeto
z = 0; //Altura do objeto
sprite_direction = 0; //Qual sprite ele desenha de acordo com a direção que o jogador o vê
Step:
sprite_direction = point_direction(x,y,Obj_Camera.x,Obj_Camera.y) //Define a direção que a camera tem do objeto
//Define suas "index" e o tamanho da "wall" (Lembrando eu fiz esse codigo porque estava inspirado :sorrir: então deve ter jeito mais simples de se fazer)
if sprite_direction >= 0 && sprite_direction < 45 {index = 0;xx1=-9.5;yy1=-9.5;xx2=9.5;yy2=9.5}
if sprite_direction >= 45 && sprite_direction < 90 {index = 1;xx1=-10.5;yy1=-10.5;xx2=10.5;yy2=10.5}
if sprite_direction >= 90 && sprite_direction < 135 {index = 2;xx1=-6;yy1=-6;xx2=6;yy2=6}
if sprite_direction >= 135 && sprite_direction < 180 {index = 3;xx1=-10.5;yy1=-10.5;xx2=10.5;yy2=10.5}
if sprite_direction >= 180 && sprite_direction < 225 {index = 4;xx1=-9.5;yy1=-9.5;xx2=9.5;yy2=9.5}
if sprite_direction >= 225 && sprite_direction < 270 {index = 5;xx1=-10.5;yy1=-10.5;xx2=10.5;yy2=10.5}
if sprite_direction >= 270 && sprite_direction < 315 {index = 6;xx1=-6;yy1=-6;xx2=6;yy2=6}
if sprite_direction >= 315 && sprite_direction < 360 {index = 7;xx1=-10.5;yy1=-10.5;xx2=10.5;yy2=10.5}
Draw: //Desculpe mas eu precisei pegar seu codigo para criar isso (pq eu tinha me esquecido como se faz)
d3d_transform_set_identity(); //Define a transformação para a identidade (sem transformação)
d3d_transform_add_rotation_z(point_direction(x, y, Obj_Camera.x, Obj_Camera.y)+90); //Adiciona uma rotação em torno do eixo z com a quantidade indicada
d3d_transform_add_translation(x, y, z) //Adiciona uma tradução sobre o vetor indicado
d3d_draw_wall(xx1,0,24,xx2,0,0,sprite_get_texture(Spr_Megaman,index),1,1); //Desenha uma parede com o xx1 e xx2 (do tamanho das sprites que era 24),desenha o sprite com o "index")
d3d_transform_set_identity(); //Define a transformação para a identidade (sem transformação)
Pronto.
Obs :As sprites exibidas nas gifs não são de minha autoria,eu peguei de um jogo que tinha aqui.
O nome do jogo é Mega Man 8-bit Deathmatch
Link:http://cutstuff.net/mm8bdm/
Obs2 :O jogo é uma hack de doom
- Cambalinho
- Membro
- Reações: 0
- Mensagens: 59
Re: como desenhar 3D 1 objecto usando sprites?
eu noto 1 problema:
1 - eu não posso mudar a direction do teu megaman?
(mantenho megaman para poderes me ajudar)
- desculpa mas o conjunto dos if's não pode ser simplificado?
(e assim poder-mos usar o codigo para outras situações)
Código: Selecionar todos
sprite_direction = point_direction(x,y,objCamera.x,objCamera.y) //Define a direção que a camera tem do objeto
(mantenho megaman para poderes me ajudar)
- desculpa mas o conjunto dos if's não pode ser simplificado?
(e assim poder-mos usar o codigo para outras situações)
- ValdeciVieira
- Moderador
- Reações: 8
- Mensagens: 122
- Localização: Rio de Janeiro, Brasil
Re: como desenhar 3D 1 objecto usando sprites?
Eu não entendi muito bem o problema 1
Edit:Olha eu fiz esse sprite_direction para que o objeto veja em que direção está a camera,assim definindo qual index vai aparecer (seguindo como ponto a direção do megaman)
Se eu coloca-se direction o objeto ia index ia ser 0 (que é a sprite virada para o jogador),ou seja nunca ia mudar
Essa direction é pra definir qual a direção que o megaman está virado
Edit:Olha eu fiz esse sprite_direction para que o objeto veja em que direção está a camera,assim definindo qual index vai aparecer (seguindo como ponto a direção do megaman)
Se eu coloca-se direction o objeto ia index ia ser 0 (que é a sprite virada para o jogador),ou seja nunca ia mudar
Essa direction é pra definir qual a direção que o megaman está virado
Editado pela última vez por ValdeciVieira em Qui Ago 24, 2017 1:01 pm, em um total de 1 vez.
- Cambalinho
- Membro
- Reações: 0
- Mensagens: 59
Re: como desenhar 3D 1 objecto usando sprites?
nós podemos alterar o direction, e o direction é que manda onde mostrar a primeira image ;)
ou seja, os if's tem de ser aperfeiçoados para lidar tambem com a direction
ou seja, os if's tem de ser aperfeiçoados para lidar tambem com a direction
- ValdeciVieira
- Moderador
- Reações: 8
- Mensagens: 122
- Localização: Rio de Janeiro, Brasil
- Cambalinho
- Membro
- Reações: 0
- Mensagens: 59
- Cambalinho
- Membro
- Reações: 0
- Mensagens: 59
Re: como desenhar 3D 1 objecto usando sprites?
consegui simplificar o codigo ;)
o que ainda não entendi é como vou adicionar o direction :(
porque da-me index errados :(
eu se adicionar ao sprite_direction obtenho o index inicial errado, e depois se repete quando dou a volta :(
o que podes me aconselhar?
Código: Selecionar todos
///GetSubImage2DSprite(objDrawed, objCamera, sprSprite);
imagecount=sprite_get_number(argument2);
sprite_direction = point_direction(argument0.x,argument0.y,argument1.x,argument1.y);
index=0;
for (i=0; i<360; i+=(360/imagecount))
{
if sprite_direction >= (i) && sprite_direction < (i+(360/imagecount)) then
{
return index;
}
index++;
}
index-=1
return index;
porque da-me index errados :(
eu se adicionar ao sprite_direction obtenho o index inicial errado, e depois se repete quando dou a volta :(
o que podes me aconselhar?
- ValdeciVieira
- Moderador
- Reações: 8
- Mensagens: 122
- Localização: Rio de Janeiro, Brasil
Re: como desenhar 3D 1 objecto usando sprites?
Que bom que conseguiu simplificar o código :D
Eu não trabalho com códigos assim que usam "i" e sei lá o que,tenho que estudar pra entender ;-;
Se eu entendesse o código ficaria melhor
Eu não trabalho com códigos assim que usam "i" e sei lá o que,tenho que estudar pra entender ;-;
Se eu entendesse o código ficaria melhor
- Cambalinho
- Membro
- Reações: 0
- Mensagens: 59
Re: como desenhar 3D 1 objecto usando sprites?
voltei a ler este documento: https://enigma-dev.org/docs/Wiki/3D_for ... ite_models
11.5 Using virtual rotation
Virtual rotated Flat Sprite Models are not really 3D models. They are Flat Sprite Models, so they’re 2D. The trick is to set an image for each angle. Take a look at the gm6 file (part D) and the script draw_virtual and you will see it’s basically the same code (as part C):
The first part (above) is used to avoid having to draw objects that are too far to see anyway. This has nothing to do with transformation. The next part (below) of the same script has and looks like this:
This time we will use almost the same code, using the image_index value but in the Step event we will run the script scr_virtual that looks like this:
Using the angle of the player in relation to the object, we will set the value of the image_index. Because we’re using 8 sub-images, we will use the number 8 (last line, above). If you run the gm6 (part D), you will see that the object rotates so that the player can view it from all sides. The more images you use, the more realistic the effect will be. But using more subimages will result in a larger overall file size because images take up memory.
e agora sim. bem melhor ;)
o ceil é para obter numeros inteiros ;)
ja tenho o que pretendo. muito obrigado.
apenas noto 1 pequeno erro entre os angulos e a direcção(margem de erro). mas está melhor e aceito correcções.
muito obrigado
11.5 Using virtual rotation
Virtual rotated Flat Sprite Models are not really 3D models. They are Flat Sprite Models, so they’re 2D. The trick is to set an image for each angle. Take a look at the gm6 file (part D) and the script draw_virtual and you will see it’s basically the same code (as part C):
Código: Selecionar todos
//don't draw if too far from camera
if distance_to_object (obj_camera)>2048 then exit;
Código: Selecionar todos
//draw virtual rotating ball
d3d_transform_set_identity();
d3d_transform_add_rotation_x(90);
d3d_transform_add_rotation_z(point_direction(x, y, obj_character.x, obj_character.y)+90);
d3d_transform_add_translation(x, y, z+64)
draw_sprite_ext(spr_virtual, image_index, 0, 0, 1, 1, 0, c_white, 1);
d3d_transform_set_identity();
Código: Selecionar todos
//set angle and image
angle=point_direction(x, y, obj_character.x, obj_character.y)
image_index=angle*8/360; //8 is the number of rotation images
e agora sim. bem melhor ;)
Código: Selecionar todos
///GetSubImage2DSprite(objDrawed, objCamera, sprSprite);
imagecount=sprite_get_number(argument2);
sprite_direction = point_direction(argument0.x,argument0.y,argument1.x,argument1.y)+argument0.direction;
if sprite_direction>360 then sprite_direction-=360;
index=sprite_direction*imagecount/360;
return ceil(index);
//Create:
direction =180 -90;
ja tenho o que pretendo. muito obrigado.
apenas noto 1 pequeno erro entre os angulos e a direcção(margem de erro). mas está melhor e aceito correcções.
muito obrigado
- ValdeciVieira
- Moderador
- Reações: 8
- Mensagens: 122
- Localização: Rio de Janeiro, Brasil
Re: como desenhar 3D 1 objecto usando sprites?
que isso ?
eu não fiz nada '-'
mas que bom que conseguiu oque procurava
eu não fiz nada '-'
mas que bom que conseguiu oque procurava
Quem está online
Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante