Programación Específica > Programación de Videojuegos

 Re: Juego de Rol Multi-Usuario Masivo 100% Hecho en Delphi.

(1/4) > >>

Amilius:
:good:

Pueden ver algunas pantallas capturadas en esta comunidad:

http://groups.msn.com/Legadodelasartesa ... oebox.msnw

Todos los efectos de blt están implementados en delphi con el método lock del directDraw (Que sólo te da una referencia a la posición de memoria donde puedes trabajar y otros datos adicionales para trabajar con la superficie)

Tiene un engine isométrico 2D, funciona perfectamente en cualquier máquina con win98 y el nro de fps aumenta con la calidad del hardware sin afectar la sincronización de animación, como sucede en un buen juego hecho en modo 3d.

El servidor también está sincronizado con el cliente para mantener la calidad de animación del juego.

Cualquier pregunta q' tengan:

ZeratulZ@hotmail.com


:lightsabre: :beer: :guitar:

Amilius:
Un procedimiento que elaboré q permite hacer blt con alpha del 50%, ideal para objetos semi-transparentes. Está optimizado para modo 16bits (5-6-5).

Noten q el efecto de transparencia se obtiene con dos operadores lógicos y un desplazamiento. El efecto es visualmente muy bueno una transparencia del 50% perfecta para los ojos.

Notas:

* SuperficieRender es una variable global.
* El color transparente es el 0,0,0 =$0000

Espejo: en el eje vertical.




procedure BltTrans(const DestR:Trect;SuperficieDD:IDirectDrawSurface7;const OrigR:Trect;espejo:bytebool);
const mskTrans=$F7DF;
var x,y,anchoFaltante,anchoFaltanteOrig,ancho:integer;
    conta,contaOrig:pointer;
    dato2:integer;
    lpDDSurfaceDesc:TDDSurfaceDesc2;
