Desarrollo de videojuegos

Iniciado por Ariath, 8 Septiembre 2010, 12:22 PM

0 Miembros y 3 Visitantes están viendo este tema.

Komodo

#20
Sacar información de lo que hace el cursor no es nada complicado gracias a Allegro, gracias a este code, podemos conseguir una especie de shooter.

Os pongo el code y una pantalla de lo que hace, no explicaré nada porque es más sencillo que el agua.

Pantalla:


Code:

Código (cpp) [Seleccionar]
#include <allegro.h> //It's my love

//BY P4|3L0-KOMODO

int main()
{
    allegro_init();
    install_mouse();
    install_keyboard();

    set_color_depth(16);
    set_gfx_mode(GFX_AUTODETECT_FULLSCREEN, 1024, 768, 0, 0);

    BITMAP* mouse_image = load_bitmap("pointer.bmp", 0);
    BITMAP* buffer = create_bitmap(screen->w, screen->h);

    position_mouse(50,50);

    while(!key[KEY_ESC])
    {
        draw_sprite(buffer, mouse_image, mouse_x, mouse_y);
        textprintf_ex(buffer,font,mouse_x,(mouse_y-30),makecol(0,255,255),-1,"%i %i",mouse_x,mouse_y);

        if(mouse_b&1 && mouse_b&2){
            textprintf_ex(buffer,font,50,50,makecol(250,0,255),-1,"Estas pulsando el boton izquierdo y el boton derecho");
        }
        else
        {
            if(mouse_b&1)
                textprintf_ex(buffer,font,50,50,makecol(255,0,0),-1,"Estas pulsando el boton izquierdo");

            if(mouse_b&2)
                textprintf_ex(buffer,font,50,50,makecol(0,0,255),-1,"Estas pulsando el boton derecho");

            if(mouse_b&4)
                textprintf_ex(buffer,font,50,50,makecol(0,255,0),-1,"Estas pulsando el boton central");
        }

        blit(buffer, screen, 0, 0, 0, 0, screen->w, screen->h);
        clear_bitmap(buffer);
    }

    return 0;

} END_OF_MAIN()


Necesitais el pointer.bmp, que sería simple y llanamente un bmp con forma de puntero.



Espero que os guste.


Ariath

Esto... ¿Me pasa solo a mí el verte los caracteres acentuados como interrogaciones?

Es parecido a SDL por lo que veo.

Por cierto... ¿Qué son estos dos parámetros?

textprintf_ex(buffer,font,50,50,makecol(255,0,0),-1,"Estas pulsando el boton izquierdo");

Salu2


P.D: Acordaos de usar las etiquetas GeSHi, que queda el código mucho más presentable. Si solo es añadirle el =cpp a la primera etiqueta del code :P .

Komodo

no, ariath es que esto es de http://foro.code-makers.net/forum/ y cambiaron la BD ahora edito.

Hace ya mucho que no toco allegro, pero lo makecol es el color... RGB algo obvio si ves que los valores son 3 y no superan 255 jajaja

y el otro pues ni idea, me lo aprendi usando el -1 y en todos se usa -1.

Ahora edito y añado más codes ;D


EvilGoblin

Komodo No es por insinuar nada.. pero ese puntero no sirve xD

tiene q ser al reves... pork el unico pixel que se marca al pulsar es 1,1 .. lo demas es solo dibujo... :P

Utilize una vez allegro.. parece util para los Juegos en 3D.. pero para eso aprenderia Ogre3D (motor grafico) ya que utilizar OpenGL seria demaSiado complejo para un juego x.X
Experimental Serial Lain [Linux User]

[D4N93R]

Yo preferiría usar lirrlicht.. :P A ver que sale

Ariath

He modificado un poco el código, ordenándolo para que quede más "mono" :) .

No se porque, pero cuando corrijo textos de mensajes retocando espacios, a veces en la previsualización, los espacios aparecen como cosas al estilo de %20 o algo así (no recuerdo ahora mismo el texto exacto).

Salu2

Komodo

¿Por qué a ver?

por cierto me funcionaba.


[D4N93R]

Si ariath, a mi a veces me ha pasado eso.. :S

EvilGoblin

Cita de: Komodo en 10 Septiembre 2010, 15:22 PM
¿Por qué a ver?

por cierto me funcionaba.

Si quisieras apuntar precisamente a un objeto pequeño no podrias...

El pixel que funciona de puntero es 1,1 (osea la esquina superior izquierda...)

Claro, almenos que lo hagas con algun programa y sea .cur que le podes indicar que pixel es el que funciona como cursor para hacer click
Experimental Serial Lain [Linux User]

[D4N93R]

#29
Veamos como hice el juego del Snake en C# (como el de Nokia) aunque el mio tiene una especie de Level Manager. Solo uso GDI+ o Graphics en .Net, vamos es lo mismo xD
UPDATE: VIDEITO!! :D
Note: Ojo, es importante conocer que jugué rapidito, y que ya yo me pasé todos mis niveles sin trampa! xD luego subo otro video en donde aparezcan las culebritas malas!
Note2: Hay que esperar que se procese el videito!
[youtube=425,350]http://www.youtube.com/watch?v=CgvD00qXmFs[/youtube]


Primero hacemos el modelo de componentes:

El SnakeBase, ba a ser nuestra base de la culebra, porque este juego tiene culebras malas xD
http://pastebin.com/3FyG9igV

Direction es solo un enum:
Código (csharp) [Seleccionar]
public enum Direction
{
     Up=0, Left, Down, Right
}


Esta es nuestra culebra buena http://pastebin.com/wmYxxitm
Y este es la clase para las malas: http://pastebin.com/eVZWeCKG

Clase para los niveles(Level) http://pastebin.com/NEcQ4VWX
Y esta es la clase que administra los niveles: http://pastebin.com/Z8ipvYCk

Los extraItems como las manzanitas esas son estas: http://pastebin.com/sBCA5Af7
Y el board es el siguiente: http://pastebin.com/m9R5VmTi

Ahora explicamos las partes importantes y cruciales del juego:

Para dibujar el juego creé un control de usuario para así usar la DLL en la aplicación que yo quiera xD estilo easternegg xD

Cómo? bueno, primero el control debe tener los siguientes atributos:
Código (csharp) [Seleccionar]

SetStyle(ControlStyles.SupportsTransparentBackColor, true); //auto descriptivo
SetStyle(ControlStyles.AllPaintingInWmPaint, true); // Siempre true si usamos UserPaint, con esto evitamos flicker en el formulario
SetStyle(ControlStyles.UserPaint, true); //Auto descriptivo
SetStyle(ControlStyles.DoubleBuffer, true); // Habilita el double buffer en el control
SetStyle(ControlStyles.Opaque, true);


Como el juego es MUY sencillo lo hice con un Timer xD No el renderizado sino el control del juego como tal., Este es el código del tick:

Código (csharp) [Seleccionar]
t.Interval = board.Interval; //define la velocidad del juego, si cambia de nivel, el interval se reduce por lo que va "más" rápido.
board.GoStep(); //Ya veremos que hace esto más adelante
board.UpdateArray(); //actualiza el array del juego
this.Refresh(); // como se hizo una modificación en el array se refresca el control para que se invoke el evento paint.


Ahora me dirán, de qué array habla este loco xD, pues el juego en sí es un array, es una forma fácil de hacerlo y va bastante bien. En cada posición hay un número que indica qué hay en el tablero :)

en el OnPaint del control que se llama cuando hacemos Refresh se hace lo siguiente:
Código (csharp) [Seleccionar]

e.Graphics.Clear(Color.Black); //borra todo y lo pinta de negro
DrawBoard(e); // dibuja el tablero como tal
DrawSnakeAndLevel(e); // self descriptive -.-
DrawStat(e); // dibuja el score y eso..



Se qué no debo publicar codes muy largos, pero es necesario hacerlo para no ir tanto a pastebin :D
Código (csharp) [Seleccionar]

