Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mensajes - Jucarave

76
Juegos en desarrollo / Wraith [A.0.1]
Febrero 15, 2016, 04:08:24 PM

Wraith

Shooter / Tower Defense

GM: Studio

Wraith es un first person shooter mezclado con un tower defense, fue desarrollado en 9 días para un challenge cuyo objetivo era hacer un juego sin utilizar las funciones d3d de Game Maker. La versión actual incluye:


  • Utilización de raycaster para el rendering 2.5D
  • 3 Niveles
  • 3 Tipos de enemigos
  • 2 Armas
  • 2 Torres (con la opción de una mejora)

Esta versión no contiene un tutorial (o instrucciones) así que los controles son:


  • Movimiento: WASD
  • Rotar: Movimiento de mouse
  • Cambiar armas: '1' para pistola y '2' ametralladora (la segunda solo esta disponible en el último nivel)
  • Torres: 'Z' para torreta, 'X' para torre que hace lento a los enemigos
  • Mejorar torres: 'Q'
  • Ejecutar acción: 'E'
  • Salir del juego: 'Esc' no hay sistema de guardado en esta versión.

Ahora comenzare a trabajar en la nueva versión, lo primero que haré es cambiar el motor de un raycaster 'fake' 3D a un true 3D usando las funciones d3d de GM, y luego eliminaré todas las referencias a Wolfenstein para poder contar una historia decente







El juego esta aún en etapa primitiva pero me gustaría saber como sienten las mecánicas (movimiento y eso), para tener una idea sobre que enfocarme.

Versiones Disponibles:
[spoiler]Versión A.0.1: (15/02/16) Esta primera interacción es la misma que se presentó al challenge, contiene sprites y textures extraídos del juego Wolfenstein 3D y corre bajo un rendering tipo raycaster. El juego y el editable del mismo están disponibles:

Descargar A.0.1
Proyecto GMZ A.0.1

[/spoiler]

Eso sería todo por ahora :)

Saludos 8)
77
Videojuegos / Re:¿Juegos favoritos de la comunidad?
Febrero 14, 2016, 10:26:18 PM
Cita de: Mega G en Febrero 14, 2016, 10:20:44 PM

El shooter que dice Jucarave me suena mucho. Es del mismo creador de Angus Special Agent.  Puede ser que sea ¿Undead Frenzy? Era un juegazo con unos gráficos alucinantes. Aquí tienes una captura:
Aquí parece que se puede descargar: http://game-maker.galeon.com/aficiones2285259.html

Si si si ese mismo XD ahora mismo lo descargo :D
78
Videojuegos / Re:¿Juegos favoritos de la comunidad?
Febrero 14, 2016, 09:29:57 PM
Lastimosamente no recuerdo todos  :'( pero entre mis favoritos estan (sin ningún orden en particular):


  • Boseto
  • Ignorancia Artificial
  • CGM The Game
  • Doomed Dungeon
  • Chocobo Race
  • Un metroidvania que no recuerdo el nombre pero el personaje era un cubito amarillo  XD
  • Undead Frenzy

Se que hay mas, pero esos son los que se me vienen ahora a la mente.
79
Debes utilizar las funciones de "file_text_read_string" y "file_text_read_real" para leer correctamente. Las lineas quedaron almacenadas en el array llamado "str", entonces para acceder a las lineas simplemente puedes hacer:

[gml]
// Imprime la primera linea:
show_message(str[0]);
// Imprime la segunda linea
show_message(str[1]);
....
[/gml]

también lo puedes hacer con un for recursivo

[gml]
// En algún evento draw...
var length = array_length_1d(str);
for (var i=0;i<length;i++){
    draw_text(16, 16 + (16 * i), string(str));
}
[/gml]

Saludos

80
Hola, para solucionarlo (aunque depende también de tu caso) debes utilizar una matriz de rotación; este es un pequeño script que acabo de publicar:

http://www.comunidadgm.org/desarrollo-de-scripts/obtener-posicion-de-adjuntado/

Saludos
81
Desarrollo de Scripts / Obtener posición de adjuntado
Febrero 07, 2016, 04:31:34 AM
Hola a todos, este es un script que ya había presentado en una respuesta de una pregunta, pero hoy preguntaron algo similar así que decidí hacer un script oficial (o algo así):

Autor: Jucarave
Versión de GM utilizada: Game Maker Studio (aunque debería funcionar al menos en :GM8:)
Descripción: Obtiene la posición absoluta 'x' y 'y' a la cual se debe crear o dibujar un objeto que se quiere adjuntar a otro, por ejemplo: supongamos que tenemos un persoanje visto desde arriba y su sprite esta en el centro de su cabeza, el tiene un arma y el cañón se encuentra en una posición diferente del sprite (Revisar attachment 1)

Códigos:

Primero el script
[gml]
/*
* get_attachment_position(x, y, x_offset, y_offset, sprite_angle);
*
* argument[0]: Posición x del objeto
* argument[1]: Posición y del objeto
* argument[2]: Posición x del adjunto relativa al origen del objeto
* argument[3]: Posición y del adjunto relativa al origen del objeto
* argument[4]: Angulo del objeto (en grados)
*
* returns: array con la posición del adjunto: [x, y]
*/

var _x, _y, _sx, _sy, _ang, _ca, _sa, attach_x, attach_y, ret;

_x = argument[0];
_y = argument[1];
_sx = argument[2];
_sy = argument[3];
_ang = degtorad(argument[4]);

_cos = cos(_ang);
_sin = sin(_ang);

ret[0] = _x + _sx * _cos + _sy * _sin;
ret[1] = _y + _sy * _cos - _sx * _sin;

return ret;
[/gml]

Ahora simplemente para usarlo (utilizando la imagen de referencia del adjunto) vamos a crear un misil en la posición del cañón:

[gml]
// Evento clic del mouse

// Obtenemos la posición donde crear el misil
var missil_position = get_attachment_position(x, y, 36, 13, image_angle);

// Creamos el misil
instance_create(missil_position[0], missil_position[1], obj_misil);
[/gml]

Este script también puede ser utilizado cuando queremos dibujar cosas relativas a una posición  (por ejemplo dibujar el arma en la posición de la mano del jugador) y básicamente cualquier caso en el que tengamos que hacer uso de posiciones relativas cuando nuestro sprite pueda cambiar su angulo de imagen.

Saludos.
82
Juegos completos / Re:RandoomPain
Enero 29, 2016, 03:38:45 AM
Hola,

acabo de probar tu juego y la verdad es que esta muy bueno, hay un par de detalles que igual quería mencionarte:

* La creación del nivel toma mucho tiempo incluso para ser un generador aleatorio (no se si :GM8: tendrá algo que ver con la velocidad)
* Creo que sería mucho mejor invertir mas tiempo en el generador para crear niveles mas interesantes (tal vez utilizar diferentes tiles y que se noten mejor como se separa una area de la otra)
* Hay ocaciones en las que se laguea el juego (y tengo un muy buen pc) supongo que es porque ejecutas muchas instancias (o tal vez tenga que ver con el modo en el que dibujas el mapa)
* Finalmente, en el nivel 3 lance una granada contra un enemigo y el juego crasheo por completo :-\

De todas formas me parece que el juego es divertido y me gusto mucho la variación de enemigos que pusiste ya que no son tan parecidos al menos en los temas de ataques.

Soy un gran fan de los roguelikes así que me encantan ver este tipo de desarrollos en GM :D

Saludos
83
Aquí esta el ejemplo que había prometido (al final la ecuación que te dí si estaba correcta :P ) lo interesante esta en el script "fix_position", te mueves con WASD y los cañones apuntan directamente al mouses

Saludos 8)
84
Hola,

Lo que necesitas para girar la nave y que los cañones giren con la nave y luego giren independientemente es utilizar matrices de rotación, se que game maker tiene unas funciones para manejarlas en 3D (no se si en 2D), te haría un ejemplo (o dibujos) también pero no estoy en mi casa :-[

Sin embargo funciona algo así:

supongamos que el sprite de la nave esta mirando normalmente hacia la derecha (angulo 0) lo mismo que los cañones (así podemos girar normalmente sin tener que cambiar giros)

ahora, digamos que el sprite de la nave esta en su centro (que digamos por ahora es x:16px, y:16px) y digamos que el cañon se encuentra a 8px horizontalmente  y 6px verticalmente de la nave entonces:

[gml]
// Dibuja la nave centrada
draw_sprite_ext(spr_nave, 0, x, y, 1, 1, angulo_nave_en_grados, c_white, 1);

//Dibuja el cañon con ofset del centro de la nave
draw_sprite_ext(spr_cannon, 0, x+8, y+6, 1, 1, angulo_cannon_en_grados, c_white, 1);
[/gml]

Ahora el problema es que si giramos la nave (y el cañon) este no se va a quedar en su sitio, por eso necesitamos hacer una pequeña matriz de rotación para obtener su posición relativa (si de aquí a que llegue a mi casa no te han solucionado esto te hago un script mucho mejor :P )

basicamente estamos dibujando el cañon en x+8, y+6 ahora vamos a cambiar eso:

[gml]
// No estoy 100% seguro que sea así, no tengo como probarlo ahora pero la idea es esta:
var cannon_x = x + 8 * cos(angulo_nave_en_radianes) + 6 * sin(angulo_nave_en_radianes);
var cannon_y = y + 6 * cos(angulo_nave_en_radianes) - 8 * sin(angulo_nave_en_radianes);

// Dibuja la nave centrada
draw_sprite_ext(spr_nave, 0, x, y, 1, 1, angulo_nave_en_grados, c_white, 1);

//Dibuja el cañon con ofset del centro de la nave
draw_sprite_ext(spr_cannon, 0, cannon_x, cannon_y, 1, 1, angulo_cannon_en_grados, c_white, 1);
[/gml]

Y esto debería solucionar tu dilema ???

en fin, si ahora no esta listo te hago el ejemplo 8)