begin
  FillChar(lpDDSurfaceDesc, SizeOf(lpDDSurfaceDesc),#0);//Llena de ceros.
  lpDDSurfaceDesc.dwSize := sizeof(lpDDSurfaceDesc);
  lpDDSurfaceDesc.dwFlags := DDSD_CAPS or DDSD_LPSURFACE or DDSD_PITCH;
//SuperficieRender
  if SuperficieRender.lock(@DestR,lpDDSurfaceDesc,DDLOCK_WAIT,0)=DD_OK then
  begin
    conta:=lpDDSurfaceDesc.lpSurface;
    anchoFaltante:=lpDDSurfaceDesc.lPitch-(DestR.Right-DestR.Left) shl 1;
//SuperficieTransparente
    FillChar(lpDDSurfaceDesc, SizeOf(lpDDSurfaceDesc),#0);//Llena de ceros.
    lpDDSurfaceDesc.dwSize := sizeof(lpDDSurfaceDesc);
    lpDDSurfaceDesc.dwFlags := DDSD_CAPS or DDSD_LPSURFACE or DDSD_PITCH;
    if SuperficieDD.lock(@OrigR,lpDDSurfaceDesc,DDLOCK_WAIT,0)=DD_OK then
    begin
      if espejo then
      begin
        contaOrig:=Pointer(integer(lpDDSurfaceDesc.lpSurface)+(origR.Right-origR.Left) shl 1);
        anchoFaltanteOrig:=lpDDSurfaceDesc.lPitch+(origR.Right-origR.Left) shl 1;
        ancho:=lpDDSurfaceDesc.lPitch;
        x:=integer(lpDDSurfaceDesc.lpSurface);//!
        for y:=origR.top to origR.Bottom-1 do//-1
        begin
          while integer(contaOrig)>x do
          begin
            dec(integer(contaOrig),2);
            dato2:=word(contaOrig^);
            if dato2<>0 then
              word(conta^):=((dato2 and mskTrans)+(word(conta^) and mskTrans)) shr 1;
            inc(integer(conta),2);
          end;
          inc(integer(conta),anchoFaltante);
          inc(integer(contaOrig),anchoFaltanteOrig);
          inc(x,ancho);//!
        end;
      end
      else
      begin
        contaOrig:=lpDDSurfaceDesc.lpSurface;
        anchoFaltanteOrig:=lpDDSurfaceDesc.lPitch-(origR.Right-origR.Left) shl 1;
        ancho:=lpDDSurfaceDesc.lPitch;
        x:=integer(lpDDSurfaceDesc.lpSurface)+(origR.Right-origR.Left) shl 1;;//!
        for y:=origR.top to origR.Bottom-1 do
        begin
          while integer(contaOrig)<x do
          begin
            dato2:=word(contaOrig^);
            if dato2<>0 then
              word(conta^):=((dato2 and mskTrans)+(word(conta^) and mskTrans)) shr 1;
            inc(integer(conta),2);
            inc(integer(contaOrig),2);
          end;
          inc(integer(conta),anchoFaltante);
          inc(integer(contaOrig),anchoFaltanteOrig);
          inc(x,ancho);//!
        end;
      end;
      SuperficieDD.unlock(@OrigR);
    end;
    SuperficieRender.unlock(@DestR);
  end;
end;

Amilius:
Noooooo...:o
Desaparecieron las Tabulaciones..

Aqui va adjuntado...

JuanK:
por lo que veo usas Visual Basic, y direct X al parecer inferior al 9 managed...

en direct x managed , existen superficies alpha, que hacen todo lo que tu has hecho y con mas cositas por ahi...
De todos modos te felicito por lo que hiciste ya que casi nadie se le mide a la programacion grafica en ninguna plataforma.

Espero que no te haya parecido odioso el comentario..no es la intencion.

Ahh si para lo de los tabuladores debes utilizar la opcion de insertar codigo cuadndo estes postenado el mensaje, de esta forma , conservara el formato. ejemplo:

 
--- Código: Text ---     public void RenderGraphics(Point currentDestination)    {        if (!owner.Created)            return;         try        {            Rectangle rect = new Rectangle(owner.PointToScreen(new Point(0,0)), new Size(surfaceSecondary.SurfaceDescription.Width, surfaceSecondary.SurfaceDescription.Height));             sprMegaMan.PointToScreen(index,ref currentDestination);             surfaceSecondary.Draw(surfFondo, DrawFlags.DoNotWait);            surfaceSecondary.Draw(new Rectangle(currentDestination, new Size(sprMegaMan[index].Width, sprMegaMan[index].Height)), surfMegaman                    ,sprMegaMan[index] ,DrawFlags.DoNotWait | DrawFlags.KeySource);            //surfaceSecondary.DrawFast(0 ,0 ,surfFondo , DrawFastFlags.DoNotWait);                     //surfaceSecondary.DrawFast(currentDestination.X, currentDestination.Y, surfMegaman            //    ,sprMegaMan[index] ,DrawFastFlags.DoNotWait | DrawFastFlags.SourceColorKey);            /*esperar retrazado vertical*/            localDevice.WaitForVerticalBlank(WaitVbFlags.BlockEnd);                     surfacePrimary.Draw(rect, surfaceSecondary , DrawFlags.DoNotWait);                      ProccessNextFrame(currentDestination);        }        catch(SurfaceLostException)        {            AllSurfacesDisposer();            CreateSurfaces();        }    }     private void ProccessNextFrame(Point currentDestination)    {        if(fstload)        {            p = currentDestination;            fstload = false;        }        else        {            if((System.Environment.TickCount-tiempo)>= 100 )            {                if((index < sprMegaMan.Count()-1) )                {                    index++;                    tiempo = System.Environment.TickCount;                }                else                {                    index = 1;                }                if(p == currentDestination)                    index = 0;            }            p=currentDestination;        }    }  
Juank

Amilius:
En realidad es código para Delphi.

¿Es posible aplicar efectos alpha/alphaEdgeBlending sin estar en modo 3d?

Parece que todas las tarjetas de video tienen implementados estos efectos sólo para modo 3d, obviamente porque la codificación es distinta entre 2d y 3d, en 3d es más complicado y los algoritmos son inevitablemente más pesados que para 2d. DirectX tampoco parece tener estos efectos por "software"  en caso de que tu tarjeta de video no los soporte en modo 2d.

Por estos motivos tengo implementados esos efectos en 2d por software, es más ligero que entrar en modo 3d y utilizar los de la tarjeta aceleradora, por lo menos con una tarjeta de 8MB todo va muy lento:(  .

El juego que estoy haciendo está orientado a usuarios q no puedan pagar los 10$us mensuales que generalmente cuesta jugar un MMORPG.  Por esto mismo el juego no puede exigir que el usuario tenga la super máquina.

El juego funcionará en cualquier máquina donde corra win98+directX7. Y si la máquina es buena el juego irá a mayores fps.

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa