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

226
Hola Marcusmaniacus

Puedes intentar usar los children objects.
Creas un objeto enemigo genérico y declaras como "children" (o hijos en español) a cada uno de los objetos enemigos que hayas creado. Esto se hace desde la edición del objeto.
Después sólo ejecutas el código haciendo referencia a tu objeto genérico y el código aplicará para todos los enemigos que hayas definido como hijo

Ejemplo:
Digamos que tienes 4 objetos:
Obj_enemy (padre)
Obj_enemy1 (hijo)
Obj_enemy2 (hijo)
Obj_enemy3 (hijo)
if place_meeting(x,y+1,obj_enemy)
{
Este código detecta colisión con los 3 hijos en 1 sola línea
}


Saludos
227
Hola chicagoserie

El error aquí puede ser cualquier cosa.
Empezando por el evento de creación de objetos, que creas las dos rocas en distinta posición horizontal...
instance_create_depth(x+50,y+0,0,obj_Roca_Superior);
instance_create_depth(room_width+50,py+dy,0,obj_Roca_Inferior);
Tienes que usar o una o la otra, pero debe ser la misma en ambas para que se vean al mismo tiempo.

Lo otro que puede ser el problema, es que la roca inferior se esté dibujando por debajo de la pantalla, puedes corregirlo cambiando el "origen en y" de las propiedades del sprite o ajustando su coordenada y cuando la generas.

Saludos
228
Hola empardopo

A mi entender no se puede hacer así, pero no significa que no puedas conseguir el mismo efecto. Lo que puedes hacer es crear un array de 2 dimensiones (piensalo como una cuadricula Excel)
inicial[0,0]=200
inicial[0,1]=200
inicial[0,2]=5


Saludos
229
Hola empardopo

Puedes pasar el array a una ds_list y usar ds_list_shuffle.

O si quieres mantener el uso de arrays, puedes intercambiar las posiciones aleatoriamente de la siguiente forma:
var i,rand,aux;
for (i=0; i<array_length_1d(inicial); i+=1) { //elige cada dato del array uno por uno
rand = irandom(array_length_1d(inicial)-1) //por cada dato del array, elige una nueva posición al azar.
aux = inicial[i] //Guarda el valor original
inicial[i] = inicial[rand] //Estas dos líneas intercambian las posiciones entre la leida y la aleatoria
inicial[rand] = aux
}


Si quieres crear un nuevo array llamado "final", te recomiendo utilizar un for loop para copiar el array inicial a uno llamado final y luego cambiar aleatoriamente las posiciones del array final.

Saludos
230
Preguntas y respuestas / Re:Problemitas con array XD
Agosto 19, 2018, 06:07:57 PM
Hola Edgamer63

Tu error es que el array tiene 65 datos (probablemente el índice va de 0 a 64) y estás intentado leer el dato "-56"
Si no has definido antes "array[-56] = algún valor", entonces te seguirá arrojando el mismo error (incluso aunque uses listas).

Respecto a lo que mencionas de las Data Structures, no tengas miedo de utilizarlas...
El caché sólo lo debes tener en consideración si creas una cantidad enorme de listas o si reinicias constantemente tu juego sin eliminar las listas antes con el ds_list_destroy porque ahí si se van acumulando en la memoria hasta que cierres tu juego.
A veces es más útil usar listas por las funciones que te ofrece, como el sort o el shuffle, etc.

Saludos
231
Hola chicagoserie

Efectivamente, GMS2 cambió la forma en la que se crean los objetos para adaptarlos a su nuevo layer system.
Puedes cambiar el instance_create por instance_create_depth.
Mantienes los mismos argumentos de la función, pero añades la depth (puede ser cualquier valor entre -16000 y 16000. Te recomiendo usar 0)

Por ejemplo:
/// @description  Generar rocas

dy = 672; // distancia entre las dos rocas

py = choose(-164,-128,-96,-64,-32,0);

instance_create_depth(x+50,y+0,0,obj_Roca_Superior);
instance_create_depth(room_width+50,py+dy,0,obj_Roca_Inferior);

alarm[0] = room_speed; // Generador ON


Saludos
232
Preguntas y respuestas / Re:Base de datos en GM?
Agosto 17, 2018, 05:48:05 AM
Hola tristy3

Depende de los datos que quieras almacenar.
Lo más común es utilizar archivos ini para almacenar info.

Los Ini son del tipo:
[section1]
key1 = value1
key2 = value2
key... = value...

[section2]
key3 = value3
key4 = value4
key... = value...

