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

16
Preguntas y respuestas / Re: sentencia for no le entiendo
Diciembre 13, 2009, 11:19:26 PM
Haces muy bien en preguntar por que es cada cosa, si te limitas a copiar codigos de tutoriales nunca conseguiras sacar tu juego de cierto nivel de calidad, que no es tu caso por lo que veo  :D

Bien, cuento con que sabes que es un bucle for y como se utiliza, no? le damos un peque?o repaso

for (i=0;i<10;i+=1){
show_message(string(i));
}

Bien las sentencias for tienen tres apartados separados por ";", el primer apartado se ejecuta solo una vez y al principio, normalmente lo usamos para declarar o inicializar la variable, en este casi y en la mayoria de for siempre se usa la i, que podria ser la j, o la variable "tulipan" sabes? xD

La sentencia, en este caso el show_message() que ves es lo que se ejecuta varias veces, siempre y cuando la condicion, que es el segundo apartado, se cumpla, al ejecutar la sentencia, se ejecuta el tercer apartado, asi quedaria el orden de acciones:

-se ejecuta primer apartado
-sentencia
-se ejecuta tercer apartado
-se comprueba segundo apartado
-se cumple segundo apartado? SI (contimuanos),   NO (termina el bucle)
-sentencia
-se ejecuta tercer apartado
-se comprueba segundo apartado
...

normalmente se aprovecha el valor que va teniendo la variable, en este caso la i  para usarla (en arrays, en multiplicaciones...)

en este caso lo aprovechamos para mandar a lo largo del bucle for 10 mensajes en orden cada uno con un numero del 0 al 9



Iendo al grano ese codigo que has puesto lo que hace es intentar subir una rampa hacia la izquierda con una inclinacion maxima de 8 pixels si no me equivoco, no?

Bien pues el for va del 0 al 8 ?Por que empieza por el 0 y acaba en el 8? Lo explicamos mas adelante
tenemos la funcion place_free(x,y), esta funcion lo que hace es devolvernos true (para que se cumpla el if) cuando la posicion que se le ha indicado dentro en coordenadas X e Y esta libre de objetos solidos

Entonces, en un primer ciclo del bucle for tendriamos la i a 0 y comprobariamos si en la posicion x-5 (5 pixeles a nuestra izquierda) y y-0 (a nuestra misma altura porque Y se queda igual) hay alguna pared solida, en caso de no haberla la funcion devolveria true, y se ejecutaria la sentencia de dentro del if que es aplicar el movimiento, al no haber nada en esa posicion trasladamos al personaje 5 pixeles a la izquierda y ninguno hacia arriba o abajo, y exit para no seguir comprobando por que ya hemos conseguido mover al personaje

?Que pasaria si no hubiera habido hueco en x-5,y-0 ?? El bucle habria continuado para seguir buscando hueco, en este caso i seria 1 en el ciclo siguiente, entonces se comprobaria si hay hueco en la posicion x-5,y-1 que es 5 a la izquierda y 1 por encima tuya, si hubiera hueco libre entonces el personaje subiria un poquito la rampa hacia arriba y se moveria hacia la izquierda, de ahi el efecto de que suba la rampa. Al haberle puesto una tolerancia de 8 podria hacer hasta 8 ciclos intentando buscar su hueco cada vez un poquitin mas arriba
17
Preguntas y respuestas / Re: Caminar Diagonalmente
Diciembre 13, 2009, 11:01:56 PM
En 2D nos basamos en dos ejes, el X y el Y, para movernos horizontalmente usamos el eje X, un movimiento hacia la izquierda supondria restarnos algunos pixeles en nuestro eje X, por ejemplo si queremos avanzar 5 pixeles (la tipica distancia en casi todos los juegos para un movimiento normal de cada step) hacemos uso del codigo x-=5; en cambio si es para la derecha x+=5

