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

181
Preguntas y respuestas / Re:Desmembrar un string
Septiembre 08, 2018, 08:59:39 PM
Hola empardopo

Claro que se puede, tu puedes establecer el criterio. Existe la función "string_copy" que toma una parte del texto tal como lo hace la función "EXTRAER" del Excel. También está "string_delete" que hace algo parecido, pero te borra el rango que le indicas y deja todo el resto.
var str_total = "ACE09:09"
var str1 = string_copy(str_total,1,3)
var str2 = string_delete(str_total,1,3)

En el ejemplo de arriba.
str1 = ACE
str2 = 09:09

Favor ten en cuenta que en las strings el primer caracter tiene índice "1" (y no cero como en la mayoría de listas, loops, arrays, etc)
También ten en cuenta que si usas esta función para extraer números, esos "números" quedan en formato de texto, no los puedes usar para operaciones matemáticas, primero debes convertirlos a números de nuevo mediante la función "real()".

Te recomiendo que leas la documentación, al final puedes encontrar la lista de funciones que te ofrecen las strings de Game Maker.
https://docs2.yoyogames.com/source/_build/3_scripting/4_gml_reference/strings/index.html
182
Preguntas y respuestas / Re:Draw Gui y su posicionamiento
Septiembre 08, 2018, 06:26:58 PM
Hola Jalealf

Si estás dibujando en la GUI, entonces son las coordenadas respecto de la GUI, no tiene relación con la room. La GUI es una surface a parte de la del juego, por lo que tiene su propio tamaño. Dibujar el sprite en x=0;y=0 significa que lo estás dibujando en la esquina superior izquierda de la GUI y tu sprite se dibujará en esa orilla.

Saludos
183
Hola Skynacoss

Todo depende de cómo haces que el personaje se mueva.
Asumiré que estás usando una variable de dirección entre 0 y 359 grados

Si la nueva dirección es de 180 grados (la vuelta completa hacia atrás), lo haces girar 90 (un giro hacia el lado).
Un ejemplo con variables inventadas podría ser así:
if abs(angle_difference(new_direction,old_direction)) = 180 {
new_direction = choose(old_direction-90,old_direction+90)
}


Eso calcula que si el personaje debe dar la vuelta a 180 grados hacia atrás, en vez de eso, elije irse 90 grados a la derecha o 90 grados a la izquierda, no importa cual de las 4 direcciones vaya, 0, 90, 180 o 270 grados.

Saludos
184
Preguntas y respuestas / Re:Juego de Cartas Multijugador
Septiembre 08, 2018, 05:31:09 PM
Hola mamaffia

En internet está lleno de tutoriales de cómo hacer funcionar la modalidad "multijugador" en Game Maker.
Un ejemplo de ello es este video de HeartBeast
https://www.youtube.com/watch?v=MbUsHVak_yA

Si lo vas a hacer de 2 jugadores, yo te recomiendo NO separar el juego en server y cliente, sino que haces que en el mismo juego, que el objeto pueda ser server o cliente con una variable (para saber si debe crear el server o conectarse a una IP).

Sobre lo de "saber las cartas del rival", no es necesario que las conozcas ni usar views ni distintas rooms, ya que se supone que cada jugador va a abrir el juego en dispositivos diferentes, por lo cual, cada uno va a dibujar su propia información. Sólo basta con conocer el número de cartas que posee el rival y dibujar "n" veces la parte de atrás de las cartas.
Ej: Si el rival tiene 8 cartas, dibujas 8 veces el sprite de la carta por detrás. Mientras que tus cartas las dibujas normal.

Saludos
185
Preguntas y respuestas / Re:Tema sonido
Septiembre 08, 2018, 05:49:16 AM
Hola empardopo

La cantidad de sonidos que pueden ejecutarse simultáneamente los determina la función audio_channel_num. (por defecto Game Maker Studio te permite reproducir 128 sonidos al mismo tiempo).
Si reproduces más sonidos de los permitidos, entonces los sonidos con menor prioridad son ignorados en favor de los sonidos creados con mayor prioridad.

Si crees que tu sonido está muy fuerte y quieres bajar el volumen, te recomiendo utilizar un software externo de edición de audio para normalizar todos los sonidos de tu juego, así no hay sonidos más fuertes que otros.
De todas formas Game Maker tiene la función "audio_sound_gain" para cambiar el volumen in_game de cualquier sonido.
puedes usar: audio_sound_gain(sonido1,0.5,0)
Esa función reducirá a la mitad el volumen del sonido1.