Son bastante útiles, fáciles de utilizar y lo mejor es que es fácil leer la información que contienen para usar en tu juego.

Te recomiendo leer el manual de Game Maker para que conozcas todas las funciones que ofrecen los archivos ini.

Saludos
233
Hola Marcusmaniacus

Eso pasa porque al hacer Full Screen, cambia el tamaño de la GUI, permitiendo que haya más espacio para dibujar.

Puedes aplicar 2 soluciones.

1- Ajustar la escala con la que dibujas tu sprite reemplazando el view_wview[0] por display_get_gui_width() y ajustar la coordenada Y en la que dibujas el sprite a:
display_get_gui_height()-35

2- Fijar el tamaño de la GUI al tamaño de la VIEW (en el Create Event)
display_set_gui_size(view_wview[0],view_hview[0]) //Código para GMS1.4
De esta forma, no importa que tamaño le des al juego, la GUI va a medir siempre lo mismo (esto es malo porque pierdes pixeles para dibujar en la GUI cuando estás en full screen o en resoluciones de pantalla más grandes, pero a veces uno busca conseguir este efecto).

Coméntanos si alguna de las dos te ha funcionado

Saludos
234
Hola Ares074

No sé cuál es la mejor forma de lograr lo que tu intentas hacer, quizás texto como dice Marth es la opción
más óptima.

Pero para hacer lo que quieres de dibujar un sprite por cada dígito se puede hacer de la siguiente manera:
Para que funcione bien, las sub-imágenes del sprite deben ir en orden: 0, 1, 2, ..., hasta el 9.

En el Draw Event
var str_danio = string(84) //primero convertimos el daño a "string". 84 es un ejemplo, tu usas tu variable daño
for (var i=0; i<string_length(str_danio); i+=1) { //un loop para ejecutar el código una vez por cada dígito
var digit = real(string_copy(str_danio,i+1,1)) //recibe el dígito con formato número.
draw_sprite(sprite_numbers,digit,x+16*i,y) //Dibujas el sprite usando de sub-image el dígito leido. Tu seteas las coordenadas, lo importantes es que añadas un offset (en este ejemplo el offset es 16, cada dígito se dibujará con 16 pixeles de separación.
}


Puedes añadir una condición para dibujar el número, como un temporizador o crear un objeto para dibujar el número en la pantalla, etc. Ahí buscas tu manera.

Saludos
235
Hola Marcusmaniacus

Interesante lo que quieres conseguir. Aunque en Game Maker los objetos tienen un mismo índice (object index), cuando los añades a la room, game maker les asigna un id único aunque sean el mismo objeto (instance id) que puedes usar.

Si tus NPC tienen un id propio interno que le hayas creado tu, hace las cosas más fáciles. Sino, puedes usar el instance ID del objeto para reconocerlo, pero cuando cambies de room y la generes de nuevo, cambiarán las ID de los objetos nuevos y ya no funcionará el código de seguimiento, por eso lo ideal es que cada NPC tenga su ID propio creado por ti.

Supongo que debe haber una interacción entre el lobo y el NPC, quizás un script por distancia o una colisión o no sé, es en ese momento cuando le puedes asignar al lobo el id de su dueño con una variable usando la constante "id" (o con "other.id" si estás usando un "with" o dentro de un evento colisión).

Todo depende del código que usas para que el NPC dome al lobo

Un ejemplo de cómo implementar la variable
CREATE del lobo
duenio = noone
STEP del lobo (funcionará luego que le asignas la variable duenio)
if dienio != noone { if instance_exists(dienio) { /*Ejecutas tu script para seguir a su dueño*/ } }

Saludos
236
Hola ZELDA

el problema de ese código es que estás usando las variables "Left" y "Right" como input, que seguramente le asignas valor con: "keyboard_check" en vez de "keyboard_check_pressed".
Eso es lo que causa que el personaje haga dash forever.

Te recomiendo crear dos variables adicionales en el STEP EVENT para detectar sólo el keyboard_pressed.
Ejemplo:
LeftPressed = keyboard_check_pressed(ord("A")) || keyboard_check_pressed(vk_left)
RightPressed = keyboard_check_pressed(ord("D")) || keyboard_check_pressed(vk_right)


De esa forma reemplazas tu código a:
if (LeftPressed)
{
bla bla
}
else if (RightPressed)
{
bla bla
}


Además recuerda tener configurada la Alarma 1 (o el número que quieras ponerle) para desactivar las variables "DashRight" y "DashLeft", o sino no hará la detección de pulsar la tecla 2 veces en 15 steps