Con el eje Y restamos para ir hacia arriba y sumamos para ir hacia abajo, de ahi a que si queremos un movimiento diagonal (imaginemos para la direccion 45?) deberiamos hacer x+=5;y-=5;  ;)
18
Preguntas y respuestas / Re: no se anima...
Diciembre 13, 2009, 10:53:18 PM
En vez de usar image_speed=0 lo que puedes hacer en un determinado momento que quieras 'pausar' el sprite propio es el siguiente codigo: image_single=image_index, esto deja el sprite parado en la subimagen en la que estaba, sin afectar al image_speed, si en alguna ocasion quieres que deje de estarse quieto ponle image_single=-1
19
Preguntas y respuestas / Re: ayuda con la funci?n floor
Diciembre 13, 2009, 03:56:10 PM
Ceil en cambio hace lo contrario, si tuvieras 2.00000061 te lo dejaria en 3, es util para aproximaciones por defecto y por exceso
20
Vale.. vamos a animarnos a hacer el codigo que divide por palabras y no por letras, ya no va a ser perfecto como el otro que por ejemplo si teniamos 15 palabras hacia 7 bloques de 2 y uno de uno:2... 2+2+2...+1, ahora pueden salir letras aproximadas por bloques pero acercandose a la fraccion de 7, por ejemplo si tenemos 70 palabras lo ideal serian 7 bloques de 10 palabras, pero al separar por espacios quiza tengamos bloques de 8 palabras, de 6, o incluso por exceso, de 11 o 12 palabras, intentare que sea mas por defecto que por exceso, ya que si nos excedemos quiza el texto no quepa en el recuadro, pero al hacer esto por defecto ya no podemos decir que van a ser justo 7 divisiones, sino que el criterio para partir dejara de ser 7 particiones para ser X particiones de tantas letras (aprox), pongamos unas 20 letras por particion:

txt_original="Este es el texto del que vamos a hacer X particiones con 20 letras en cada particion, quiza se queda corto y como mucho da para diez, pero confiemos que con textos largos la cosa salga bien";

aprox=20; //tendremos que aproximarnos tomando este numero como referenica, sera como el ejemplo a seguir para todas las particiones, que su numero de letras sera siempre <= que aprox

particiones=0; //comenzaremos con la cuenta de divisiones, de momento llevamos 0

//ahora enumeramos los espacios encontrados
espacios=0;
for(i=0;i<string_length(txt_original);i+=1){
  if(string_char_at(txt_original,i+1)==" "){
     espacio[espacios]=i+1;
     espacios+=1;
}
}

desde=1; //desde servira para comenzar la copia para ir pegando los trozos
for(i=0;i<espacios;i+=1){
  if((espacio[i]-desde)>aprox){
    txt_part[particiones]=string_copy(txt_original,desde,espacio[i-1]-desde);
    particiones+=1;
    desde=espacio[i-1]+1;
  }
}
txt_part[particiones]=string_copy(txt_original,desde,string_length(txt_original)-(desde-1));
particiones+=1;


parte=0;


en el evento draw seria lo mismo que antes, sustituye el que te di en su momento por este en el evento create

21
Preguntas y respuestas / Re: Textos automaticos
Diciembre 12, 2009, 11:41:08 PM
Nds, parece que te han gustado las arrays jaja! si tienes alguna duda pregunta
22
Yo consegui ingeniarmelas para conseguir que el personaje se moviera con la plataforma da igual la direccion que esta tuviera y el movimiento que esta siguiera, que el personaje la iba a seguir, os garantizo que NO podeis apoyaros en las variables predefinidas tales como: vspeed, hspeed, direction, speed, xprevious, yprevious, teneis que crearos vuestro propio sistema de movimiento para la plataforma, la cuestion es que la plataforma antes de hacer un cambio brusco de direccion (como por ejemplo dejar de ir hacia arriba para ir hacia abajo en su clico de subida-bajada) debe avisar antes por medio de una variable que llamariaoms velocidadY de su intencion, y luego en el evento step de esta plataforma hacer y+=velocidadY. Con esto tienes la mayor parte del problema resuleto, ya que el personaje al detectar la plataforma debajo suya tendria este codigo (en evento step)

if(place_meeting(x,y+1+vspeed,Plat_Vertical)){
_plat=instance_place(x,y+1+vspeed,Plat_Vertical);
vspeed=0;
y+=_plat.velocidadY;


tambien es importante que en el evento colision con esta Plataforma pongamos:

move_contact_solid(270,12);
vspeed=0;


23
para que el texto se divida no en letras sino en palabras  habria que hacer un codigo algo mas complejo.. quiza en un par de horas me entre la inspiracion y te lo haga, ahora mismo me pillas reventado y a punto de ir a dormir XD  pues en create evento pones la variable parte a 0

luego en el draw event tenias este codigo:

draw_text(x,y,txt_part[parte]);


pues en el evento key press Z pon simplemente este trozo de codigo:


if(parte<6){parte+=1;}


asi sumas en uno la variable parte que es el trozo de texto que se muestra con el evento draw :)
24
te has asegurado de que esos dos codigos se ejecutan en el mismo objeto?

