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.

Temas - Jeffrey Faper

21
Estaba replicando algunos lasers de mis shoot em up favoritos , todo marchaba bien , hasta que intente replicar el laser  beam tipo consolador del juego Dogyuun,  el laser funciona adecuadamente, el unico problema fue que al colisionar el laser contra enemigos la punta del laser terminaba desapareciendo asi que decidi dibujar todo manual mente paso por paso osea con un monton de if,  aqui les dejo el codigo del laser y el projecto por si quieren echarle un vistazo  tal vez usted  encuentre la solucion
laser animado projecto:
https://drive.google.com/file/d/1rB6IaLmGn__ApLcYIS_IzXErFB4AcQF5/view?usp=sharing

[gml]
//LASER STEP EVENT
///STANDARD LASER TEST
var laserTrim = keyboard_check_pressed(ord("W"));

      frame += 0.3;
     
   if(laserTrim){
      laserEnd = 1;
      laserLength = maxLength/choose(1,2,3);
      }
   //INIT LASER BEAM
   if(image_xscale>0.1) && (!laserEnd)
   {  x = pShip.x;
      y = pShip.y;
      depth += 0.05;
      image_xscale -= 0.0125;   
     if(maxLength<512){maxLength +=32;}
     for(i=0; i<maxLength; i++)
     {   xEnd = x+lengthdir_x(i,90);
         yEnd = y+lengthdir_y(i,90);
         laserLength = i;
      if(collision_point(xEnd,yEnd,parEn,0,0)) && (parEn.canStopLaser){
         break;
         }
     }
   }
   //LASER END
   if(image_xscale<=0.1) || (laserEnd){
      speed = laserSpeed;
      image_xscale -= 0.0025;
   }
   //ENEMIES TAKE DAMAGE
   if(instance_exists(parEn))
   {var hitting = ds_list_create();
        hitting = collisionLineList(x,y,xEnd,yEnd,parEn,1,0);     
     if(hitting>0)
     {for(var i=0; i<ds_list_size(hitting); i++;)
       {var inst = ds_list_find_value(hitting,i);
         if(inst.hitPoints!=0){
            with(inst){
                 hitPoints--;
                 crashFX++;
                 }
            }
       }
       ds_list_destroy(hitting);
     }
   }
   //DESTROY LASER INSTANCE
   if(image_xscale<=0){
      instance_destroy();
      }
   if(y<=view_yview-sprite_height){
      instance_destroy();
      }
//DRAW EVENT
for(i=0; i<laserLength/32; i++){
    draw_sprite(sprite5,frame,x,y-i*32);  //cuerpo del laser
}   draw_sprite(sprite4,frame,x,y-laserLength);  //cabeza del lasaer
    draw_sprite_ext(sprite4,frame,x,y,1,-1,0,c_white,1);  //colita del laser

[/gml]
22
como dice el titulo cual es la manera correcta de executar one way slopes y ceiling slopes,   yo uso una mezcla de codigo sacados del tutorial de plataformas de monthy Drake y algunas cosas de una engine de un chico italiano  big mama era su nombre creo , bueno lo que me tiene intrigado,  es si lo estoy haciendo de la forma correcta o existe alguna manera mejor de hacerlo aqui les dejo el codigo y el projecto por si quieren echarle un viztaso y ayudarme a aclarar mis dudas, por lo poco que e probado el juego tiene poco bugs como quedarse atascado dentro de una plataforma solida y una plataforma oneway

EDITABLE  NO DUDE EN MODIFICARLO MEJORARLO O HACER ALGUNA SUGERENCIA:

https://drive.google.com/file/d/1zF4Se-PHWXp8nTsLLBUh6S3TYtZhxEFq/view?usp=sharing

EVENTO CREATE JUGADOR:
[spoiler]
[gml]
onGround    = 0;
onOneway    = 0;
konckback   = 0;

vspd = 0;
hspd = 0;
grvzero = 1;
accspd  = 0.5;
fricspd = 0.25;
gfric   = 0.5;
mainspd = movespd;



//ATTACK VAR
hitsCount   = 0;
maxHits     = 4;
slashHit    = 0;

//JUMP VAR
jumped      = 0;
minijump    = 0;
buffCount   = 0;
coyCount    = 0;


//KEYS VAR
moveX      = 0;
moveY      = 0;
keyLeft    = 0;
keyRight   = 0;
keyUp      = 0;
keyDown    = 0;
keyJumpC   = 0;
keyJumpP   = 0;
keyAttackC = 0;
keyAttackP = 0;
[/gml]
[/spoiler]

