RMRK is retiring.
Registration is disabled. The site will remain online, but eventually become a read-only archive. More information.

RMRK.net has nothing to do with Blockchains, Cryptocurrency or NFTs. We have been around since the early 2000s, but there is a new group using the RMRK name that deals with those things. We have nothing to do with them.
NFTs are a scam, and if somebody is trying to persuade you to buy or invest in crypto/blockchain/NFT content, please turn them down and save your money. See this video for more information.
Snippet Request: Calculate distance

0 Members and 1 Guest are viewing this topic.

**
Rep: +0/-0Level 88
Hello, my objective is to execute a parallel process event when the character is close enough to him.
My idea is to have a conditional branch before the actions to allow or prevent execution.

I'm using an anti event lag script by NearFantastica that has this little code
Code: [Select]
def in_range?(object)
  screne_x = $game_map.display_x
  screne_x -= 256
  screne_y = $game_map.display_y
  screne_y -= 256
  screne_width = $game_map.display_x
  screne_width += 2816
  screne_height = $game_map.display_y
  screne_height += 2176
  return false if object.real_x <= screne_x
  return false if object.real_x >= screne_width
  return false if object.real_y <= screne_y
  return false if object.real_y >= screne_height
  return true
end

I want to use this, to verify if the event in on screen. So in the conditional branch script, im typing
"in_range?($game_map.events[039])" hoping to get a true or false returned. This gives me a Syntax Error.

Is this possible? and if it is, what am I doing wrong?
Thanx for your help.

*
? ? ? ? ? ? ? ? ? The nice kind of alien~
Rep:
Level 92
Martian - Occasionally kind
If you use leading zeroes the interpreter expect the number to be base 8 rather than base ten. (I.e. 0-7 instead of 0-9)
Remove the leading zero and tell me what happens then.

*hugs*

**
Rep: +0/-0Level 88
Ok that got me a new error, NoMethodError

undefined method 'in_range?' for #<Interpreter:0x8b73a78>

Hope this helps to understand what is going on.

EDIT: Found a way to do what I wanted. I added this to the scripts.
Code: [Select]
class MyClass
  def self.distance(object)
    screne_x = $game_map.display_x
    screne_x -= 50
    screne_y = $game_map.display_y
    screne_y -= 50
    screne_width = $game_map.display_x
    screne_width += 2450
    screne_height = $game_map.display_y
    screne_height += 1900
    return false if object.real_x <= screne_x
    return false if object.real_x >= screne_width
    return false if object.real_y <= screne_y
    return false if object.real_y >= screne_height
    return true
  end
end
This is the same code modified in both parameters, and making it a self method in another class. This allowed me to make the conditional branch using this piece of code.
Code: [Select]
MyClass.distance($game_map.events[39])
It works perfctly, but I don't know if this was the best solution, memory or processor wise. Or even if the creation of a new class is recommended. So if u have a better solution I'll be pleased to use it. So far it appears to work perfect for me.
« Last Edit: February 17, 2011, 09:43:46 PM by sanchezinc »

**
Rep:
Level 82
Code: [Select]
class Interpreter
  def range?(args)
    if args.is_a?(Array)
      # If an array of coordinates has been passed
      x, y = args[0], args[1]
    else
      # Assume the argument is either an event or a $game_player
      x, y = args.x, args.y
    end
    return Math.hypot((self.x - x), (self.y - y))
  end
end   
 

