[Tutorial]Água dinâmica para Plataforma (2D)

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

[Tutorial]Água dinâmica para Plataforma (2D)

Mensagem por rickelme.dias em Qua 15 Maio 2013, 15:49

Bom era uma engine em inglês que estou passando para tutorial(Ex Engine Feita por Lapps)
Título: Água dinâmica para Plataforma (2D)
Descrição: água suave e eficiente codificado que ondulações quando você entrar e sair.
DLLs necessários: Nenhuma
Indice das cores(Apenas as cores que estão no meu tutorial.)
Spoiler:
Sprites
Objetos
Script

Para aqueles que so querem estudar:
Download das sprite do tutorial... sem as programações e scrits


Vamos ao tutorial:

Spoiler:
Bom crie seu objPlayer bom a sprite do meu objPlayer vai ser todo azul e vai ter Width:22 Height:40
e vai ser nomeada como sprPlayer.
Veja isso, será 3 sprites
sprPlayer
sprBlock
sprWaterTop
Veja a imagem das SPRITES

Bom tendo as 3 sprite crie 4 Objetos.
Que no caso são os:
objPlayer
objBlock
objWater
objPhysics
Veja a imagem dos objetos

Adicionando Script
Spoiler:
Coloque a seguinte Script:
Código:
//o nome do script é divide
//divide(num1, num2)

    if (argument1 = 0) return 0;
    else return argument0/argument1;
Foto

Agora Vamos programar o nosso objPlayer

Spoiler:
Coloque a seguinte AÇÃO no Evento CREATE
essa ação é encontrada na BARRA CONTROL
Bom agora vamos definir as variaveis.
Ainda no Evento CREATE coloque a ação Execute Code:
Código:
//Iniciando Variaveis

    //Estados
    gnd = 0;
   
    //Velocidades
    acc = 0.125;
    air = 0.25;
    dec = 0.25;
    top = 6;
    frc = 0.125;
    grv = 0.25;
    jmp = 8;
Bom ja colocamos as variaveis etc.. vamos colocar o movimento no STEP coloque o seguinte code:
Código:
///Move player

    //velocidades
    if (gnd) //no chão
    {
        if (keyboard_check(vk_left))
        {
            if (xsp > 0)
            {
                xsp -= dec;
            }
            else if (xsp > -top)
            {
                facing = -1;
                xsp -= acc;
                if (xsp < -top) xsp = -top;
            }
        }
        else if (keyboard_check(vk_right))
        {
            if (xsp < 0)
            {
                xsp += dec;
            }
            else if (xsp < top)
            {
                facing = 1;
                xsp += acc;
                if (xsp > top) xsp = top;
            }
        }
        else
        {
            xsp -= min(abs(xsp), frc)*sign(xsp);
        }
   
        if (place_free(x,y+1))
        {
            gnd = 1;
            ysp = 0;
        }
   
        if (keyboard_check_pressed(vk_space))
        {
            gnd = 0;
            ysp = -jmp;
        }
    }
    else //no ar
    {
        if (keyboard_check(vk_left))
        {
            if (xsp > -top)
            {
                xsp -= air;
                if (xsp < -top) xsp = -top;
            }
        }
        else if (keyboard_check(vk_right))
        {
            if (xsp < top)
            {
                xsp += air;
                if (xsp > top) xsp = top;
            }
        }
       
        if ((ysp < 0) && (ysp > -4))
        {
            xsp -= (xsp div 0.125)/256;
        }
   
    }
   
    //movimento & colisão
    x += xsp;
   
    if (!place_free(x, y))
    {
        x -= xsp;
        if (xsp > 0)
        {
            move_contact_solid(0, 8);
        }
        else if (xsp < 0)
        {
            move_contact_solid(180, 8);
        }
        xsp = 0;
    }
   
    if (!gnd)
    {
        y += ysp;
       
        if (!place_free(x, y))
        {
            y -= ysp;
            if (ysp > 0)
            {
                move_contact_solid(270, 8);
            }
            else if (ysp < 0)
            {
                move_contact_solid(90, 8);
            }
            gnd = sign(ysp);
            ysp = 0;
        }
       
        ysp += grv;
        if (ysp > 8) ysp = 8;
    }
    else
    {
        if (place_free(x, y+1)) gnd = 0;
    }
   
    //manter dentro da sala
    if (x < 0)
    {
        x = 0;
        xsp = 0;
    }
    if (x > room_width)
    {
        x = room_width;
        xsp = 0;
    }
Ebaa ja colocamos o movimento e as variáveis !!!
Agora vamos desenhar..
Crie um Evento Draw e coloque o seguinte Code(Execute Code):
Código:
///Desenha Sprite Arredondado

    draw_sprite(sprite_index, image_index, round(x), round(y));

Agora vamos programar o objWater

Spoiler:
No CREATE do objWater coloque o seguinte CODE:
Código:
///Gerar Água outro lado da sala
   
    nodewidth = 8; //as this is lowered the water waves will get thinner but more precise, and more of them
    nodes = floor(waterwidth/nodewidth)+1;

    //variáveis ​​físicas
    spring = 2; //higher numbers will make the liquid act thicker
    fricdiv = 2; //higher numbers will be less dynamic
   
    //nós individuais
    for (i = 0; i < nodes; i += 1)
    {
        yy[i] = y;
        ysp[i] = 0;
        frc[i] = (ysp[i])/(room_speed/fricdiv);
    }
   
