Difference between revisions of "AlignChar (CMS)"

From The Official Visionaire Studio: Adventure Game Engine Wiki
Line 19: Line 19:
 
1. Add the [[#Main_Script|main script]] to the Visionaire Studio Script Editor & set the script as a definition script.<br/>
 
1. Add the [[#Main_Script|main script]] to the Visionaire Studio Script Editor & set the script as a definition script.<br/>
 
2a. To align current character to another character...
 
2a. To align current character to another character...
<syntaxhighlight>
+
<syntaxhighlight lang="lua">
alignChar("", "character_name")
+
alignChar(nil, "Tom")
 
</syntaxhighlight>
 
</syntaxhighlight>
 
2b. To align a specific character to another character...
 
2b. To align a specific character to another character...
<syntaxhighlight>
+
<syntaxhighlight lang="lua">
alignChar("character_name", "character_name")
+
alignChar("Tom", "Barry")
 
</syntaxhighlight>
 
</syntaxhighlight>
 
2c. To align a specific character to current character...
 
2c. To align a specific character to current character...
<syntaxhighlight>
+
<syntaxhighlight lang="lua">
alignChar("character_name", "")
+
alignChar("Tom", nil)
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 
== Main Script ==
 
== Main Script ==
<syntaxhighlight>
+
<syntaxhighlight lang="lua">
 
function alignChar(c, t)
 
function alignChar(c, t)
  if c == "" then c = game:getLink(VGameCurrentCharacter) else c = getObject("Characters[" .. c .. "]") end
+
  if c == nil then c = game.CurrentCharacter else c = Characters[c] end -- check if character or current character
  if t == "" then t = game:getLink(VGameCurrentCharacter) else t = getObject("Characters[" .. t .. "]") end
+
  if t == nil then t = game.CurrentCharacter else t = Characters[t] end -- check if character or current character
 
  -- + --
 
  -- + --
  local p1 = c:getPoint(VCharacterPosition)
+
  local p1 = c.Position -- store characters position
  local p2 = t:getPoint(VCharacterPosition)
+
  local p2 = t.Position -- store target characters position
 
  -- + --
 
  -- + --
 
  local ax, ay
 
  local ax, ay
  ay = p1.y - p2.y
+
ax = p2.x - p1.x -- calculate x destination coordinate
ax = p2.x - p1.x
+
  ay = p1.y - p2.y -- calculate y destination coordinate
 
  -- + --
 
  -- + --
  local angle = math.deg( math.atan2(ay, ax) )
+
  local angle = math.deg( math.atan(ay, ax) ) -- calculate angle
  if angle < 0 then angle = 360 + angle end
+
  if angle < 0 then angle = 360 + angle end -- some fallback? I don't remember why I wrote it
 
  -- + --  
 
  -- + --  
  c:setValue(VCharacterDirection, angle)
+
  c.Direction = angle -- update specified characters direction
 
end
 
end
 
</syntaxhighlight>
 
</syntaxhighlight>
Line 56: Line 56:
 
! style="text-align:left" | Name !! style="text-align:left" | Type !! style="text-align:left;width:80%" | Description
 
! style="text-align:left" | Name !! style="text-align:left" | Type !! style="text-align:left;width:80%" | Description
 
|-
 
|-
| c || "string" || This should be a "string" value containing the name of the character you want to affect; if string is empty it will default to current character.
+
| c || "string" or nil || This should be a "string" value containing the name of the character you want to affect, or nil if you want to link to the current character.
 
|-
 
|-
| t || "string" || This should be a "string" value containing the name of the character you want to align to; if string is empty it will default to current character.
+
| t || "string" || This should be a "string" value containing the name of the character you want to align to, or nil if you want to link to the current character.
|}
+
|}{{toc}}

Revision as of 23:38, 20 August 2022

Name Type By
alignChar("c", "t") Definition AFRLme

This small function allows you to quickly align a character to another character.

Additional Info
Alignment is based on character center which is usually set near the feet.
There is no simple method for obtaining the top (y) pixel coordinate of the currently active character animation.

Instructions

1. Add the main script to the Visionaire Studio Script Editor & set the script as a definition script.
2a. To align current character to another character...

alignChar(nil, "Tom")

2b. To align a specific character to another character...

alignChar("Tom", "Barry")

2c. To align a specific character to current character...

alignChar("Tom", nil)

Main Script

function alignChar(c, t)
 if c == nil then c = game.CurrentCharacter else c = Characters[c] end -- check if character or current character
 if t == nil then t = game.CurrentCharacter else t = Characters[t] end -- check if character or current character
 -- + --
 local p1 = c.Position -- store characters position
 local p2 = t.Position -- store target characters position
 -- + --
 local ax, ay
 ax = p2.x - p1.x -- calculate x destination coordinate
 ay = p1.y - p2.y -- calculate y destination coordinate
 -- + --
 local angle = math.deg( math.atan(ay, ax) ) -- calculate angle
 if angle < 0 then angle = 360 + angle end -- some fallback? I don't remember why I wrote it
 -- + -- 
 c.Direction = angle -- update specified characters direction
end

Syntax Breakdown

Name Type Description
c "string" or nil This should be a "string" value containing the name of the character you want to affect, or nil if you want to link to the current character.
t "string" This should be a "string" value containing the name of the character you want to align to, or nil if you want to link to the current character.