1 decade ago by sleenee
I really like this community so I feel like posting another piece of possibly helpful code I use.
With this, your top-down character (like in zelda RPG-type games) will move towards your mouse-click location in a straight line (so it's not a path finding function, your character can get stuck).
It's useful for playable characters if you are tired of using the arrow-keys and just want to get somewhere with a left-mouse-click (which is in my code defined as 'context').
put this in your player-entity update function:
side-note:
the following lines might need to be adapted by you
Per default your character position will be the top-left corner of your collision box. This feels kind of unnatural. My character is 48 pixels high and 32 pixels wide so I adjusted the x-target by 16 (32/2) and the y-target by 48 so your character ends up with his feet where your clicked with the mouse.
The code also corrects for the camera-plugin.
In addition you will want to add these lines to your default arrow-movement code (if you have that). So you can interrupt your movement with the arrow keys if necessary.
so for example in my arrow-movement for going to the left I get this now:
The character animation code as defined by me in the entity init-function is like this:
so I have an animation for walking in all 4 directions and looking (but standing still) in all 4 directions.
Good luck with it and if you have questions , just ask.
Sleenee
With this, your top-down character (like in zelda RPG-type games) will move towards your mouse-click location in a straight line (so it's not a path finding function, your character can get stuck).
It's useful for playable characters if you are tired of using the arrow-keys and just want to get somewhere with a left-mouse-click (which is in my code defined as 'context').
put this in your player-entity update function:
//MOUSEINPUT
if( ig.input.pressed('context')){
this.destinationx = ig.input.mouse.x + ig.game.screen.x;
this.destinationy = ig.input.mouse.y + ig.game.screen.y;
}
if(this.destinationx < 9999999 && this.destinationy < 9999999 ){
//character is 48 hoog en 32 breed. corrigeer met 48 op y-as en 32/2 = 16 op x-as
this.distancetotargetx = this.destinationx - this.pos.x - 16 ;
this.distancetotargety = this.destinationy - this.pos.y - 48 ;
if (Math.abs(this.distancetotargetx) > 1 || Math.abs(this.distancetotargety) > 1){
if (Math.abs(this.distancetotargetx) > Math.abs(this.distancetotargety)){
if (this.distancetotargetx > 1){
this.vel.x = this.movementspeed;
this.xydivision = this.distancetotargety / this.distancetotargetx;
this.vel.y = this.xydivision * this.movementspeed;
this.currentAnim = this.anims.walkright;
this.formerpressed = 'right';
}
else{
this.vel.x = -this.movementspeed;
this.xydivision = this.distancetotargety / Math.abs(this.distancetotargetx);
this.vel.y = this.xydivision * this.movementspeed;
this.currentAnim = this.anims.walkleft;
this.formerpressed = 'left';
}
//einde Math.abs(this.distancetotarget.x) > Math.abs(this.distancetotarget.y)
}
else{
if (this.distancetotargety > 1){
this.vel.y = this.movementspeed;
this.xydivision = this.distancetotargetx / this.distancetotargety;
this.vel.x = this.xydivision * this.movementspeed;
this.currentAnim = this.anims.walkdown;
this.formerpressed = 'down';
}
else{
this.vel.y = -this.movementspeed;
this.xydivision = this.distancetotargetx / Math.abs(this.distancetotargety);
this.vel.x = this.xydivision * this.movementspeed;
this.currentAnim = this.anims.walkup;
this.formerpressed = 'up';
}
}
//einde this.distancetotargetx > 0 || this.distancetotargety > 0
}
else{
this.vel.y = 0;
this.vel.x = 0;
this.destinationx = 99999999;
this.destinationy = 99999999;
if(this.formerpressed == 'left'){
this.currentAnim = this.anims.lookleft;
}
else if (this.formerpressed == 'right'){
this.currentAnim = this.anims.lookright;
}
else if (this.formerpressed == 'up'){
this.currentAnim = this.anims.lookup;
}
else if (this.formerpressed == 'down'){
this.currentAnim = this.anims.lookdown;
}
}
//einde this.distancetotargetx && this.distancetotargety
}
//END MOUSEINPUT
side-note:
the following lines might need to be adapted by you
this.distancetotargetx = this.destinationx - this.pos.x - 16 ; this.distancetotargety = this.destinationy - this.pos.y - 48 ;
Per default your character position will be the top-left corner of your collision box. This feels kind of unnatural. My character is 48 pixels high and 32 pixels wide so I adjusted the x-target by 16 (32/2) and the y-target by 48 so your character ends up with his feet where your clicked with the mouse.
The code also corrects for the camera-plugin.
In addition you will want to add these lines to your default arrow-movement code (if you have that). So you can interrupt your movement with the arrow keys if necessary.
//set this.destinationx and dthis.destination y is for the movement by mouse-click this.destinationx = 99999999; this.destinationy = 99999999;
so for example in my arrow-movement for going to the left I get this now:
if( ig.input.state('left') ) {
this.vel.x = -200;
this.vel.y = 0;
this.currentAnim = this.anims.walkleft;
this.formerpressed = 'left';
//set this.destinationx and dthis.destination y is for the movement by mouse-click
this.destinationx = 99999999;
this.destinationy = 99999999;
}
The character animation code as defined by me in the entity init-function is like this:
this.addAnim( 'walkleft', 0.1, [4,5,6,7] ); this.addAnim( 'walkright', 0.1, [8,9,10,11] ); this.addAnim( 'walkup', 0.1, [12,13,14,15] ); this.addAnim( 'walkdown', 0.1, [0,1,2,3] ); this.addAnim( 'lookleft', 1, [4] ); this.addAnim( 'lookright', 1, [8] ); this.addAnim( 'lookup', 1, [12] ); this.addAnim( 'lookdown', 1, [0] );
so I have an animation for walking in all 4 directions and looking (but standing still) in all 4 directions.
Good luck with it and if you have questions , just ask.
Sleenee