SCRIPT MOTION SIMPLIFICADO:
[spoiler]
[gml]
///scrMotion();
/*******************************************************   
/* HORIZONTAL COLLISION CHECK                              **
/******************************************************/
repeat(abs(hspd)){   
    var block = place_meeting(x+sign(hspd),y,parSolid);
    //SOLID SLOPE UPWARD
    if(block){
       for(var i=1; i<=maxslp; i++;){
           if(!place_meeting(x+sign(hspd),y-i,parSolid)){
              y -= i;
              break;
              }
          }
      }else{//SOLID SLOPE UPWARD
            for(var i=maxslp; i>=1; i--;){
                if(!place_meeting(x+sign(hspd),y+i,parSolid)){
                   if(place_meeting(x+sign(hspd),y+i+1,parSolid)){
                      y += i;
                      break;
                      }
                   }
               }
           }
         
    //ONEWAY SLOPE CONDITIONS
    with(parPlayers){
    //condiciones para poder subir oneway slopes
    if(!place_meeting(x,y+1,parSolid)   && !place_meeting(x,y+1,overOneway))
    ||(!place_meeting(x,y+1,overOneway) &&  place_meeting(x,y+1,parSolid)   && keyUp)
    ||(!place_meeting(x,y+1,parSolid)   &&  place_meeting(x,y+1,overOneway) && keyUp){
   
    var oneway = place_meeting(x+sign(hspd),y,parOneway);
    //ONEWAY SLOPE UPWARD
    if(oneway){
       for(var i=1; i<=maxslp; i++;){
           if(!place_meeting(x+sign(hspd),y-i,parOneway)){
              y -= i;
              break;
              }
           }
    }else{//ONEWAY SLOPE DOWNWARD
          for(var i=maxslp; i>=1; i--;){
              if(!place_meeting(x+sign(hspd),y+i,parOneway)){
                 if(place_meeting(x+sign(hspd),y+i+1,parOneway)){
                    y += i;
                    break;
                    }
                 }
              }
         }
    }
    //limitar jugador a la view tambien puede clampear su jugador a la view
    if(x+sign(hspd)<=view_xview+16) || (x+sign(hspd)>=view_xview+view_wview-16){
       hspd = 0;
       }
    }
    //LEFT-RIGHT SOLID COLISION CHECK
    if(!place_meeting(x+sign(hspd),y,parSolid)){
       x += sign(hspd);
       }else{
              hspd = 0;
              break;
       }
}
/*******************************************************   
/* VERTICAL COLLISION CHECK                                    **
/******************************************************/
repeat(abs(vspd)){
    if(place_meeting(x,y+sign(vspd),parSolid)){
       vspd = 0;
       break;
       }
    if(vspd>0 && !place_meeting(x,y,parOneway) && place_meeting(x,y+sign(vspd),parOneway)){
       vspd = 0;
       break;
       }
    if(vspd>0 && !place_meeting(x,y,overOneway)&& place_meeting(x,y+sign(vspd),overOneway)){
       vspd = 0;
       break;
       }else{
              y += sign(vspd);
       }
}
[/gml]
[spoiler]
SCRIPT PLAYER STEP:
en este script van todas las entradas que realizara el jugador  y la inicializacion de los estados
puede modificarlo a su gusto es solo un ejemplo
[spoiler]
[gml]
///scrPlayerStep{player,movLeft,movRight,movUp,movDown,button1,button2,view}
var playerID  = argument[0];
var moveLeft  = argument[1];
var moveRight = argument[2];
var moveUp    = argument[3];
var moveDown  = argument[4];
var action1   = argument[5];
var action2   = argument[6];
var viewIndex = argument[7];   

   
with(playerID){

   var getName = object_get_name(object_index);
   sprite_index = asset_get_index("spr"+getName+setAction);
   scrAction();
   
   
   var onWallL = vspd>0 && !place_meeting(x,y+1,parSolid) && place_meeting(x-1,y,sWall);
   var onWallR = vspd>0 && !place_meeting(x,y+1,parSolid) && place_meeting(x+1,y,sWall);
   
   
   onGround = scrGroundCheck();
   onOneway =!place_meeting(x,y,parOneway) && place_meeting(x,y+1,parOneway) && moveX==0 && moveY==-1;
   
   //SET.CONTROL PLAYER
   switch(canMove){
   case 0:
           keyJumpP   = 0;
           keyAttackP = 0;
           if(onGround){
              hspd = scrApproach(hspd,0,1);
              }
           break;
   
   case 1: keyLeft    = keyboard_check(moveLeft);
           keyRight   = keyboard_check(moveRight);
           keyUp      = keyboard_check(moveUp);
           keyDown    = keyboard_check(moveDown);
       
           keyJumpC   = keyboard_check(action1);
           keyJumpP   = keyboard_check_pressed(action1);
           keyAttackC = keyboard_check(action2);
           keyAttackP = keyboard_check_pressed(action2);
       
           moveX = keyRight-keyLeft;
           moveY = keyUp-keyDown;
           
           if(moveX<>0){
              image_xscale = sign(moveX);
              hspd = scrApproach(hspd,moveX*mainspd,accspd);
              }
   }
   //INIT.JUMP BUFFER
   if(keyJumpP && !keyAttackP && !keyAttackC && buffCount<=0 && !onOneway){
      buffCount = buffMaxJump;
      }
   //COUNTDOWN.JUMP BUFFER
   if(buffCount>0){ 
      buffCount--;
      }
   //MINI.JUMP
   if(vspd<0 && minijump && !keyJumpC && !onOneway){
      minijump = 0;
      vspd = 0;
      }
   //WALL.JUMP LEFT
   if(onWallL){
      setAction = "JumpMove2";
      grvzero = 2;
      if(buffCount>0){
         vspd =-jumpspd;
         hspd = 4;
         setAction = "JumpMove1";
         airState = stateWallJump;
         image_xscale = 1;
         }
      }else{
            if(!onWallL && !onWallR){
               grvzero = 1;
      }
   }
   //WALL.JUMP RIGHT
   if(onWallR){
      setAction = "JumpMove2";
      grvzero = 2;
      if(buffCount>0){
         vspd =-jumpspd;
         hspd =-4;
         setAction = "JumpMove1"
         airState = stateWallJump;
         image_xscale =-1;
         }
      }else{
            if(!onWallL && !onWallR){
               grvzero = 1;
      }
   }
   //ON.GROUND
   if(onGround){
      airState = noone;
      minijump = 1;
     
      //HITS.BUFFER
      var hitBuffer = keyboard_check_pressed(action2);
      if(hitBuffer && hitsCount<maxHits){
         hitsCount = (hitsCount+1) mod(maxHits);
         }         
             
      //GROUNDED.STATES
      if(groundState==noone){
         groundState = stateIdle;
         }else{
               scrGroundStates();
              }
      //DESCENDER DE PLATAFORMA ONEWAY
      if(keyJumpP && onOneway){
         y++;
         }
   }
   //ON.AIR
   if(!onGround){
      vspd += grvspd/grvzero;
      countHits = 0;
      groundState = noone;
      //AIR.STATES
      if(airState==noone && jumped==0){
         setAction = "JumpMove2";
         airState = "JumpMoving2";
         image_index = 0;
         vspd = 0;
         }else{
               scrAirStates();
              }
      //COYOTE.TIME
      if(coyCount>0){ 
         coyCount -= 1;
         if(!jumped && minijump){
            if(keyJumpP){
               jumped = 1;
               buffCount = 0;
               vspd =-jumpspd;               
            }
         }
      }
   }else{
          jumped = 0;
          coyCount = coyMax;
        }
}       
     
        /******************************************************************************   
        /* SIMPLE CAMERA 1                                                           **
        /*****************************************************************************/
        //TWO PLAYERS FREE CAMERA
        if(instance_exists(P1) && instance_exists(P2)){
           view_xview = ((mean(P1.x,P2.x)-view_wview/2)+view_xview*5)/6;
           view_yview = ((mean(P1.y,P2.y)-view_hview/2)+view_yview*5)/6;
           }else{
                  view_xview = ((x-view_wview/2)+view_xview*5)/6;
                  view_yview = ((y-view_hview/2)+view_yview*5)/6;             
                }
           /*
           //TWO PLAYERS ONE-SIDE CAMERA
           var camH = ((mean(P1.x,P2.x)-view_wview/2)+view_xview*5)/6 && P1.moveX>0 && P2.moveX>0;
           if(camH){
              view_xview += 1*dTime;
              }
              view_yview = ((mean(P1.y,P2.y)-view_hview/2)+view_yview*5)/6;
           */

        if(view_xview[viewIndex]<=0){view_xview[viewIndex] = 0;}
        if(view_xview[viewIndex]>=room_width-view_wview[viewIndex]){view_xview[viewIndex] = room_width-view_wview[viewIndex];}
        if(view_yview[viewIndex]>=room_height-view_hview[viewIndex]){view_yview[viewIndex] = room_height-view_hview[viewIndex];}   
