Avatar do usuário
Mega
Programador
Programador
Mensagens: 71
Registrado em: Dom Mai 22, 2016 6:20 pm
Karma: 104

Re: como desenhar 3D 1 objecto usando sprites?

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

Tags:
 
Cambalinho
Membro
Membro
Autor
Mensagens: 59
Registrado em: Qui Jul 20, 2017 9:59 am
Karma: 25

Re: como desenhar 3D 1 objecto usando sprites?

Qui Ago 24, 2017 12:50 pm

eu noto 1 problema:
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
Mega
Programador
Programador
Mensagens: 71
Registrado em: Dom Mai 22, 2016 6:20 pm
Karma: 104

Re: como desenhar 3D 1 objecto usando sprites?

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 Mega em Qui Ago 24, 2017 1:01 pm, em um total de 1 vez.
 
Cambalinho
Membro
Membro
Autor
Mensagens: 59
Registrado em: Qui Jul 20, 2017 9:59 am
Karma: 25

Re: como desenhar 3D 1 objecto usando sprites?

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
Mega
Programador
Programador
Mensagens: 71
Registrado em: Dom Mai 22, 2016 6:20 pm
Karma: 104

Re: como desenhar 3D 1 objecto usando sprites?

Qui Ago 24, 2017 1:03 pm

Entendi,mas agora eu tenho escola
Umas 5:30 eu volto
 
Cambalinho
Membro
Membro
Autor
Mensagens: 59
Registrado em: Qui Jul 20, 2017 9:59 am
Karma: 25

Re: como desenhar 3D 1 objecto usando sprites?

Qui Ago 24, 2017 1:05 pm

ok. abraço e muito obrigado por tudo
 
Cambalinho
Membro
Membro
Autor
Mensagens: 59
Registrado em: Qui Jul 20, 2017 9:59 am
Karma: 25

Re: como desenhar 3D 1 objecto usando sprites?

Sex Ago 25, 2017 5:21 am

consegui simplificar o codigo ;)
///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
Mega
Programador
Programador
Mensagens: 71
Registrado em: Dom Mai 22, 2016 6:20 pm
Karma: 104

Re: como desenhar 3D 1 objecto usando sprites?

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 
 
Cambalinho
Membro
Membro
Autor
Mensagens: 59
Registrado em: Qui Jul 20, 2017 9:59 am
Karma: 25

Re: como desenhar 3D 1 objecto usando sprites?

Sex Ago 25, 2017 7:27 am

voltei a ler este documento: https://enigma-dev.org/docs/Wiki/3D_for_GML:_Flat_sprite_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):

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

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

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

///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
Mega
Programador
Programador
Mensagens: 71
Registrado em: Dom Mai 22, 2016 6:20 pm
Karma: 104

Re: como desenhar 3D 1 objecto usando sprites?

Sex Ago 25, 2017 7:32 am

que isso ?
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 2 visitantes