Lo que quiero hacer es un sistema de batalla de movimiento libre, y lo que me falta por hacer es lo siguiente, que es donde me quedo siempre y no s? avanzar muy bien:

CitarLos ataques ser?n objetos (sprites o efectos de particulas) pero no quisiera editar un ataque igual para cada personaje, si no cinco ataques distintos
y que el objeto protagonista y el objeto enemigo puedan utilizarlos.

Que a la hora de atacar/recibir da?o, se tenga en cuenta el nivel, ataque, ataque especial, defensa, defensa especial y el tipo del enemigo.

Es lo ?ltimo que me falta para poder completar una demo. Muchas gracias por adelantado...

yo uso para los sistemas de experiencia unas variables que suben con cada nivel que se encargan de esas ecuaciones.
declaro estas variables siempre en global.-
damage=1 //para el da?o
resist=0  //para la resistencia al da?o
cuando sube de nivel el personaje las aumento asi
damage*=1.4 //suma un 40% mas de damage por nivel
resist*=1.2 //20% mas de resistencia.

al momento de la colision con una bala enemiga el da?o lo hago asi.
var a;
a=other.damage-resist
health-=a;
es decir le resta energ?a seg?n el da?o que puede producir pero disminuido por la resistencia.

#2 Diciembre 13, 2011, 05:32:44 PM Ultima modificación: Diciembre 13, 2011, 05:34:38 PM por NOKAUBURE
Te dejo mi formula de da?o que uso en el juego. Incluye atakes comunes, probabilidad de hacer MISS, CRITICO, BLOCK.
Las variables que actuan son:
STR: Es la fuerza fisica
END: Es la resistencia fisica
DEX: Es la destreza (punteria/evasion)
Critico: Es el porcentaje de acertar criticos
Block: Es el porcentaje de anular atakes
targetid: La id del enemigo. Consiguela de cualquier manera. Si deseas poner este codigo a un proyectil, se lo pones en collision y cambias targetid por other

[gml]// fin de auto atake
if ataking = 1
{
ataking = 0;
// miss
{
if targetid.DEX > DEX
{
misschance = round((DEX/targetid.DEX)*100)
misschance = 100-misschance
if misschance > 90 {misschance = 90}
acierto = round(random(100))
// exit si se hace miss!
if acierto < misschance {exit;}
}
}
//block
acierto = round(random(100))
// exit si te hacen block!
if acierto < targetid.block  {exit;}
damage = (STR*2)-targetid.END
//critico
golpe = round(random(100))
if golpe < critical {damage = damage*2;}
if damage < 1 {damage = 1}
targetid.HP -= damage
}
[/gml]

1- el codigo se activa cuando la variable "ataking" es igual a 1. Asi que por ej, cada vez que tocas SPACE, el ataking se vuelve 1 y debes esperar unos 30 steps para volver a atakar.

2- esto se lo puedes poner tranquilamente a un proyectil, solo cambia targetid por other y lo pones en el event colision. Y que al crearse la variable ataking sea 1.

3- El codigo esta hecho de forma que nunca puedas quitar menos de 1 vida y nunca puedas tener menos del 10% de punteria. Puedes quitar los factores de block y punteria borrando las respectivas linias si deseas.

4- El verdadero codigo tiene 100 linias xd te optimize el codigo para que lo entiendas.
Noka siempre responde a los temas con 0 respuestas ^^