tambien tienes que asegurarte que el codigo largo se ejecuta una sola vez y a ser posible en el create event, y la otra parte en el draw event
25
Me da que en vez de usar dos arrays va a haber que usar 5 pongamosle.. acuerdate de inicializar esto en create:

paso[0,0]=x;
paso[0,1]=y;
paso[1,0]=x;
paso[1,1]=y;
paso[2,0]=x;
paso[2,1]=y;
paso[3,0]=x;
paso[3,1]=y;
paso[4,0]=x;
paso[4,1]=y;



y esto ya en el step donde estaba antes:

paso[4,0]=paso[3,0];
paso[4,1]=paso[3,1];
paso[3,0]=paso[2,0];
paso[3,1]=paso[2,1];
paso[2,0]=paso[1,0];
paso[2,1]=paso[1,1];
paso[1,0]=paso[0,0];
paso[1,1]=paso[0,1];
paso[0,0]=xprevious;
paso[0,1]=yprevious;
Poochyena.x=paso[4,0];
Poochyena.y=paso[4,1];



si no va ya es para pegarse un tiro xD
26
ok cambia el orden del codigo que cambiaste a como te puse... ponlo asi

paso[1,0]=paso[0,0];
paso[1,1]=paso[0,1];
paso[0,0]=xprevious;
paso[0,1]=yprevious;
Poochyena.x=paso[1,0];
Poochyena.y=paso[1,1];

27
Preguntas y respuestas / Re: Como cambiar un objeto
Diciembre 10, 2009, 09:28:26 PM
if(player1="x"){instance_change(NUEVO_OBJETO,true);}

asi de simple, recuerda que si se cumple no se ejecutara lo que haya debajo al hacer instance_change() si mal no recuerdo
28
pues quitalo del evento de la tecla y ponlo en step y te ahorras quebraderos de cabeza ;) seguro que te funciona
29
te he vuelto a escribir aqui que este codigo debes ponerlo en el mismo evento en el que hagas que el personaje se mueva, si tienes la funcion keyboard_checl(vk_left) y todo el percal en step, pues pon este codigo en step, si lo tienes en eventos de keyboard ponlo en los eventos de keyboard

ES EN CREATE DONDE DEBES INICIALIZAR

paso[0,0]=x;
paso[0,1]=y;
paso[1,0]=x;
paso[1,1]=y;

esto se ejecuta en create, y nunca mas, para inicializarlo. Lo otro en el evento que te he comentado que debas ponerlo arriba, no se como tendras montado el movimiento del personaje
30
Preguntas y respuestas / Re: Como cambiar un objeto
Diciembre 10, 2009, 08:08:19 PM
Te recomendaria que crearas a todos los personajes, pongamosle que es un Street Fighter, con un mismo objeto, el objeto luchador1 y luchador2, y ambos deben tener casi casi el mismo codigo, es por difrenciar el que esta a la izquierda del que esta a la derecha, y si te lo montas bien podrias hacer el juego con solo un objeto en lo que a personajes se refiere

Osea que Ryu, Ken Blanca y todos.. vendrian a ser del objeto luchador, pero con una variable que sea nombre="Ryu"; o en vez de por un texto que ponga "Ryu" por constantes, en game options te creas una lista de constantes..

ryu=0
blanca=1
ken=2
..

y luego en el codigo lo puedes escribir tranquilamente nombre=ryu, que te saldra en rojo y el solito por dentro sabra que numero lleva

y partiendo de ahi, que tienes nombre, puedes hacer todo lo demas, con swtichs..

switch(nombre){

case ryu: if(saltando){sprite_index=spr_Ryu_saltando;};break;
case ken: if(agachandose){sprite_index=spr_Ken_crouch;};break;

}

por poner un ejemplo.. me sigues? y mas de lo mismo, en los movimientos y en los combos haces un switch, distinges el personaje y de acuerdo con eso hara unas cosas o otras