Saludos

EDIT: un pequeño cambio en el cálculo
85
Preguntas y respuestas / Re:Crear un color
Enero 25, 2016, 12:43:53 PM
Hola,

Para crear colores tienes la función "make_colour_rgb(r, g, b)" los cuales utiliza valores entre 0 y 255, adicionalmente también existe la función "make_colour_hsv(hue, sat, val)" para crear colores basados en hue, saturation, value (luminosidad)

Saludos
86
Basicamente son canvas en los que puedes dibujar sobre ellos y luego dibujarlos a ellos... es decir, digamos que tienes un fondo en el escenario el cual se compone de muchas imagenes individuales, sin embargo el fondo no se mueve durante el juego así que tendrías que dibujar cada imagen individualmente durante cada frame del juego... o, puedes dibujar todas esas imagenes en un surface y luego dibujar ese surface como si fuera una sola imagen.

Para usarlos primero debes crear el surface "surface_create" y luego es simplemente decirle al GM: dibuja el siguiente sprite (o grupo de sprites) sobre este surface "surface_set_target" y luego cuando terminas reinicias el target para que GM dibuje normalmente "surface_reset_target" y dibujas el surface con el comando de "draw_surface" y listo.

Hay varias restricciones, y problemas que se pueden presentar los cuales hay que tener en cuenta, para esto es mejor que revises el manual sobre el tema de surfaces, ahí se explica todo con varios ejemplos.

Saludos
87
Puedes crear un script que formatee el numero como lo necesitas:

[gml]
// scr_formato

var number = argument[0];
if (number < 10){
  return "0" + string(number);
}

return string(number);
[/gml]

y luego simplemente lo llamas

[gml]
var hora = scr_formato(horas) + ":" + scr_formato(minutos);
[/gml]

Saludos
88
Hola,

La iluminación para un vertice se calcula haciendo el producto punto entre los vectores de la normal y la dirección de la luz (muy simple de hecho), pero por lo general esto se hace en los shaders directamente para poder dibujar con iluminación los vertices. Si quieres hacer uso de esos valores tendrías que calcularlo manualmente:

El producto punto es el coseno del angulo formado entre los dos vectores, supongamos que tienes dos vectores A(0.70, 0.70) y B(1.0, 0.0) entonces el producto punto es (Ax*Bx+Ay*By) y el resultado es 0.70 que es también el coseno de 45°. con GMS existe la función "dot_product_3d(x1,y1,z1,x2,y2,z2)" para hacer este calculo...

Ahora bien supongamos que vamos a calcular la cantidad de luz que recibe la cara superior que tiene la normal (x:0,y:0,z:1) (suponiendo que el arriba es el eje z) y que estas usando una luz direccional cuya dirección es: (x:0,y:0,z:-1) entonces lo primero que debemos hacer (o deberiamos hacer) es invertir la dirección de la luz para el calculo de este modo nuestros 2 vectores (que por cierto deben estar normalizados) quedan:

normal: (0,0,1)
luz: (0,0,1)

el producto punto es: 0*0 + 0*0 + 1*1 = 1; 1 significa que la superficie esta totalmente iluminada, menor o igual de 0 significa que no recibe luz y cualquier valor entre 0 y 1 es parcialmente iluminada.

si la dirección de la luz fuera (-1,-1,-1) o (-0.57, -0.57, -0.57) normalizada entonces el resultado sería

normal: (0,0,1)
luz: (0.57,0.57,0.57) //invertida

y el producto punto es: 0*0.57 + 0*0.57 + 1 * 0.57 = 0.57 osea que la superficie esta parcialmente iluminada.

Ahora esto puedes repetirlo para todas las luces que tengas y sumar sus resultados para obtener la cantidad de luz final.


Si quieres hacerlo para luces en un punto (es decir que la cantidad de luz varia en la superficie) el procedimiento es el mismo solo que la dirección se calcula restando la posición de la luz de la posición del pixel que estas evaluando.

Cabe mencionar que hacer esto fuera de los shaders puede ser un poco overkill así que manejalo con prudencia :)

Saludos

EDIT: cambié el 0.69 por 0.57 (mal calculo  :-[ )
89
La verdad no he hecho nada con UDP pero lo que estuve consultando se ve interesante... voy a echarle un ojo y si puedo te ayudo :P

Saludos
90
No estoy del todo seguro pero creo que es porque siempre estas retornando true cuando hacer release de mouse, tienes algo como esto:

[gml]
else if mouse_check_button_released(mb_left)
{
   if (dentro del boton){
      // escala imagen
      return true;
   }else{
      // escala imagen
   }

   return true; // <-- este es el problema, siempre retorna true cuando el player suelte el clic del mouse.
}
[/gml]

Saludos