Saludos
186
Hola HKaichim

No entendí lo que quieres decir con el "ya siendo elegidas desde antes", pero Game Maker te permite enlazar una tecla a otra tecla mediante la función "keyboard_set_map". Eso significa que al pulsar una tecla, en realidad Game Maker detecta que estás pulsando otra.
En el Create Event.
keyboard_set_map(vk_right,ord("D"))
keyboard_set_map(vk_up,ord("W"))
keyboard_set_map(vk_left,ord("A"))
keyboard_set_map(vk_down,ord("S"))


Eso enlaza las flechas de dirección a su respectiva letra en WASD, cada vez que pulsas una flecha en tu teclado, para Game Maker en realidad estás pulsando una letra WASD.

De esa forma, puedes hacer:
if keyboard_check(ord("D")) { x += hspeed }
Para moverte tanto con la flecha derecha, como con la tecla "D".

Saludos
187
Preguntas y respuestas / Re:4 tablas de records
Septiembre 07, 2018, 07:35:25 PM
Hola empardopo

La función "ds_grid_write" convierte la grid en una cadena de texto, tu puedes convertir las 4 en texto y guardarlas en el mismo archivo ini. Después para leerlas, debes usar el "ds_grid_read".

Respecto al orden, no cambia el contenido de la grid, sólo ordena las celdas de manera ascendente o descendente según la columna que le indicas mediante la función "ds_grid_sort".
Si le indicas la columna 0, te ordenará los nombres alfabéticamente (que no es lo que queremos)
Si le indicas la columna 1, te ordenará los puntos, ya sea de forma ascendente o descendente, manteniendo su respectivo nombre al lado obviamente (es tal cual como lo has mencionado en el primer ejemplo que me has mostrado en tu mensaje anterior)

El problema es que para añadir nuevos registros, tienes que hacer un loop hasta encontrar un registro vacío, luego insertar los datos en ese registro y después ordenar la grid de nuevo.
Si recorres las 10 posiciones y no encuentras un espacio vacío, (suponiendo que la grid ya está ordenada por puntos) puedes verificar si la puntuación que ganaste ahora es mayor que la puntuación más baja de la tabla (último registro), si la nueva puntuación es mayor, entonces eliminas el última registro de la tabla, insertas tu nueva puntuación y re-ordenas la tabla.

Saludos
188
Preguntas y respuestas / Re:4 tablas de records
Septiembre 07, 2018, 06:46:10 PM
Hola empardopo

Nunca lo he hecho antes, pero puedes intentar usar 4 grids de 2x10, así puedes guardar diez registros del par "nombre-puntos". Incluso puedes usar la misma variable para guardar los 4 ID de las grid.
Ejemplo de creación
puntos[0]=ds_grid_create(2,10)
puntos[1]=ds_grid_create(2,10)
puntos[2]=ds_grid_create(2,10)
puntos[3]=ds_grid_create(2,10)


La ventaja de las grid es que las puedes guardar en archivos de texto ini o txt usando "ds_grid_write", así cuando inicias un nuevo juego, puedes cargar la puntuación anterior.
Además puedes sortear las columnas para ordenar los registros por puntos, así muestras los mejores puntajes primero.
Recuerda siempre eliminar las grid después de usarlas.

Saludos
189
Hola Luis En

En ese caso, mejor controlarlo con una variable. Para este ejemplo la llamaré "mouse_in"
En el Create Event
mouse_in = false //Indica si el mouse está dentro del objeto o no

En el Step Event
if position_meeting(mouse_x,mouse_y,id) { //Revisa si pones el mouse encima de este objeto
if mouse_in = false { //Esto sólo ocurre si antes de poner el mouse en el objeto, la variable era false
reproduce el sonido aquí //Ocurre el sondio
mouse_in = true //Hace la variable true para que no ocurra de nuevo este bracket (y no se repita el sonido)
}
}
else { mouse_in = false } //Cuando sacas el mouse del objeto, la variable se hace false y el sonido puede sonar otra vez


En el Draw Event
if mouse_in { (dibuja el sprite cuando el mouse está encima) }
else { (dibuja el sprite normal) }


Saludos
190
Hola Luis En

No debes colocar nada en "id", así se llama la variable de sólo lectura que te entrega el instance ID del objeto que está corriendo el código.
De esa forma puedes discriminar y detectar la colisión sólo entre las coordenadas del mouse y el objeto que tiene el código.