private void DrawSnakeAndLevel(PaintEventArgs e)
{
   if (Board.WaitForUser)
       return;
   int[,] array = board.Array;
           
   //iteramos todos las posiciones del array y vemos cada valor y pintamos lo correspondiente
   for (int y = 0; y < boardSize; y++)
   {
       for (int x = 0; x < boardSize; x++)
       {
           Brush tmpColor = null;
           if (array[x, y] == 1)
               tmpColor = Brushes.Green; //1 es la culebra buena, es decir el player, y es verde :D
           else if (array[x, y] == 5)
               //si es 5 es una manzana, por lo que no pintamos un punto de un color e especial
               //la manzana se pinta dento de ese method por lo que le referenciamos el e.Graphics
               DrawApple(e.Graphics, Brushes.Red, Pens.Green, x, y);
           else if (array[x, y] == 99)
               tmpColor = Brushes.Blue;
           else if (array[x, y] == 50)
               tmpColor = Brushes.Yellow;
           else if (array[x, y] == 1000)
               DrawApple(e.Graphics, Board.m_extraItem.Color, Pens.Green, x, y); // 1000 es un extra item!

           if (tmpColor != null)
               e.Graphics.FillRectangle(tmpColor, (x * lineSize) + 6, (y * lineSize) + 31, lineSize, lineSize);
       }
   }
}

private void DrawApple(Graphics e, Brush brush, Pen pen, int x, int y)
{
  //bueno, intento dibujar una forma de manzana, solo Dios sabe que hice en el code xD
   e.FillPie(brush, (x * lineSize) + 5, (y * lineSize) + 30,
                   lineSize + 1, lineSize + 1, -60, 330);
   e.DrawLine(pen,
       (x * lineSize) + lineSize / 2 + 5, (y * lineSize) + 30 + lineSize / 2,
       (x * lineSize) + lineSize + 5, (y * lineSize) + 30);
   e.DrawLine(pen,
       (x * lineSize) + lineSize / 2 + 5, (y * lineSize) + 30 + lineSize / 2,
       (x * lineSize) + lineSize + 5, (y * lineSize) + 30 - 1);
   e.DrawLine(pen,
       (x * lineSize) + lineSize / 2 + 5, (y * lineSize) + 30 + lineSize / 2,
       (x * lineSize) + lineSize + 5, (y * lineSize) + 30 - 2);
}


private void DrawBoard(PaintEventArgs e)
{
   // nada mas que un rectangulo azul xD
   e.Graphics.DrawRectangle(Pens.Blue, 5, 30, boardSize * lineSize+1, boardSize * lineSize+1);
}


private void DrawStat(PaintEventArgs e)
{
   //puros strings , es decir los scores.. bastante self descriptive el code..
   e.Graphics.DrawString("Level: " + board.LevelIndex.ToString(), new Font("Arial", 10), Brushes.LightBlue, 5, 5);
   e.Graphics.DrawString("Lives: " + ((board.Lives < 0) ? "0" : board.Lives.ToString()), new Font("Arial", 10), Brushes.LightBlue, 110, 5);
   e.Graphics.DrawString("Score: " + Board.Score.ToString().PadLeft(9,'0'), new Font("Arial", 10), Brushes.LightBlue, 199, 5);
           
   if (Board.Lives == 0)
       e.Graphics.DrawString("Game Over", new Font("Arial", 20), Brushes.LightBlue, (boardSize * lineSize) / 4, ((boardSize * lineSize) / 2)+40);
   if (Board.WaitForUser)
       e.Graphics.DrawString("Press any key to start level " + Board.LevelIndex.ToString(), new Font("Arial", 15), Brushes.LightBlue, 20, ((boardSize * lineSize) / 2) + 15);

   e.Graphics.DrawString("Items Left: " + board.LevelTotalItems.ToString(), new Font("Arial", 12), Brushes.LightBlue, 120,boardSize * lineSize +40);
}


Bueno por ahora eso es todo, si checkan el código y no entienden o no están seguros de qué hace, postean y respondemos..

Un saludo :P