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

1
Bueno, comento lo que me ocurre.

Estoy intentando hacer que mi personaje haga un movimiento de "Rodar" con la barra espaciadora.
Todo funciona bien salvo por un error y es que, cuando mantengo pulsada la barra espaciadora, la velocidad de movimiento aumentada para el movimiento de rodar no vuelve a su posición natural.

Tengo una variable para la velocidad de movimiento, y cuando pulso la barra espaciadora junto a otro botón de dirección, esta es aumentada y cambia el sprite para que se vea que está rodando. El problema es que yo quiero que afecte solamente UNA VEZ: que la barra espaciadora solo afecte cuando es pulsada la primera vez sin importar que luego lo mantengas pulsado o no (para así solucionar el error).

keyboard_check...?????

¿Alguien que resuelva mi duda? Muchas gracias :)
2
Depende lo que busques tendrás que hacerlo de diferente manera, pero por ejemplo: suponiendo que quisiera que al apretar la letra "Y" se cambiara el sprite y empezara por cierto sprite en concreto lo haría así:

[gml]if keyboard_check(ord("Y")) {sprite_index = sprPlayer1} { ///Al pulsar la tecla "Y" cambia el sprite, y entonces:
   image_index = 1; /// <- "sprite_index" también sirve para indicar el frame de cierto sprite.
   image_speed = 0; /// <- Esto si quisieras que la imagen se quedara quieta. Si no, no lo pongas.
}[/gml]

Si quisieras que al dejar de pulsar la tecla el sprite volviera a cambiar al deseado:

[gml]if keyboard_check_released(ord("Y")) {sprite_index = sprPlayer}[/gml]

Recuerda que el primer frame es el número 0.

Yo personalmente prefiero separar los sprites, pero si quisieras hacerlo deberías indicar la tecla que quieras que cambie al sprite y que cuando este sprite cambie en qué frame se debe colocar.

Si lo que quieres es que la imagen del sprite actual cambie de frame, indicando simplemente sprite_index con un valor numérico te funcionaría, pero deberás indicarle también (según su posición por ejemplo) a qué posición debe volver. Esto lo puedes conseguir de muchas maneras, depende para qué lo necesites.

Estoy aprendiendo igual que tú pero espero haberte ayudado. Si necesitas ayuda con algo en concreto y te puedo ayudar, ya sabes. :)
3
Cita de: Clamud en Julio 22, 2021, 02:54:02 AM
Se puede hacer de muchas formas. El método que me parece más fácil, cuando las máscaras de colisión son rectangulares, es que el movimiento se divide en 2 partes, una para cada eje.
Primero desplaza el personaje en el eje X, si detecta colisión que se desplace hasta luna posición en el borde del obstáculo.
Después desplaza el personaje en el eje Y, si detecta colisión también que se desplace hasta quedar en el borde del obstáculo.

Otra opción es pensar que los dos objetos son circulares. Cuando el personaje colisiona con el obstáculo se desplaza en dirección contraria al centro del obstáculo. Esta forma se puede hacer con poco código, pero debes entender un poco de matemáticas vectoriales.
MODIFICO PORQUE LO RESOLVÍ.

Muchas gracias :)
4
Mi pregunta es la siguiente: ¿Cómo puedo hacer que mi objeto Player cuando choque contra algún objeto irregular, por ejemplo una esquina, en vez de quedarse bloqueado al chocar, que este deslice buscando una nueva posición?

En mi mapa hay unos árboles, y al chocar contra el tronco, el personaje se queda totalmente parado. Puede moverse, y está todo bien, pero me gustaría mejorarlo haciendo que mi personaje deslice en el árbol en vez de quedarse totalmente quieto al chocar. ¿Es esto posible? ¿Cómo podría hacerlo? Gracias.
5
Cita de: Black_Cat en Julio 15, 2021, 10:54:54 PM
A lo mejor está conflictuando con algun sprite_index, y seguirlo asi es muy complicado, te recomiendo que hagás una maquina de estado para tener todo organizado o debuggearlo paso a paso para ver donde y cuándo es que cambia de sprite