[/gml]
[/spoiler]

y por ultimo
SCRIPT ON GROUND:
regresa 1 si estamos pisando tierra firme
[spoiler]
[gml]
///scrGroundCheck();
var colGround = ((place_meeting(x,y+1,parSolid)) || (vspd>=0 && !place_meeting(x,y,parOneway) && place_meeting(x,y+1,parOneway)) || (vspd>=0 && !place_meeting(x,y,overOneway) && place_meeting(x,y+1,overOneway)));
return colGround;
[/gml]
[/spoiler]
23
Juegos en desarrollo / Soldier BladeDX FAN GAME
Diciembre 17, 2021, 01:02:55 AM


soldier blade dx


Shooter


GM: Studio

Fan game  del juego Soldier Blade de la PC-Engine
fase del juego prototipo
menus intro estados principales del juego70%
collisiones 100%
enemigos comportamientos  40%
niveles  0%
historia ,dialogos, escenas 0%
jugador 90%
sonido 20%
sprites 30%
rank, puntuacion 0%
jefes 30%



24
Juegos en desarrollo / Soldier BladeDX FAN GAME
Diciembre 14, 2021, 10:54:20 PM


soldier blade dx


Shooter


GM: Studio

Fan game  del juego Soldier Blade de la PC-Engine
fase del juego prototipo
menus intro estados principales del juego70%
collisiones 100%
enemigos comportamientos  40%
niveles  0%
historia ,dialogos, escenas 0%
jugador 90%
sonido 20%
sprites 30%
rank, puntuacion 0%
jefes 30%





