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?

Perguntas? A comunidade te ajuda a resolver.
Avatar do usuário
ValdeciVieira
Moderador
Moderador
Reações: 8
Mensagens: 122
Localização: Rio de Janeiro, Brasil

Re: como desenhar 3D 1 objecto usando sprites?

Mensagem por ValdeciVieira » Qui Ago 24, 2017 8:24 am

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

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
Edit:Obrigado cara,agora fiquei inspirado então vou continuar esse projeto para um jogo RPG ou de Tiro ou oq me sugerir melhor :sorrir:

Avatar do usuário
Cambalinho
Membro
Membro
Reações: 0
Mensagens: 59

Re: como desenhar 3D 1 objecto usando sprites?

Mensagem por Cambalinho » Qui Ago 24, 2017 12:50 pm

eu noto 1 problema:

Código: Selecionar todos

sprite_direction = point_direction(x,y,objCamera.x,objCamera.y) //Define a direção que a camera tem do objeto
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)

Avatar do usuário
ValdeciVieira
Moderador
Moderador
Reações: 8
Mensagens: 122
Localização: Rio de Janeiro, Brasil

Re: como desenhar 3D 1 objecto usando sprites?

Mensagem por ValdeciVieira » Qui Ago 24, 2017 12:55 pm

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
Editado pela última vez por ValdeciVieira em Qui Ago 24, 2017 1:01 pm, em um total de 1 vez.

Avatar do usuário
Cambalinho
Membro
Membro
Reações: 0
Mensagens: 59

Re: como desenhar 3D 1 objecto usando sprites?

Mensagem por Cambalinho » Qui Ago 24, 2017 12:58 pm

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

Avatar do usuário
ValdeciVieira
Moderador
Moderador
Reações: 8
Mensagens: 122
Localização: Rio de Janeiro, Brasil

Re: como desenhar 3D 1 objecto usando sprites?

Mensagem por ValdeciVieira » Qui Ago 24, 2017 1:03 pm

Entendi,mas agora eu tenho escola
Umas 5:30 eu volto

Avatar do usuário
Cambalinho
Membro
Membro
Reações: 0
Mensagens: 59

Re: como desenhar 3D 1 objecto usando sprites?

Mensagem por Cambalinho » Qui Ago 24, 2017 1:05 pm

ok. abraço e muito obrigado por tudo

Avatar do usuário
Cambalinho
Membro
Membro
Reações: 0
Mensagens: 59

Re: como desenhar 3D 1 objecto usando sprites?

Mensagem por Cambalinho » Sex Ago 25, 2017 5:21 am

consegui simplificar o codigo ;)

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;
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?

Avatar do usuário
ValdeciVieira
Moderador
Moderador
Reações: 8
Mensagens: 122
Localização: Rio de Janeiro, Brasil

Re: como desenhar 3D 1 objecto usando sprites?

Mensagem por ValdeciVieira » Sex Ago 25, 2017 7:13 am

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 

Avatar do usuário
Cambalinho
Membro
Membro
Reações: 0
Mensagens: 59

Re: como desenhar 3D 1 objecto usando sprites?

Mensagem por Cambalinho » Sex Ago 25, 2017 7:27 am

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):

Código: Selecionar todos

//don't draw if too far from camera
if distance_to_object (obj_camera)>2048 then exit;
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:

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();
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:

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
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 ;)

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;
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

Avatar do usuário
ValdeciVieira
Moderador
Moderador
Reações: 8
Mensagens: 122
Localização: Rio de Janeiro, Brasil

Re: como desenhar 3D 1 objecto usando sprites?

Mensagem por ValdeciVieira » Sex Ago 25, 2017 7:32 am

que isso ?
eu não fiz nada '-'
mas que bom que conseguiu oque procurava

Avatar do usuário
Cambalinho
Membro
Membro
Reações: 0
Mensagens: 59

Re: como desenhar 3D 1 objecto usando sprites?

Mensagem por Cambalinho » Sex Ago 25, 2017 7:37 am

voce fez muito mais do que pensa e isso me ajudou e muito para tentar resolver o enigma. e prontos.
e muito bom que encontrei +1 manual 3D que vou partilhar num topico 3D que fiz antes.
muito obrigado

Responder

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 7 visitantes