Si por el contrario llegas a cambiar el "id" por el nombre del objeto, ej: obj_boton, cuando pones el mouse encima de cualquier obj_boton de la room, todos los obj_boton de la room detectarán que el mouse está encima de ellos al mismo tiempo cuando en realidad no es así porque el mouse sólo está encima de uno.

Saludos
191
Hola Luis En

Creo que buscas la función: "position_meeting" (no confundir con la común place_meeting). Esta función detecta una "colisión" como le llamas tu entre una coordenada y un objeto con sprite (o máscara de colisión).
Esto debe ir en el Draw Event del objeto al que quieres dibujarle dos sprites según la posición del mouse
if position_meeting(mouse_x,mouse_y,id) { draw_sprite(el sprite cuando el mouse está encima) }
else { draw_sprite(el sprite normal aqui xD) }


Saludos
192
Preguntas y respuestas / Re:Evento por teclado
Septiembre 07, 2018, 12:33:39 AM
Hola GGrayonar
Para detectar letras tienes que hacer referencia al valor unicode de la letra. Para ello Game Maker dispone de la función ord().
Ejemplo:
If keyboard_check(ord("z"))

Saludos
193
Hola Reaper.
Depende del tipo de variable.
Las variables normales que comunmente usamos en Game Maker, que se definen como "poder = 1" se les llama "instance variable" porque sólo existen en esa instancia.
Si creas 3 objetos iguales en una room, game maker los reconoce como 3 instances diferentes y cada una puede tener su propia variable "poder" con un valor diferente para los tres. Así que la respuesta a tu pregunta es "sí"

Caso contrario ocurre con las variables locales que sólo existen en un bloque de código (se declaran como "var nombre = valor") y variables globales (se declaran comunmente como "global.nombre = valor"). Estos dos tipos de variables son únicos y todos los objetos pueden acceder a ella con el mismo nombre
194
Hola empardopo

Exacto, el "instance_position" reemplaza el "mouse enter" y "mouse leave", pero ahora que reviso bien, el "instance_position" devuelve el ID del objeto.
Lo correcto era usar "position_meeting" que hace exactamente lo mismo, pero devuelve "true" o "false".

Respecto a tu consulta sobre trigonometría, no sé bien la teoría, lo siento, podrías buscar en google o youtube y quizás alguien lo explique bien.

Pero en la práctica, la función "cos(angulo en radianes)" te devuelve un valor entre -1 y 1 según el ángulo que le das.
cos(0°) = 1
cos(90°) = 0
cos(180°) = -1
cos(270°) = 0
Y así va oscilando entre en ese rango a medida que aumentas el ángulo. Siempre toma valores dentro del mismo rango
1 > 0 > -1 > 0 > 1 > 0 > -1
Como en Game Maker la función "cos" usa los ángulos en radianes, puedes usar "degtorad(angulo)" para convertir un ángulo normal a radianes, yo no he usado esa función antes porque en el código que te pasé usé directamente el ángulo en radianes, por eso se ve el "2*pi" todo raro entre medio.

Ese valor que recibes de la función "cos" entre -1 y 1 se lo he asignado a la image_xscale y eso es lo que hace el efecto, la imagen se achica hasta hacerse cero y luego crece invertida hasta llegar al tamaño original, luego se vuelve a achicar hasta cero y después se agranda pero en la posición correcta y así hasta el infinito xd pero visualmente da la falsa sensación de que el objeto está girando.

Saludos
195
Hola empardopo

Lamentablemente no he entendido lo que intentas lograr.
Si haces al personaje en 3D quizás puedas realizar el giro que deseas xD

A mi lo único que se me ocurre es que al sprite le asignes como punto de origen su centro (en las propiedades del sprite).
Y lo hagas girar con el image_xscale.

El siguiente código crea el efecto de una rotación sencilla (con velocidad constante) mientras posas el mouse encima. La rotación se detiene cuando sacas el mouse de encima, pero para no dar un efecto de quiebre, el objeto continúa girando hasta que llega de nuevo al punto inicial.

CREATE EVENT:
angle = 0
rotacion = false


STEP EVENT:
rotacion = false
if instance_position(mouse_x,mouse_y,id) { rotacion = true }

if (rotacion) || (angle != 0) {
angle += 2*pi/room_speed
if angle >= 2*pi { angle = rotacion*(angle-2*pi) }
}


DRAW EVENT:
draw_sprite_ext(sprite_index,image_index,x,y,cos(angle),image_yscale,image_angle,c_white,image_alpha)

Fuera de eso no veo cuál es el efecto que quieres lograr, quizás si nos muestras alguna imagen pueda entenderlo mejor.

Saludos