https://drive.google.com/file/d/1gc06wwDLrvuMeFPwJg4-Ic0kiGEbs9vB/view?usp=sharing



25
He creado una intro para mi juego, el problema es que al minimizar la aplicacion este sigue ejecutandose
existe alguna funcion para controlar la pausa del juego cuando esta queda en segundo plano o se minimiza

LEYENDO EL MANUAL encontre estas funciones os_is_paused()  y  window_has_focus() 
ejemplo  simple de como usarlas :
[gml]
///EVENTO STEP OBJETO MAIN CONTROL
if(os_is_paused())
{   
    io_clear(); 
    instance_deactivate_object(all);
    audio_pause_sound(global.currentSong);
for(var i=0; i<8; i++;){
    background_visible = false;
    }
if(!instance_exists(mainPause))
   {
    instance_create(0,0,mainPause);
   }
}
///EVENTO STEP OBJETO  MAIN PAUSE
if(window_has_focus())
{
   instance_activate_object(all);
   audio_resume_sound(global.currentSong);
   instance_destroy();
}

[/gml]
26
Como puedo transformar este código en un script?
uso este codigo para remapear los botones del Gamepad de hecho es una interpretación mía de un post que encontré en la  comunidad yoyo ,
el problema es que tengo que copear y pegar 16 veces el mismo código  para conseguirlo  tantas lineas para hacer la misma acción 
como vera soy muy noob en esto les agradezco de todo colazon  su ayuda.....
el codigo se executa en un switch statement  va avanzando  y se desactiva una vez se tiene la nueva configuración de botones y joysticks
[gml]
         for(var j=0; j<16; j++)
{
                var key;
                var check   = j;
                var button  = undefined;
           if(gamepad_button_check_pressed(i,j)==true)
         {
                    key[0]  = gp_padu;
                    key[1]  = gp_padd;
                    key[2]  = gp_padl;
                    key[3]  = gp_padr;
                    key[4]  = gp_start;
                    key[5]  = gp_select;
                    key[6]  = gp_stickl;
                    key[7]  = gp_stickr;
                    key[8]  = gp_shoulderl;
                    key[9]  = gp_shoulderr;
                    key[10] = gp_shoulderlb;
                    key[11] = gp_shoulderrb;
                    key[12] = gp_face1;
                    key[13] = gp_face2;
                    key[14] = gp_face3;
                    key[15] = gp_face4;
                   
                    button = key[check];
                    global.padUp = button;
                    mapGamePad++;
         }
}

[/gml]

27
 :GMS:
Estoy intentando crear un sistema de bombas como el del juego Soldier Blade  pero no tengo ni idea de por donde empezar
simplemente soy muy noob en esto de programar. el sistema de bombas de dicho juego es muy simple el jugador almacena 3 bombas
las cuales pueden ser de diferentes tipos, la bomba que se coge al final es  la que se destruye cualquier consejo se agradece

Recorde que ya había creado menus  y sub-menus con Matrices unidimensionales para mis juegos y prácticamente esa fue la solución a mi problema