Gracias. Tema resuelto.
6
Cita de: Black_Cat en Julio 15, 2021, 10:43:28 PM
El problema está en que la función admite parámetros del tipo recurso, no cadenas. Es decir, esto es una cadena.
Tenes que poner los nombres tal cual aparecen en el arbol de recursos.
[gml]

object_set_sprite( obj_casa, sprite_casa_amarilla );
[/gml]

Puse "sprite" y "objeto" por decir algo genérico, cuando lo escribí puse el nombre del sprite y objeto correcto. En concreto quería llamar al script a través de un "cheat", por llamarle de alguna manera. Lo que ocurría era que al ejecutar el combo de teclas del "cheat", en vez de cambiar el sprite de mi objeto, lo que hacía era insertar un nuevo objeto en la room (con dicho sprite al que llamaba), pero no cambiaba el objeto que ya existía dentro de la sala, sino que añadía uno nuevo.
7
El título es mi pregunta.

¿Qué función sería la correcta para añadir a un script, en la que cambie el sprite a un objeto en concreto?
He estado usando la siguiente, pero no me ha funcionado:

[gml]object_set_sprite("objeto", "sprite");[/gml]

:-[
8
Cita de: Black_Cat en Julio 15, 2021, 03:39:04 AM
Yo usaría una variable, por ejemplo, "DiagonalArribaIzquierda" que sea booleana, es decir o toma true o toma false.
Entonces cuando el jugador hace la diagonal, esta variable queda en true, luego al soltar cualquiera de las dos teclas , ya sea arriba o izquierda, al estar la variable en true, se pondría en el sprite correcto, a groso como asi:

[gml]var DAI //variable diagonal izquierda

if up and left //si se presionan ambas teclas para hacer la diagonal
      DAI = true //setear a true
else
      DAI = false

if keyboard_check_released("A") and DAI = true
          sprite_index  = sprite_correcto
if keyboard_check_released("W") and DAI = true
          sprite_index  = sprite_correcto

[/gml]

Muchas gracias por tu respuesta. Lamentablemente, algo estoy haciendo mal. ¿Cómo se escribiría? Puse esto:

[gml]var DAI  {
   if (diagonalupleft) {
      DAI = true;
   }else {
      DAI = false;
   }
}

if keyboard_check_released(ord("A") and DAI = true {
   sprite_index  = sprDemonStandDiagonalUpL;
}
if keyboard_check_released(ord("W")) and DAI = true {
   sprite_index  = sprDemonStandDiagonalUpL;
}[/gml]

y añadí esto a las posiciones derecha y arriba:

[gml]if keyboard_check_released(ord("A")) and DAI = false {sprite_index = sprDemonStandL; }
if keyboard_check_released(ord("W")) and DAI = false {sprite_index = sprDemonStandU; } [/gml]

Para comprobar si funcionaba realmente eliminé esta barra de código:
[gml]//if keyboard_check_released(ord("W")) and keyboard_check_released(ord("A")) {sprite_index = sprDemonStandDiagonalUpL; } [/gml]

Pero al ejecutar el juego, ahora no me devuelve ninguna posición "StandDiagonalUpL", se queda caminando. Traté de escribirlo tal y como me indicaste, pero me daba error. ¿Qué debería cambiar? Estoy usando Game Maker Studio 2.3.2.560.

Muchas gracias.

PD: Que esté usando la versión Trial no tiene nada que ver, ¿no?
9
Hola, muy buenas. Antes de nada, decir que llevo muy pocos días en este mundo y soy un completo novato (espero que tengáis paciencia conmigo). Bueno, aquí os expongo mi problema, a ver si podéis ayudarme a resolverlo porque lo he intentado de diferentes maneras por mi mismo pero estoy atascado así que: aquí estoy.

Estoy haciendo un movimiento de personaje WASD con posiciones en diagonal, tanto para "Stand" como para "Walk", aquí os dejo la parte del código dónde tengo el problema:

[gml]//movimiento
left = keyboard_check(ord("A"));
right = keyboard_check(ord("D"));
up = keyboard_check(ord("W"));
down = keyboard_check(ord("S"));
diagonalupleft = up and left;
diagonalupright = up and right;
diagonaldownleft = down and left
diagonaldownright = down and right;
//Walk
if (left) {sprite_index = sprDemonWalkL; }
if (right) {sprite_index = sprDemonWalkR; }
if (up) {sprite_index = sprDemonWalkU; }
if (down) {sprite_index = sprDemonWalkD; }
if (diagonalupleft) {sprite_index = sprDemonWalkDiagonalUpL; }
if (diagonalupright) {sprite_index = sprDemonWalkDiagonalUpR; }
if (diagonaldownleft) {sprite_index = sprDemonWalkDiagonalDownL; }
if (diagonaldownright) {sprite_index = sprDemonWalkDiagonalDownR; }
//Stand
if keyboard_check_released(ord("A")) {sprite_index = sprDemonStandL; }
if keyboard_check_released(ord("D")) {sprite_index = sprDemonStandR; }
if keyboard_check_released(ord("W")) {sprite_index = sprDemonStandU; }
if keyboard_check_released(ord("S")) {sprite_index= sprDemonStandD; }
//????RESOLVER STAND DIAGONALES
if keyboard_check_released(ord("W")) and keyboard_check_released(ord("A")) {sprite_index = sprDemonStandDiagonalUpL; }
if keyboard_check_released(ord("W")) and keyboard_check_released(ord("D")) {sprite_index = sprDemonStandDiagonalUpR; }
if keyboard_check_released(ord("S")) and keyboard_check_released(ord("A")) {sprite_index = sprDemonStandDiagonalDownL; }
if keyboard_check_released(ord("S")) and keyboard_check_released(ord("D")) {sprite_index = sprDemonStandDiagonalDownR; }[/gml]

Como podréis imaginar, todo va bien hasta que cuando pulso por ejemplo "A + W" para moverme hacia la diagonal superior izquierda, el personaje se mueve correctamente con el Sprite indicado, pero a la hora de soltar los botones, pelean las funciones de Stand para "derecha, izquierda, arriba, abajo", por lo que a veces (cuando sueltas los botones al mismo tiempo), se queda en la posición correcta, mientras que (normalmente), al no soltarse al mismo tiempo, se queda en una posición "Stand" incorrecta.

He probado varias cosas, incluso intenté hacer una especie de "Cheat", dónde diferentes combinaciones de botones (según el timeing), me devolviera a la posición correcta. Lo intenté, pero no me salió bien. Añadí al "combo" los botones "Up", para que el combo contara cuando soltara los botones. Traté de hacer combinaciones tipo "AWAW" "WAWA" "AWWA" "WAAW" y diferentes posibilidades para que el personaje terminase en la posición correcta, pero no me salió bien. Obviamente no tengo los conocimientos como para que eso me saliera bien, pero bueno, yo lo intenté.

He probado a devolver la posición según a qué grados se dirige el personaje y también he probado a poner la posición "Stand" dentro del mismo sprite (siendo este el primero y así saltarlo cuando se moviera), pero tampoco me resultó. Imagino que todas las posibilidades que intenté podrían haber sido viables pero no tengo los conocimientos todavía.

Me gustaría resolver este problema de la manera más rápida y sin tener que volver a hacer todo el código de nuevo (que ya lo he intentado también), aunque si no tuviera elección, lo haría. Por favor, os agradecería mucho si me ayudarais con este problemita para poder avanzar en el juego. He añadido otras funciones, tipo sprint y próximamente botones de ataque, pero me tiene frustrado este problema ya que yo quiero que la posición a la que se devuelva diagonalmente sea siempre correcta (y quiero que mi juego sea por movimiento WASD). Digo lo del movimiento WASD porque no quiero tener que añadir los movimientos diagonales a "Q" o "E" por ejemplo, porque sería muy rara la jugabilidad, (esto ya lo he hecho también pero no es lo que busco). Gracias de antemano, espero que podáis ayudarme.