Altimit Pixel Movement [0.50β]

Zeldashu

Villager
Member
Joined
Feb 5, 2020
Messages
11
Reaction score
0
First Language
english
Primarily Uses
RMMV
No one seems to have the same problem as me? I use coordinates to determine the player's range of attacks, and execute certain commands if there is a target event in the range.

However, in the actual test, as long as the NPC moves, even if the player is in front of the NPC, there is no successful judgment.(NPCS that do not move are 100% successful.)

Is this a mistake?
 

Deru

Warper
Member
Joined
Mar 20, 2020
Messages
1
Reaction score
0
First Language
Italian
Primarily Uses
RMMV
I encounter this particular error:
Any help?
 

Attachments

Restart

Veteran
Veteran
Joined
Mar 15, 2019
Messages
416
Reaction score
267
First Language
English
Primarily Uses
RMMV
No one seems to have the same problem as me? I use coordinates to determine the player's range of attacks, and execute certain commands if there is a target event in the range.

However, in the actual test, as long as the NPC moves, even if the player is in front of the NPC, there is no successful judgment.(NPCS that do not move are 100% successful.)

Is this a mistake?
can you show the code? It's possible the issue is that it is looking for an exact integer location, and since NPCs spawn on exact integer locations, that would make static npcs work and ones that move not.
 

Zeldashu

Villager
Member
Joined
Feb 5, 2020
Messages
11
Reaction score
0
First Language
english
Primarily Uses
RMMV
can you show the code? It's possible the issue is that it is looking for an exact integer location, and since NPCs spawn on exact integer locations, that would make static npcs work and ones that move not.
QQ图片20200403141737.png
Sorry, I am a Chinese user, so the above screenshot has Chinese.

The general approach is to get the coordinates in front of the player through variables, and then determine the effect according to the above script.

Maybe there's something wrong with this coordinate acquisition.
 

PresaDePrata

Veteran
Veteran
Joined
Dec 4, 2014
Messages
84
Reaction score
17
First Language
Portuguese
Primarily Uses
RMMV
Your work is truly amazing. This is by far the best pixel movement to RPG Maker i've ever seen. Copy and paste and everything becomes fluid and as you intended, like it has always been part of RPG Maker movement. Just tested some moments ago.

Unfortunately is not compatible with Yanfly's chase event and move core extra (hug wall for example).
 

Restart

Veteran
Veteran
Joined
Mar 15, 2019
Messages
416
Reaction score
267
First Language
English
Primarily Uses
RMMV
View attachment 138686
Sorry, I am a Chinese user, so the above screenshot has Chinese.

The general approach is to get the coordinates in front of the player through variables, and then determine the effect according to the above script.

Maybe there's something wrong with this coordinate acquisition.
I still don't understand how you're getting targetIds in the first place. Is it something like

Code:
//find the coordinate in front of the player
//first, we map from the direction8 to a map coordinate
	var vecx = [0 , -1 , 0 , 1 , -1 , 0 , 1 , -1, 0 , 1];
	var vecy = [0 , 1 , 1 , 1, 0 ,0 ,0 ,-1 ,-1 ,-1];
var mapx = vecx[$gamePlayer.direction8()]+$gamePlayer.x
var mapy = vecy[$gamePlayer.direction8()]+$gamePlayer.y

//loop through all events
var eventList=$gameMap.events();
for (var i = 0; i < eventList.length; i++) 
{
     // check if an event is within a range of 1 of the tile we selected earlier
     if (  (  eventlist[i].x - mapx)*(  eventlist[i].x - mapx) +(  eventlist[i].y - mapy)*(  eventlist[i].y - mapy) <1)
     {
          //Do what you want it to do here
     }
}
 
Last edited:

Zeldashu

Villager
Member
Joined
Feb 5, 2020
Messages
11
Reaction score
0
First Language
english
Primarily Uses
RMMV
I still don't understand how you're getting targetIds in the first place. Is it something like

Code:
//find the coordinate in front of the player
//first, we map from the direction8 to a map coordinate
    var vecx = [0 , -1 , 0 , 1 , -1 , 0 , 1 , -1, 0 , 1];
    var vecy = [0 , 1 , 1 , 1, 0 ,0 ,0 ,-1 ,-1 ,-1];
var mapx = vecx[$gamePlayer.direction8()]
var mapy = vecy[$gamePlayer.direction8()]

//loop through all events
var eventList=$gameMap.events();
for (var i = 0; i < eventList.length; i++)
{
     // check if an event is within a range of 1 of the tile we selected earlier
     if (  (  eventlist[i].x - mapx)*(  eventlist[i].x - mapx) +(  eventlist[i].y - mapy)*(  eventlist[i].y - mapy) <1)
     {
          //Do what you want it to do here
     }
}
I don't know anything about code, so I use the default "Get Position Info" button to get the current player's coordinates.

Then, according to this rectangular coordinate, the player is facing the direction and whether he is attacking or not. If the attack occurs, the coordinates in the area facing the player's face are obtained, and the event is determined with the script in the above screenshot.(I learned this script from some Japanese game templates.)

I only understand the comments in the code you gave. Is it the solution to the problem?
 

ShadowDragon

Veteran
Veteran
Joined
Oct 8, 2018
Messages
1,736
Reaction score
572
First Language
Dutch
Primarily Uses
RMMV
@Zeldashu just to tell you that altimit and region restriction dont work together unless you modify the plugin,
in either one, also, altimit should be under region restriction. do you have other plugins and are those in
the correct order?
 

Zeldashu

Villager
Member
Joined
Feb 5, 2020
Messages
11
Reaction score
0
First Language
english
Primarily Uses
RMMV
@Zeldashu just to tell you that altimit and region restriction dont work together unless you modify the plugin,
in either one, also, altimit should be under region restriction. do you have other plugins and are those in
the correct order?
All I do is take the coordinates to determine if there is an event on them, and then decide what's going to happen next. So I don't quite understand what you mean by region restriction, because it doesn't seem to have anything to do with coordinates, right?

Forgive me if I'm wrong.

When testing plug-ins, I deliberately set all other plug-ins to OFF, so it should not be caused by other plug-ins.

I think the problem is the coordinate fetch, the plugin changes the movement so that the regular method of getting the coordinates doesn't work.
 

ShadowDragon

Veteran
Veteran
Joined
Oct 8, 2018
Messages
1,736
Reaction score
572
First Language
Dutch
Primarily Uses
RMMV
YEP_RegionRestriction is a nice plugin, but block movents as region ID dont have affect when altimit pixelmovement
is on, also, I notice some other stuff that dont trigger it that comes with that plugin unless its modified.

using region id's outside that plugin can work, but not the region id's set up with region restriction plugin.
Even if I wanted altimit plugin, it doesn't work together and some others as well.

but that plugin is also the best pixelmovement that there is atm. modify it in the way you need is the best
part to get it to work nicely with all the plugins you like :)
 

Restart

Veteran
Veteran
Joined
Mar 15, 2019
Messages
416
Reaction score
267
First Language
English
Primarily Uses
RMMV
Are you storing the event's X,Y coordinates in one of the RMMV-provided variable slots?

RMMV rounds variables into integers.

Can you explain what the pink text does? My attempt at machine translation wasn't very successful. Is it a method which calls $gameMap.eventIdXy()? If so, the problem is that .eventIdXy only does exact matches (it doesn't scan a radius).

For instance, if your monster is at [2,5.1], then putting in $gameMap.eventIdXy(2,5) will return nothing. If the monster were at EXACTLY [2,5], then $gameMap.eventIdXy would return the event ID.


If you want to scan an AOE, my code above should give you a framework for doing that. Let me expand on it:


Code:
//find the coordinate in front of the player
//first, we map from the direction8 to a map coordinate
    var vecx = [0 , -1 , 0 , 1 , -1 , 0 , 1 , -1, 0 , 1];
    var vecy = [0 , 1 , 1 , 1, 0 ,0 ,0 ,-1 ,-1 ,-1];
var mapx = vecx[$gamePlayer.direction8()]+$gamePlayer.x
var mapy = vecy[$gamePlayer.direction8()]+$gamePlayer.y

//loop through all events
var eventList=$gameMap.events();
for (var i = 0; i < eventList.length; i++)
{
     // check if an event is within a range of 1 of the tile we selected earlier
     if (  (  eventlist[i].x - mapx)*(  eventlist[i].x - mapx) +(  eventlist[i].y - mapy)*(  eventlist[i].y - mapy) <1)
     {
          targetID= eventList(i).eventId()

Code:
     }
}
 
Last edited:

Zeldashu

Villager
Member
Joined
Feb 5, 2020
Messages
11
Reaction score
0
First Language
english
Primarily Uses
RMMV
Are you storing the event's X,Y coordinates in one of the RMMV-provided variable slots?

RMMV rounds variables into integers.

Can you explain what the pink text does? My attempt at machine translation wasn't very successful. Is it a method which calls $gameMap.eventIdXy()? If so, the problem is that .eventIdXy only does exact matches (it doesn't scan a radius).

For instance, if your monster is at [2,5.1], then putting in $gameMap.eventIdXy(2,5) will return nothing. If the monster were at EXACTLY [2,5], then $gameMap.eventIdXy would return the event ID.


If you want to scan an AOE, my code above should give you a framework for doing that. Let me expand on it:


Code:
//find the coordinate in front of the player
//first, we map from the direction8 to a map coordinate
    var vecx = [0 , -1 , 0 , 1 , -1 , 0 , 1 , -1, 0 , 1];
    var vecy = [0 , 1 , 1 , 1, 0 ,0 ,0 ,-1 ,-1 ,-1];
var mapx = vecx[$gamePlayer.direction8()]
var mapy = vecy[$gamePlayer.direction8()]

//loop through all events
var eventList=$gameMap.events();
for (var i = 0; i < eventList.length; i++)
{
     // check if an event is within a range of 1 of the tile we selected earlier
     if (  (  eventlist[i].x - mapx)*(  eventlist[i].x - mapx) +(  eventlist[i].y - mapy)*(  eventlist[i].y - mapy) <1)
     {
          targetID= eventList(i).eventId()

Code:
     }
}
I get the general idea of what's going on.

The pink part means: get the event ids corresponding to x and y on the map and store them into the variable 04 (object ID).

The following code then determines whether the comment bar for the corresponding event has the word [敌人], and if so, opens the specified self - switch.

If I understand you correctly, the code you give is to define two characters as an array and add face orientation. I didn't understand the rest of it very well.

How can I make this script work for me? It doesn't seem to be the same as my current method of getting coordinates. Should I write it as a js file? If so, how do I call it?
 
Last edited:

Restart

Veteran
Veteran
Joined
Mar 15, 2019
Messages
416
Reaction score
267
First Language
English
Primarily Uses
RMMV
If I understand you correctly, the code you give is to define two characters as an array and add face orientation. I didn't understand the rest of it very well.

How can I make this script work for me? It doesn't seem to be the same as my current method of getting coordinates. Should I write it as a js file? If so, how do I call it?
This segment
Code:
//find the coordinate in front of the player
//first, we map from the direction8 to a map coordinate
    var vecx = [0 , -1 , 0 , 1 , -1 , 0 , 1 , -1, 0 , 1];
    var vecy = [0 , 1 , 1 , 1, 0 ,0 ,0 ,-1 ,-1 ,-1];
var mapx = vecx[$gamePlayer.direction8()]+$gamePlayer.x
var mapy = vecy[$gamePlayer.direction8()]+$gamePlayer.y
Calls the altimit ".direction8()" function, which gives the 8 directional facing of the player (so upper-left is 7, upper right is 9, down is 2, etc)

It converts that to a coordinate relative to the player (so upper left is [-1,-1], upper right is [1,-1], and down is [0,1]). Then it adds the player's location (whoops, forgot to include that in the first draft). That gives the coordinate of the tile that the player is facing.

This segment
Code:
//loop through all events
var eventList=$gameMap.events();
for (var i = 0; i < eventList.length; i++)
{
gets all the events on the map, and loops through them.

Note:I am NOT looping through "$gameMap.event(i)", because event numbers aren't necessarily sequential (you can have event 1, event 35, and event 56 on the same map with nothing else).

Code:
     // check if an event is within a range of 1 of the tile we selected earlier
     if (  (  eventlist[i].x - mapx)*(  eventlist[i].x - mapx) +(  eventlist[i].y - mapy)*(  eventlist[i].y - mapy) <1)
     {
          targetID= eventList(i).eventId()
Once we're looping through them all, we check each event on the map to see how far they are from the tile the player is facing (using the standard sqrt(dx^2 + dy^2) formula ). If the event is within 1 tile of our coordinate, we save the targetID of that event. Then just proceed processing as normal




I haven't tested this guy but you should be able to just put it in a script block.
 

Zeldashu

Villager
Member
Joined
Feb 5, 2020
Messages
11
Reaction score
0
First Language
english
Primarily Uses
RMMV
This segment
Code:
//find the coordinate in front of the player
//first, we map from the direction8 to a map coordinate
    var vecx = [0 , -1 , 0 , 1 , -1 , 0 , 1 , -1, 0 , 1];
    var vecy = [0 , 1 , 1 , 1, 0 ,0 ,0 ,-1 ,-1 ,-1];
var mapx = vecx[$gamePlayer.direction8()]+$gamePlayer.x
var mapy = vecy[$gamePlayer.direction8()]+$gamePlayer.y
Calls the altimit ".direction8()" function, which gives the 8 directional facing of the player (so upper-left is 7, upper right is 9, down is 2, etc)

It converts that to a coordinate relative to the player (so upper left is [-1,-1], upper right is [1,-1], and down is [0,1]). Then it adds the player's location (whoops, forgot to include that in the first draft). That gives the coordinate of the tile that the player is facing.

This segment
Code:
//loop through all events
var eventList=$gameMap.events();
for (var i = 0; i < eventList.length; i++)
{
gets all the events on the map, and loops through them.

Note:I am NOT looping through "$gameMap.event(i)", because event numbers aren't necessarily sequential (you can have event 1, event 35, and event 56 on the same map with nothing else).

Code:
     // check if an event is within a range of 1 of the tile we selected earlier
     if (  (  eventlist[i].x - mapx)*(  eventlist[i].x - mapx) +(  eventlist[i].y - mapy)*(  eventlist[i].y - mapy) <1)
     {
          targetID= eventList(i).eventId()
Once we're looping through them all, we check each event on the map to see how far they are from the tile the player is facing (using the standard sqrt(dx^2 + dy^2) formula ). If the event is within 1 tile of our coordinate, we save the targetID of that event. Then just proceed processing as normal




I haven't tested this guy but you should be able to just put it in a script block.
Thanks for your patience, I have fully understood how this code works. But then came two questions:

1.MV's default "script" button has a 12-line word limit, so I can't fit all of the above code in. And segmenting it doesn't seem to work. It seems possible to write this script as a js file, but I don't know how I can call it by doing so.

2. If I understand correctly, the current judgment method can only judge the range of one tile in front of the player. How do I rewrite this code if I want to set a weapon with an arbitrary attack range?

The previous way to get coordinates was to add and subtract player coordinates to achieve different weapon attack ranges. But this new method I don't know which way to do it.

Code:
//find the coordinate in front of the player
//first, we map from the direction8 to a map coordinate
    var vecx = [0 , -1 , 0 , 1 , -1 , 0 , 1 , -1, 0 , 1];
    var vecy = [0 , 1 , 1 , 1, 0 ,0 ,0 ,-1 ,-1 ,-1];
var mapx = vecx[$gamePlayer.direction8()]+$gamePlayer.x
var mapy = vecy[$gamePlayer.direction8()]+$gamePlayer.y

//loop through all events
var eventList=$gameMap.events();
for (var i = 0; i < eventList.length; i++)
{
     // check if an event is within a range of 1 of the tile we selected earlier
     if (  (  eventlist[i].x - mapx)*(  eventlist[i].x - mapx) +(  eventlist[i].y - mapy)*(  eventlist[i].y - mapy) <1)
     {
          targetID= eventList(i).eventId()
if(targetID != 0 && ~$dataMap.events[targetID].note.indexOf("[敌人]")){
 var mapID = this._mapId;
 if(!$gameSelfSwitches.value([mapID, targetID, "B"])){
  $gameSelfSwitches.setValue([mapID, targetID, "A"], true);
 }
}
     }
}
I'm not sure if I'm calling it the wrong way or scripting it the wrong way. The actual test did not work as expected.(The self switch is not turned on)

36.gif(The current effect)
37.gif(Original effect)
 

Restart

Veteran
Veteran
Joined
Mar 15, 2019
Messages
416
Reaction score
267
First Language
English
Primarily Uses
RMMV
More compact version (and fixed a capitalization typo). TBH when I personally write scripts I usually just wrap everything that's more than one or two lines into a function and then put it into a big unorganized MyPlugin.js
Code:
var mapx = [0 , -1 , 0 , 1 , -1 , 0 , 1 , -1, 0 , 1][$gamePlayer.direction8()]+$gamePlayer.x
var mapy = [0 , 1 , 1 , 1, 0 ,0 ,0 ,-1 ,-1 ,-1][$gamePlayer.direction8()]+$gamePlayer.y
var eventList=$gameMap.events();
for (var i = 0; i < eventList.length; i++){
   if (  (  eventList[i].x - mapx)*(  eventList[i].x - mapx) +(  eventList[i].y - mapy)*(  eventList[i].y - mapy) <100)     {targetID= eventList[i].eventId()
     if(targetID != 0 && ~$dataMap.events[targetID].note.indexOf("[敌人]")){
       var mapID = this._mapId;
       if(!$gameSelfSwitches.value([mapID, targetID, "B"])){$gameSelfSwitches.setValue([mapID, targetID, "A"], true);}
     }
   }
}
You will probably want to experiment a bit with the radius / exact coordinates of the center of the effect.
 
Last edited:

Zeldashu

Villager
Member
Joined
Feb 5, 2020
Messages
11
Reaction score
0
First Language
english
Primarily Uses
RMMV
More compact version (and fixed a capitalization typo). TBH when I personally write scripts I usually just wrap everything that's more than one or two lines into a function and then put it into a big unorganized MyPlugin.js
Code:
var mapx = [0 , -1 , 0 , 1 , -1 , 0 , 1 , -1, 0 , 1][$gamePlayer.direction8()]+$gamePlayer.x
var mapy = [0 , 1 , 1 , 1, 0 ,0 ,0 ,-1 ,-1 ,-1][$gamePlayer.direction8()]+$gamePlayer.y
var eventList=$gameMap.events();
for (var i = 0; i < eventList.length; i++){
   if (  (  eventList[i].x - mapx)*(  eventList[i].x - mapx) +(  eventList[i].y - mapy)*(  eventList[i].y - mapy) <100)     {targetID= eventList[i].eventId()
     if(targetID != 0 && ~$dataMap.events[targetID].note.indexOf("[敌人]")){
       var mapID = this._mapId;
       if(!$gameSelfSwitches.value([mapID, targetID, "B"])){$gameSelfSwitches.setValue([mapID, targetID, "A"], true);}
     }
   }
}
You will probably want to experiment a bit with the radius / exact coordinates of the center of the effect.
Thanks for your help! The code is working.
I made a few small changes to the code for my own needs and added some comments that I hope will help others as well.
Code:
var mapx = $gamePlayer.x    //Based on the player coordinates, increase or decrease this value to achieve the attack range of any weapon.Of course, if you only need to determine the tile in front of the player, it's easier to use the original array.
var mapy = $gamePlayer.y    //The formula in the lower square bracket, n is used to detect the value of the tile (perhaps). Setting it to 100 will result in half the screen (about 10 tiles) being in the detection range.
var eventList=$gameMap.events();
for (var i = 0; i < eventList.length; i++){
   if (  (  eventList[i].x - mapx)*(  eventList[i].x - mapx) +(  eventList[i].y - mapy)*(  eventList[i].y - mapy) <1)     
{targetID= eventList[i].eventId()
     if(targetID != 0 && ~$dataMap.events[targetID].note.indexOf("[敌人]")){
       var mapID = this._mapId;
       if(!$gameSelfSwitches.value([mapID, targetID, "B"])){$gameSelfSwitches.setValue([mapID, targetID, "A"], true);}
     }
   }
}
 

Restart

Veteran
Veteran
Joined
Mar 15, 2019
Messages
416
Reaction score
267
First Language
English
Primarily Uses
RMMV
Altimit doesn't have a stock way of asking 'do these two characters have colliders that touch'?

This implementation is ugly but does the job.

Put it into Altimit right under the Game_Map.prototype.touchesCharacters function
Code:
      Game_Map.prototype.isTouchingAB = function( characterA, characterB ) {
		var x=characterA.x;
		var y=characterA.y;
        var collider = characterA.collider();
        var bboxTests = this.getAABBoxTests( characterA, 0, 0 );

        // Gather any solid characters within the movement bounding box
        var loopMap = {};
        var characters = [characterB].filter( function( entry ) {
          if ( characterA.collidableWith( entry ) ) {
            for ( var ii = 0; ii < bboxTests.length; ii++ ) {
              if ( Collider.aabboxCheck( bboxTests[ii].x, bboxTests[ii].y, bboxTests[ii].aabbox, entry._x, entry._y, entry.collider().aabbox ) ) {
                loopMap[entry] = bboxTests[ii].type;
                return true;
              }
            }
          }
          return false;
        } );

        // Test collision with characters
        for ( var ii = 0; ii < characters.length; ii++ ) {
          var entryX = characters[ii]._x;
          var entryY = characters[ii]._y;

          if ( loopMap[characters[ii]] == 1 ) { entryX += this.width(); }
          else if ( loopMap[characters[ii]] == 2 ) { entryX -= this.width(); }
          else if ( loopMap[characters[ii]] == 3 ) { entryY += this.height(); }
          else if ( loopMap[characters[ii]] == 4 ) { entryY -= this.height(); }
          else if ( loopMap[characters[ii]] == 5 ) { entryX += this.width(); entryY += this.height(); }
          else if ( loopMap[characters[ii]] == 6 ) { entryX -= this.width(); entryY += this.height(); }
          else if ( loopMap[characters[ii]] == 7 ) { entryX += this.width(); entryY -= this.height(); }
          else if ( loopMap[characters[ii]] == 8 ) { entryX -= this.width(); entryY -= this.height(); }

          if ( Collider.intersect( x, y, collider, entryX, entryY, characters[ii].collider() ) ) {
            return true;
          }
        }

        return false;
      };
 

DigitalWF

Veteran
Veteran
Joined
Apr 13, 2020
Messages
68
Reaction score
10
First Language
English
Primarily Uses
RMMV
I tried the plugin and it's really great! But how to change the movement speed?
 

Restart

Veteran
Veteran
Joined
Mar 15, 2019
Messages
416
Reaction score
267
First Language
English
Primarily Uses
RMMV
I tried the plugin and it's really great! But how to change the movement speed?
Should be the same as in base RPG maker? What issue are you having?
 

NonServiam

Warper
Member
Joined
Apr 18, 2020
Messages
3
Reaction score
0
First Language
español
Primarily Uses
RMMV
I'm trying to use this plugin with TileD, I read that I have to modify the character colliders, but I don't know how I should do it, I'm a beginner. thanks for the plugin.
 

Users Who Are Viewing This Thread (Users: 0, Guests: 2)

Latest Threads

Latest Profile Posts

Its ironic, how often a person can have something smart to say, when their arrogance is originating from an internal vacuum where emotional intelligence belongs.
Parallax mapping is time consuming...
Let's purchase th... WAIT! Just in time ehehehe.
Excited with the idea of a new maker, but I imagine I'll probably be disappointed.
super disappointed there will be a new RPG Maker without the current one being "finished"(we all know it wont get any more updates)

Forum statistics

Threads
98,146
Messages
949,690
Members
129,431
Latest member
Xiuying
Top