Agora no STEP do objWater coloque o CODE:
Spoiler:
///Atualize água

var drop;
for (i = 0; i < nodes; i += 1)
{
if ((i-1 > -1) && (i+1 < nodes))
{
//movimento
ysp[i] += ((((yy[i-1]-yy[i])+(yy[i+1]-yy[i]))+(ysp[i-1]+ysp[i+1])))/(room_speed*spring);
ysp[i] += (y-yy[i])/(room_speed*spring);
frc[i] = (ysp[i])/(room_speed/fricdiv);
ysp[i] -= frc[i];

//colisão
drop = collision_circle(x+(i*nodewidth), yy[i], nodewidth/2, objPhysics, 0, 1);
if (drop)
{
if (abs(drop.ysp) > 0.5)
{
ysp[i] = divide(drop.ysp/4, max(1, point_distance(drop.x, 0, x+(i*nodewidth), 0)/16));
}
}

//realmente mover o nó
yy[i] += ysp[i];
}
}
Agora vamos fazer o DRAW da Água use o seguinte CODE:
Código:
/// Desenha Água Usando Primitives

// desenha o corpo da água
    draw_set_color(18577);
    draw_set_alpha(1);
    draw_set_blend_mode(bm_subtract);
    draw_primitive_begin(pr_trianglestrip);
   
    for (i = 0; i < nodes; i += 1)
    {
        draw_vertex(x+(i*nodewidth), yy[i]);
        draw_vertex(x+(i*nodewidth), y+waterheight);
    }
   
    draw_primitive_end();
    draw_set_alpha(1);
    draw_set_blend_mode(bm_normal);
    draw_set_color(c_white);
   
    //desenhar a superfície da água
    var pth, wid, stp, stp_i, xt, xt_i, sgn, a, a_i, x1, y1, x2, y2, i, px, py, nx, ny, vert_count;
   
    wid = 8; //a metade da largura da superfície de água
   
    px = x;
    py = yy[0];
   
    vert_count = 0;
    draw_primitive_begin_texture(pr_trianglestrip, sprite_get_texture(sprWaterTop, 0));
   
    for (i = 0; i < nodes; i += 1)
    {

        nx = x+(i*nodewidth);
        ny = yy[i];

        dir = point_direction(px, py, nx, ny);
        dx = lengthdir_x(wid, dir+90);
        dy = lengthdir_y(wid, dir+90);

        xt = (i-1)/nós;
        draw_vertex_texture(px+dx, py+dy, xt, 0);
        draw_vertex_texture(px-dx, py-dy, xt, 1);
        px = nx;
        py = ny;
    }
   
    draw_vertex_texture(px+dx, py+dy, xt, 0);
    draw_vertex_texture(px-dx, py-dy, xt, 1);
    draw_primitive_end();

Bom agora finalmeeeeeeeeeeeeeeeeeeente eu cheguei no ultimo objeto que no caso é o objPhysics.

Spoiler:
No evento CREATE do objPhysics coloque o seguinte code:
Código:
///Tornar as variáveis ​​velocidade Claro são inicializados
xsp = 0;
ysp = 0;

Bom nós terminamos não é? Bom os créditos são a mim que tive o trabalhao de escrever tudo repassar a engine inteira com alguns tutoriais no code e umas cores para facilitar a visualização e o resto dos créditos para o gênio que bolou tudo isso que no caso é o Lapps. essa demorou meia hora mais valew a pena Very Happy

Download: Clique aqui

rickelme.dias

Número de Mensagens : 230
Idade : 16
Data de inscrição : 07/02/2013
Reputação : 34
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://rickelmegt.blogspot.com.br/

Voltar ao Topo Ir em baixo

Re: [Tutorial]Água dinâmica para Plataforma (2D)

Mensagem por Isaque Onix em Sex 17 Maio 2013, 13:55

muito bom seu tuto (a pesar de eu não ter intendido bem como funciona) mais deixa em off, vou estudar mais um pouco kk flw
[edit]

seria legal se você explicasse os códigos, eu não intendi bulhufas imagine os novatos...

Isaque Onix

Número de Mensagens : 1597
Idade : 23
Data de inscrição : 15/08/2010
Reputação : 147
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://spyreserver.16mb.com

Voltar ao Topo Ir em baixo

Re: [Tutorial]Água dinâmica para Plataforma (2D)

Mensagem por Rodrigo Santiago em Sex 17 Maio 2013, 14:24

É verdade, não basta apenas dizer, tem que explicar pra ficar mais fácil.
Eu vi os scripts, e não é muito difícil, basta colocar mais uns comentários '//', e fica bem fácil. Mesmo sendo traduzida você pode dá uma faclitada, pois esse tutorial é MUITO BOM.

Rodrigo Santiago

Ranking : Nota B
Número de Mensagens : 1281
Idade : 20
Data de inscrição : 28/07/2012
Notas recebidas : C + C + B
Reputação : 73
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 3
   : 1
   : 3

Voltar ao Topo Ir em baixo

Re: [Tutorial]Água dinâmica para Plataforma (2D)

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


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