Saludos
237
Hola tristy3

Lo que buscas es la función "asset_get_index". Lo que hace es utilizar una String para devolver un recurso del juego, como sprites, objetos, etc.

Acá tienes un ejemplo de su uso
var a_buscar = "ob" + string(comprobarNum[0])
var tu_objeto = asset_get_index(a_buscar)
if tu_objeto != -1 { instance_create(0,0,tu_objeto) }


Saludos
238
Hola ZELDA

Yo lo haría de la siguiente manera:

CREATE EVENT
DashLeft = false //revisa si debe ejecutar el dash hacia la izquierda
DashRight = false //revisa si debe ejecutar el dash hacia la derecha


ALARM 1 EVENT
DashLeft = false //revisa si debe ejecutar el dash hacia la izquierda
DashRight = false //revisa si debe ejecutar el dash hacia la derecha


STEP EVENT
if keyboard_check_pressed(vk_left) {
if DashLeft = false { //Revisa si no hemos apretado izquierda antes
DashRight = false //Cancela el intento de dashear a la derecha
DashLeft = true //Setea la variable para ver si debe hacer el dash
alarm[1] = 15 //Setea el timer para contar el dash
}
else { /*hacer el dash a la izquierda*/ } //Si ya habíamos izquierda antes y la volvemos a apretar dentro de los 15 steps, entonces efectua el dash
}
//El mismo código para la tecla derecha
if keyboard_check_pressed(vk_right) {
if DashRight = false {
DashLeft = false
DashRight = true
alarm[1] = 15
}
else { /*hacer el dash a la derecha*/ }
}


Por lo que veo de tu código, para decirle a donde hacer el dash basta con hacer:
canDash = true
dir = <1(izquierda) o 0(derecha)>

Tu código hará el resto

Saludos
239
Preguntas y respuestas / Re:Salto preciso
Agosto 15, 2018, 09:09:41 PM
Hola elmmertonw

Haz que la velocidad vertical se reduzca a la mitad cuando sueltas la tecla arriba mientras estás subiendo, eso hará el el jugador no salte tanto y mantendrá la fluidez del salto.

if keyboard_check_released(vk_up) && vspeed < 0 {
vspeed /= 2
}


Saludos
240
Preguntas y respuestas / Re:Array a String
Agosto 10, 2018, 05:14:25 AM
Hola Edgamer63

Está difícil con arrays.
Te sugiero 2 cosas:
1- Si todos los valores guardados en el array tienen un único tipo de dato (ej: 8bit integer, boolean, string, etc), puedes guardar directamente el dato del array en el buffer y mandas el buffer vía networking.
Cuando lo recibas sólo lees cada valor del buffer y guardas la info en el nuevo array.
2- que utilices la DATA STRUCTURE "ds_list".
Puedes reemplazar tu sistema de arrays con el sistema de ds_lists que te ofrece más opciones
O si quieres mantener tus arrays, puedes hacer la siguiente conversión de array a ds_list:
list = ds_list_create() //Creas una lista y guardas su ID en la variable "list"
for (var i=0; i<array_length_1d(array); i+=1) { //Hace un loop desde 0 hasta la longitud del array
ds_list_add(list,array[i]) //Esto llena la ds_list con cada uno de los valores del array
}
string = ds_list_write(list) //Esta función convierne la lista en una String (no legible para humanos, no la dibujes en pantalla) que puedes enviar por un buffer o guardar en un archivo

ds_list_destroy(list) //Recuerda eliminar siempre tu list cuando ya no es necesaria


Una vez tienes la "string", la puedes mandar a través de un buffer vía Networking.
Donde recibes la info, tienes que ejecutar el siguiente código para transformar tu string a una ds_list denuevo
list = ds_create_list() //Si no existe la list, la creas, si ya existe este paso es innecesario
ds_list_read(list,string) //Esto transforma la string a una DS_list de nuevo. Debes asegurarte de haber recibido y asignado valor a la variable "string"


Luego puedes convertir nuevamente de DS_LIST a ARRAY (aunque repito, es innecesario, puedes simplemente trabajar con la list forever)
for (var i=0; i<ds_list_size(list); i+=1) {
array2[i] = ds_list_find_value(list,i)
}


Como recurso dinámico, las DS LISTs se guardan en el caché y no se borran automáticamente, por lo que debes eliminarlas manualmente usando la función:
if ds_exists(list,ds_type_list) ds_list_destroy(list)

Espero te sirva

Saludos