You can use this an events code, it will test the distance from itself to the argument that was passed. You can either pass an event ($game_map.events[2], $game_player, or an array of coordinates ([3, 5]). It will return the distance, in tiles, that the event is from the argument.

ex. In an events code, you could use this:

Conditional Branch: Script: range?($game_player) <= 4

This will return in true when the player is within 4 tiles of the event.
« Last Edit: February 21, 2011, 02:26:49 AM by ForeverZero »

**
Rep: +0/-0Level 88
Thanx! I like the versatility of your code, I could also use that for other features different from what I was looking for. But I do have a couple questions. How would I make this an event's code? With the call script? If that's the case, and the code doesnt fit in a single call script, can it be divided in 2 or more sections? Hope I was clear on my questions. And thank you once again.

EDIT:

I think it's important to mention that the code I posted is NOT to calculate distance, I put a missleading thread title. What it really does is determine if a given event is in the screen (or area around the screen to be more precise). The advantage I see on this is (I think) if you pan the screen, the event will be performing the actions. Thanx again for the distance contribution, I think this will be usefull for lots of people, not oonly me.
« Last Edit: February 18, 2011, 08:55:30 PM by sanchezinc »

**
Rep:
Level 82
I edited the code above, I noticed an error with the argument.

Here's an old script I wrote (my scripts can be found as Chaos Project) that should take care of all your problems.

Code: [Select]
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:
# Event Range Conditions
# Author: ForeverZer0
# Version: 1.0
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:
#
# Explanation:
#
#   Allows you to set up conditional branches in events that will be based off
#   the event's coordinates in relation to the player's coordinates without
#   having to create any variables for the X and Y of each.
#
#   Here are the new features you can use a conditional branch. Just type these
#   into the script box for the branch.
#
#   range?(RANGE, EVENT_ID) - Will be true if player is anywhere in the radius
#                             defined by RANGE from the event with EVENT_ID
#
#   on_screen?(EVENT_ID)    - Will be true if the event with EVENT_ID is within
#                             the visible screen
#
#   x_dist?(DIST, EVENT_ID) - Returns true if the player's x/y is within DIST
#            OR               of event's x/y with EVENT_ID. These are absolute
#   y_dist?(DIST, EVENT_ID)   values, meaning it doesn't matter which direction,
#                             it just uses the total distance in tiles for that
#                             axis. Use a DIST of 0 to check if that axis is
#                             equal.
#
#   player_above?(EVENT_ID) - Returns true when player is above event.
#   player_below?(EVENT_ID) - Returns true when player is below event.
#   player_right?(EVENT_ID) - Returns true when player is right of the event.
#   player_left?(EVENT_ID)  - Returns true when player is left of the event.
#
#   For all of these, if the conditional branch that is using them is within
#   the event that it applies to, you do not have to include the EVENT_ID, it
#   is assumed to be that event's ID unless otherwise defined.
#
#   You can use these as a condition for just about anything, such as having
#   an event say something, run away, or run toward the player if it is within a
#   specific distance, and it's much easier than using multiple branches and
#   game variables to set it up.
#
#   Remember that if you use a range condition with a parallel trigger, it will
#   continue to execute as long as the condition is met and if the player cannot
#   move during the event's code, the game will effectively be stuck.
#
# Compatability:
#
#   - You may encounter issues if using a Pixel Movement script, though it
#     should still work fine with an 8-Way Movement script. (Not tested)
#
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:

class Interpreter
 
  def range?(range = 4, id = @event_id)
    e = $game_map.events[id]
    radius = (Math.hypot((e.x - $game_player.x), (e.y - $game_player.y))).abs
    return (radius <= range)
  end
 
  def on_screen?(id = @event_id)
    x, y = $game_map.events[id].real_x, $game_map.events[id].real_y
    if ((x - $game_map.display_x + 64) / 4).between?(0, 640) &&
       ((y - $game_map.display_y) / 4).between?(0, 480)
      return true
    end
    return false
  end
 
  def x_dist?(distance = 0, id = @event_id)
    x_dif = ($game_map.events[id].x - $game_player.x).abs
    return (x_dif <= distance)
  end
 
  def y_dist?(distance = 0, id = @event_id)
    y_dif = ($game_map.events[id].y - $game_player.y).abs
    return (y_dif <= distance)
  end
 
  def player_above?(id = @event_id)
    return ($game_map.events[id].y > $game_player.y)
  end
 
  def player_below?(id = @event_id)
    return ($game_map.events[id].y < $game_player.y)
  end
 
  def player_right?(id = @event_id)
    return ($game_map.events[id].x < $game_player.x)
  end
 
  def player_left?(id = @event_id)
    return ($game_map.events[id].x > $game_player.x)
  end
 
end

« Last Edit: February 21, 2011, 02:33:53 AM by ForeverZero »

**
Rep: +0/-0Level 88
Excelent script, just tried it on my game, works perfectly. This should have been a standard script built into the original RMXP. Its so basic and useful.