Home Gallery Resources The Team Rules chat Login Register
  Show Posts
Pages:  1 ... 3 4 5 [6] 7 8 9 ... 42
76  Super Smash Bros. Brawl Hacking / Attacks and Animations / Re: KJP's Throne Room. Accepting Testers for Solo Charizard. on: May 28, 2014, 01:50:22 PM
Just make a few temporary bones to anchor/pivot around.  One for the center and rotation around the circle.  Another for for the radius. One more for Charizard local rotation that isn't the HipN because I'm sure you used it.

With that, you can easily angle and distance Charizard in whatever way.  

When the animation is over, you're gonna want to place those temp anchors back in place to avoid teleporting or w/e I'd assume.

--

The above is how I'd do it for BB.  For maya, I'd do the same, but use bones + parent constraints that aren't on the model and then bake those bones onto the brawl bones.
77  Super Smash Bros. Brawl Hacking / Attacks and Animations / Re: KJP's Throne Room. Accepting Testers for Solo Charizard. on: May 25, 2014, 01:47:14 PM
Quote


I had a feeling something was off.  Try having his back foot rotate back first before rotating back on it.  He's not balanced at all either.  Rotate his body back ontop his leg/foot more and have the knee rotate down instead of up- creating the balanced counter rotation. 

I dunno, but how about having his body arch  forward and contracted(?)/squash(?).  Then on the kicks, have his body out like you do (stretch).

Here's a ref/tutorial on balance and counter rotation. 

https://www.youtube.com/watch?v=4tH21VQmgFw&feature=player_detailpage&list=PLRmRrrqobkWhx3-H-jRFrutNdC3v6p8VR
78  Help & Tutorials / A/A Tutorials / Re: Animating in Maya with Control Rigs, Baking, and Exporting into Brawlbox on: May 22, 2014, 09:24:18 PM
Does BB support importing multiple animations from a single .anim file?  If not then, someone's gotta write one. 

79  Super Smash Bros. Brawl Hacking / Attacks and Animations / Re: KJP's Throne Room. Accepting Testers for Solo Charizard. on: May 22, 2014, 04:18:13 PM
The back leg seems off.  It remains at the same 90 angle throughout. He looks off balance with his center not over his back foot.  

___

I'll get to you soon on the Seismic toss.  I'm still learning how to IK rig properly in Maya.  I'll try to not take too long.  
80  Super Smash Bros. Brawl Hacking / Programming / Re: Universal Model Converter - dev4.5 pre-release on: May 22, 2014, 01:17:08 PM
Hey Tcll, it's nice to see that you're devoted to this after so long.  How do you do the conversion from one format to another?  I'd imagine you import from one format to an internal intermediate more general one.  Then convert from that to the export format.  That way you're not trying to code ways to export directly from one format to another.  If this is how you do it, couldn't you support basic formats to more complex ones as you move forward?  The main dev would then be  focusing on allowing the internal intermediate blah format/structure to support everything -or chunking the internal format up so it's less coupled to eachother ([verts,edges,faces], [vert IDs, uvs, normals, binorm,tan],[vert IDs,bones,weights], etc instead of [verts,edges,faces,uvs,normals,binormals,tans,bones,weights] .....if you get what I'm saying hehee). 

I haven't kept up-to-date with things around here.  Sorry if you answered this or I misunderstand how you're doing things.
81  Super Smash Bros. Brawl Hacking / Attacks and Animations / Re: PSA Tips: What's possible and what's not possible. on: May 21, 2014, 03:43:45 AM
How far have you guys gotten on new Actions?  I stopped working on a brawl-like game recently but I based the moveset system off PSA actions/subactions from the PSA docs.

Here's what I learned and implemented that might be useful to others:

Actions
- run every game step
- nothing special, more like an animation  finite state machine
- those "ChangeAction" events are the transitions between states/actions
- in Unity, it's represented similarly.
-->the animation system has a bag of variables that are used to decide when wand what to transition to if a requirement succeeds (--> ChangeActions)
- Early on, I noticed that Actions never(?) contain any timer events (Asynchronous, Synchronous timers), but made plenty use of infinite loops + loop rests.
-->this backs up the idea that Actions are ran once per game step,
-->anyone who uses timers in there are probably misusing the event and are pausing the action for an entire animation frame instead of a single game step (loop rest)
-Since actions are just FSMs, you can create an entire alternative moveset if you can add actions.  --within memory limits ofc.
-gives control of an Action at the per game step

Subaction
- run once per animation step, sets an animation
- really, just gives control of an Action/animation code on a per animation frame step. (very useful as everyone who PSA's should know by now)
- I used to have an "AllowInterrupt" "event" in my game too.  Straight to the point, "AllowInterrupt" (do you guys still name it that?) is just a fancy word for "specific change actions".
--All current ChangeActions on my side are cached and checked at the end of a game step.
--when an Action changes, any currently existing ChangeActions events are thrown away
-Again, Actions are nothing special but a FSM -but at the PSA-like level, they're very easy to use (for those who program, a FSM doesn't scale well in code. However, the way Brawl does it for Actions, they scale fine.)
-Subactions also aren't anything special but a small script

uhh if I think of anything else that might be useful, I'll be sure to add to this.  These are just things I learned about when I was using PSA docs for guidance on how to setup a PSA-like system.  AFAIK, both systems turned out similar.

This is pretty much advertising a game I don't work on anymore... but I dunno it might be useful to see how my side turned out?

*Note*, anywhere you see coroutine.yield(runStatus.Running) within an infinite loop, it's similar to a LoopRest in PSA
*WARNING* raw and uneditted.  This is a debug/test moveset using Lua
Actions
Code:
local mitActions = function(_events)
local events = _events

events.lightPunchKeyPress = function()
return events:isKeyPress(keys.X)
end
events.jumpKeyPressed = function()
return events:isKeyPressed(keys.Z)
end
events.crouchKeyPressed = function()
return events:isKeyPressed(keys.Down)
end
events.upKeyPressed = function()
return events:isKeyPressed(keys.Up)
end

events.heavy_UpKeyPressed = function()
return events:isKeyPressed(keys.Up) and events:isKeyPressed(keys.C)
end
events.horizontalKeysPressed = function()
return events:areKeysPressed(events.horizontalKeys)
end
events.keyPressedTowardsWall = function()
local wallSide = events:getWallSide()

return (events:isKeyPressed(keys.Left) and wallSide == -1) or
  (events:isKeyPressed(keys.Right) and wallSide == 1)
end

--add change actions for: attack11,jumpBegin,crouch,walk,heavyUpAttackBegin
events.changeActions_Ground0 = function()

events:changeAction(events.actions.walk,events.horizontalKeysPressed)
events:addRequirement(events.onGround)
events:addRequirement(events.shouldBeOnGround)

events:changeAction(events.actions.jumpBegin,events.jumpkeyPressed)
events:addRequirement(events.onGround)
events:addRequirement(events.shouldBeOnGround)

events:changeAction(events.actions.crouch,events.crouchKeyPressed)
events:addRequirement(events.onGround)
events:addRequirement(events.shouldBeOnGround)

events:changeAction(events.actions.attack11,events.lightPunchKeyPress)
events:addRequirement(events.onGround)
events:addRequirement(events.shouldBeOnGround)

end

--add change actions for: airN,airF,wallSlide,hammerUp
events.changeActions_Air0 = function()
events:changeAction(events.actions.walk,events.horizontalKeysPressed)
events:changeAction(events.actions.walk,events.horizontalKeysPressed)
events:changeAction(events.actions.walk,events.horizontalKeysPressed)
events:changeAction(events.actions.walk,events.horizontalKeysPressed)

end
--empty func for now,replace with specifics later.
events.allowInterrupt = function()end
events.actions =
{
idle = action(
{
id = 0,
method = function()
--yield once to stay in sync with how game handles coroutines internally
coroutine.yield()

events:changeAction(events.actions.walk,events.horizontalKeysPressed)
events:addRequirement(events.onGround)
events:addRequirement(events.shouldBeOnGround)

events:changeAction(events.actions.jumpBegin,events.jumpKeyPressed)
events:addRequirement(events.onGround)
events:addRequirement(events.shouldBeOnGround)

events:changeAction(events.actions.attack11,events.lightPunchKeyPress)
events:addRequirement(events.onGround)
events:addRequirement(events.shouldBeOnGround)

events:changeAction(events.actions.heavyAttack_Up_Begin,events.heavy_UpKeyPressed)

events:changeAction(events.actions.fall,events.isFalling)
events:addRequirement(events.inAir)
events:addRequirement(events.shouldBeInAir)


events:setSubaction(events.subactions.idle)

while true do
coroutine.yield(runStatus.Running)
end
end
}),
walk = action(
{
id = 1,
method = function()
coroutine.yield()
events:changeAction(events.actions.idle,events.horizontalKeysPressed,true)

events:changeAction(events.actions.fall,events.isFalling)
events:addRequirement(events.inAir)
events:addRequirement(events.shouldBeInAir)

events:changeAction(events.actions.jumpBegin,events.jumpKeyPressed)
events:addRequirement(events.onGround)

events:changeAction(events.actions.attack11,events.lightPunchKeyPress)
events:addRequirement(events.onGround)
events:addRequirement(events.shouldBeOnGround)

events:changeAction(events.actions.heavyAttack_Up_Begin,events.heavy_UpKeyPressed)

events:setSubaction(events.subactions.walk)

while true do
events:moveRelative()
coroutine.yield(runStatus.Running)
end
end
}),
jumpBegin = action(
{
id = 5,
method = function()
coroutine.yield()

   events:offsetRelative(vector2(0,-3))
events:applyJumpImpulse()
events:setGroundAirTime(0)
--events:ignoreGroundCollisions()
--events:playSound(3,0.5)

events:setSubaction(events.subactions.jumpBegin)

coroutine.yield(runStatus.Running)
events:setShouldBeInAir(true)
events:setInAir(true)

events:changeAction(events.actions.fall,events.isFalling)
events:addRequirement(events.inAir)
events:addRequirement(events.shouldBeInAir)

events:changeAction(events.actions.rise,events.isRising)
events:addRequirement(events.inAir)
events:addRequirement(events.shouldBeInAir)

while true do
coroutine.yield(runStatus.Running)
end
end
}),
rise = action(
{
id = 6,
method = function()
coroutine.yield()

events:changeAction(events.actions.idle,events.onGround)
events:addRequirement(events.shouldBeOnGround)

events:changeAction(events.actions.fall,events.isFalling)
events:addRequirement(events.inAir)
events:addRequirement(events.shouldBeInAir)


events:changeAction(events.actions.airN,events.lightPunchKeyPress)
events:addRequirement(events.horizontalKeysPressed,true)
events:addRequirement(events.inAir)
events:addRequirement(events.shouldBeInAir)

events:changeAction(events.actions.airF,events.lightPunchKeyPress)
events:addRequirement(events.isKeyPressed_Forward)
events:addRequirement(events.inAir)
events:addRequirement(events.shouldBeInAir)

events:changeAction(events.actions.heavyAttack_Up_Begin,events.heavy_UpKeyPressed)

events:setSubaction(events.subactions.jumpLoop)

while true do
events:move()

--try to rise
if(events:isRiseTimeLessThanAllowed() and
events:isKeyPressed(events.jumpKeys)) then
events:setVelocityY(-150)
end

coroutine.yield(runStatus.Running)
end
end
}),
fall = action(
{
id = 7,
method = function()
coroutine.yield()

events:changeAction(events.actions.idle,events.onGround)
events:addRequirement(events.shouldBeOnGround)

events:changeAction(events.actions.rise,events.isRising)
events:addRequirement(events.inAir)

events:changeAction(events.actions.wallSlide,events.isFalling)
events:addRequirement(events.isTouchingWall)
events:addRequirement(events.keyPressedTowardsWall)

events:changeAction(events.actions.airN,events.lightPunchKeyPress)
events:addRequirement(events.horizontalKeysPressed,true)
events:addRequirement(events.inAir)
events:addRequirement(events.shouldBeInAir)

events:changeAction(events.actions.airF,events.lightPunchKeyPress)
events:addRequirement(events.isKeyPressed_Forward)
events:addRequirement(events.inAir)
events:addRequirement(events.shouldBeInAir)

events:changeAction(events.actions.heavyAttack_Up_Begin,events.heavy_UpKeyPressed)

events:setSubaction(events.subactions.fall)

while true do
events:move()
coroutine.yield(runStatus.Running)
end
end
}),
attack11 = action(
{
id = 10,
method = function()
coroutine.yield()

events:changeAction(events.actions.idle,events.isSubactionNull)
events:setSubaction(events.subactions.attack11)

while true do
coroutine.yield(runStatus.Running)
end
end
}),
attack12 = action(
{
id = 11,
method = function()
coroutine.yield()
events:setSubaction(events.subactions.attack12)

while true do
coroutine.yield(runStatus.Running)
end
end
}),
attack13 = action(
{
id = 12,
method = function()
coroutine.yield()
events:setSubaction(events.subactions.attack13)

while true do
coroutine.yield(runStatus.Running)
end
end
}),
heavyAttack_Idle = action(
{
id = 13,
method = function()
coroutine.yield()
events:setSubaction(events.subactions.heavyAttack_Idle)

while true do
coroutine.yield(runStatus.Running)
end
end
}),
heavyAttack_Up_Begin = action(
{
id = 14,
method = function()
coroutine.yield()

events:setSubaction(events.subactions.heavyAttack_Up_Begin)
events:changeAction(events.actions.heavyAttack_Up_Loop,events.isSubactionNull)

while true do
coroutine.yield(runStatus.Running)
end
end
}),
heavyAttack_Up_Loop = action(
{
id = 15,
method = function()
coroutine.yield()

 events:setSubaction(events.subactions.heavyAttack_Up_Loop)
 events:changeAction(events.actions.heavyAttack_Up_End,events.upKeyPressed,true)

while true do
events:moveRelative()

coroutine.yield(runStatus.Running)
end
end
}),
heavyAttack_Up_End = action(
{
id = 16,
method = function()
coroutine.yield()

events:setSubaction(events.subactions.heavyAttack_Up_End)
events:changeAction(events.actions.idle,events.isSubactionNull)


while true do
events:moveRelative()
coroutine.yield(runStatus.Running)
end
end
}),
heavyAttack_AirN = action(
{
id = 20,
method = function()
coroutine.yield()
events:setSubaction(events.subactions.heavyAttack_AirN)

while true do
coroutine.yield(runStatus.Running)
end
end
}),
airN = action(
{
id = 21,
method = function()
coroutine.yield()

events:changeAction(events.actions.airNFall,events.isSubactionNull)

events:setSubaction(events.subactions.airN)

while true do
coroutine.yield(runStatus.Running)
end
end
}),
airNFall = action(
{
id = 22,
method = function()
coroutine.yield()

events:changeAction(events.actions.idle,events.onGround)
events:addRequirement(events.shouldBeOnGround)

events:changeAction(events.actions.rise,events.isRising)
events:addRequirement(events.inAir)

events:changeAction(events.actions.wallSlide,events.isFalling)
events:addRequirement(events.isTouchingWall)
events:addRequirement(events.keyPressedTowardsWall)

events:changeAction(events.actions.airN,events.lightPunchKeyPress)
events:addRequirement(events.horizontalKeysPressed,true)
events:addRequirement(events.inAir)
events:addRequirement(events.shouldBeInAir)

events:changeAction(events.actions.airF,events.lightPunchKeyPress)
events:addRequirement(events.isKeyPressed_Forward)
events:addRequirement(events.inAir)
events:addRequirement(events.shouldBeInAir)

events:setSubaction(events.subactions.airNFall)

while true do
events:move()
coroutine.yield(runStatus.Running)
end
end
}),
airF = action(
{
id = 23,
method = function()
coroutine.yield()
events:changeAction(events.actions.fall,events.isSubactionNull)
events:setSubaction(events.subactions.airF)

while true do
coroutine.yield(runStatus.Running)
end
end
}),
wallSlide = action(
{
id = 30,
method = function()
coroutine.yield()

events:changeAction(events.actions.idle,events.onGround)
events:addRequirement(events.shouldBeOnGround)

events:changeAction(events.actions.fall,events.isFalling)
events:addRequirement(events.inAir)
events:addRequirement(events.shouldBeInAir)
events:addRequirement(events.keyPressedTowardsWall,true)

events:changeAction(events.actions.wallJump,events.jumpKeyPressed)

events:setSubaction(events.subactions.wallSlide)

while true do
events:setVelocity(vector2(0,15))
coroutine.yield(runStatus.Running)
end
end
}),
wallJump = action(
{
id = 31,
method = function()
coroutine.yield()

events:setSubaction(events.subactions.wallJump)

coroutine.yield(runStatus.Running)

events:changeAction(events.actions.fall,events.isFalling)
events:addRequirement(events.inAir)
events:addRequirement(events.shouldBeInAir)

while true do
--events:move()

--try to rise
--if(events:isRiseTimeLessThanAllowed() and
-- events:isKeyPressed(events.jumpKeys)) then
-- events:setVelocityY(-150)
--end

coroutine.yield(runStatus.Running)
end
end
}),
}

end

mitActions(...)

Subactions
Code:
local create =  function(_events)
local events = _events

--to prevent creating strings everytime used
local bones =
{
HandL = 'HandL',
HandR = 'HandR',
FootL = 'FootL',
FootR = 'FootR',
Hammer = 'Hammer'
}
events.subactions =
{
idle = subaction(
{
id = 0,
animationID = 0,
looped = true,
functions =
{
main = function()
-- first yield gets consumed by coroutine start
coroutine.yield()
end
}
}),
walk = subaction(
{
id = 1,
animationID = 1,
looped = true,
functions =
{
main = function()
coroutine.yield()

events:allowInterrupt()

events:playSound(0,0.1)
events:synchronous(12)
events:playSound(0,0.1)
events:synchronous(11)
end
}
}),
jumpBegin = subaction(
{
id = 5,
animationID = 2,
looped = false,
functions =
{
main = function()
coroutine.yield()

events:addParticleRelative(particle(13,1,color.White,vector2(0,10),vector2(-20,0),false,true))
events:addParticleRelative(particle(13,1,color.White,vector2(0,10),vector2(20,0),false, true))
    
events:allowInterrupt()
end
}
}),
jumpLoop = subaction(
{
id = 6,
animationID = 2,
looped = true,
functions =
{
main = function()
coroutine.yield()
events:allowInterrupt()
end
}
}),
fall = subaction(
{
id = 7,
animationID = 3,
looped = true,
functions =
{
main = function()
coroutine.yield()
events:allowInterrupt()
end
}
}),
attack11 =subaction(
{
id = 10,
animationID = 9,
looped = false,
functions =
{
main = function()
coroutine.yield()

events:synchronous(4)
events:playSound(5,1)

events:offensiveCollision(0, true, bones.HandL, 1, 2, 180,0, 3, 4, vector2(-1, 0), 3, 1,0,5)
events:offensiveCollision(1, true, bones.HandL, 1, 2, 135,0, 4, 4, vector2(-1, 0), 8, .2,0,5)
events:offensiveCollision(2, true, bones.HandL, 1, 2, 0,0, 1, 1, vector2(-1, 0), 10, 0,0,5)

events:asynchronous(5)

for i=0,10 do
events:synchronous(1)
if(events:isKeyPress(events.punchKeys)) then
events:terminateAllCollisions()
events:setSubaction(events.subactions.attack12)
end
end

events:asynchronous(16)
events:terminateAllCollisions()
end
}
}),
attack12 =subaction(
{
id = 11,
animationID = 10,
looped = false,
functions =
{
main = function()

coroutine.yield()

events:asynchronous(4)
   events:playSound(6,1)
  
events:synchronous(1)
events:offensiveCollision( 0, true, bones.HandR, 1, 2, 270,0, 5, 5,vector2(-1, 0), 10, 1)
    
for i = 0,10 do
events:synchronous(1)
if(events:isKeyPress(events.punchKeys)) then
events:terminateAllCollisions()
events:setSubaction(events.subactions.attack13)
return coroutine.yield(runStatus.Success)
end
end

events:asynchronous(16)
events:terminateAllCollisions()
end
}
}),
attack13 =subaction(
{
id = 12,
animationID = 11,
looped = false,
functions =
{
main =function()

coroutine.yield()

events:asynchronous(4)
   events:playSound(7)
events:offensiveCollision(0, true, bones.FootR, 1, 2, 45,0, 4, 10,vector2(-1, 0), 10, 2)
    
events:asynchronous(16)
events:terminateAllCollisions()                
end
}
}),
heavyAttack_Idle =subaction(
{
id = 13,
animationID = 4,
looped = false,
functions =
{
main = function()
coroutine.yield()
events:playSound(3,1)
end
}
}),
heavyAttack_Up_Begin =subaction(
{
id = 14,
animationID = 13,
looped = false,
functions =
{
main = function()

coroutine.yield()

events:playSound(28,.1)
events:asynchronous(15)


if(events:inAir()) then
events:playSound(15,.2)
events:setVelocityY(-200)
end
end,
gfx = function()
coroutine.yield()

--BIFF
local _particle =particle(32,.5,color.White)
_particle:SetInitialMatrix(-15,-25,0,.5,.5,0,0)
_particle:SetPosition(0,10,0,-100)
_particle:SetRotation(3.14/-2,3.14)
_particle:SetScale(1.5,1,0,0)
_particle.FadeOut=true

events:addParticleRelative(_particle)
events:asynchronous(15)

--MARTY
_particle.AnimationIndex = 34
_particle:SetInitialMatrix(15,-25,0,.5,.5,0,0)
_particle:SetRotation(3.14 / 2,-3.14)

events:addParticleRelative(_particle)


if(events:inAir()) then

--smoke puff
_particle.AnimationIndex = 11
_particle:SetInitialMatrix(0,5,0,.5,.5,0,0)
_particle:SetPosition(0,20,0,-60)
_particle:SetRotation(0,0)
_particle:SetScale(3,3,-10,-10)

events:addParticleRelative(_particle);
_particle.LifeTime = 1

--leaves
for i=1,4 do
_particle.AnimationIndex = i
_particle:SetInitialMatrix(0,5,0,1,1,0,0)
_particle:SetPosition(random.NextDouble(-30,30),random.NextDouble(-10,30),0,50)
_particle:SetRotation(6.14,-6.14)
_particle:SetScale(0,0,0,0)

events:addParticleRelative(_particle)
end
end
end
}
}),
heavyAttack_Up_Loop =subaction(
{
id = 15,
animationID = 14,
looped = true,
functions =
{
main = function()

coroutine.yield()

local offset = vector2(0,-1)

events:offensiveCollision(0, true, bones.Hammer, 0, 0, 135,0, 0, 10, offset, 9, 1)
events:offensiveCollision(1, true, nil, 0, 0, 135,0, 0, 10,vector2.Zero,10,1)-- vector2(0,-5), 6, 1)
events:synchronous(15)
events:terminateAllCollisions()
end,
gfx = function()

coroutine.yield()

local _particle = particle(0,.5,color.White)
_particle.LifeTime = .5
for i=0,2 do
if(events:onGround()) then
--smoke trail
_particle.AnimationIndex = 12
_particle:SetInitialMatrix(0,5,0,.5,.5,0,0)
_particle:SetScale(-.5,-.5,0,0)

events:addParticleRelative(_particle)

--V particles
_particle.AnimationIndex = 4
_particle:SetInitialMatrix(0,10,0,.5,.5,0,0)
_particle:SetPosition(-60,-60,0,0)
_particle:SetScale(5,5,0,0)

events:addParticleRelative(_particle)

_particle:SetPosition(60,-60,0,0)

events:addParticleRelative(_particle)
end
events:synchronous(5)
end
end
,sfx = function()

coroutine.yield()

events:playSound(27,.1)

if(events:onGround()) then
events:playSound(20,.01)
end
end
}
}),
heavyAttack_Up_End = subaction(
{
id = 16,
animationID = 15,
looped = false,
functions =
{
main = function()

coroutine.yield()

end
}
}),
heavyAttack_AirN =  subaction(
{
id = 20,
animationID = 22,
looped = false,
functions =
{
main = function()
coroutine.yield()

events:playSound(10,1)
for i = 0,18 do
if(events:shouldBeOnGround()) then
events:setSubactionPassTime(events.subactions.heavyAttack_Idle,events:getCurrentAnimationFrameTime())
return coroutine.yield(runStatus.Success)
end
events:synchronous(1)
end
end
}
}),
airN = subaction(
{
id = 21,
animationID = 18,
looped = false,
functions =
{
main = function()

coroutine.yield()

local offset = vector2(0,0)

events:synchronous(4)
--events:playSound(4,1)
events:enableConstantMomentum()
events:setConstantMomentum(vector2.Zero)
  
events:asynchronous(9)
events:offensiveCollision(0, true, bones.HandL, 0, 0, 135,0, 0, 10, offset, 10, 1)
events:offensiveCollision(1, true, bones.HandR, 0, 0, 45,0, 0, 10, offset, 10, 1)
events:offensiveCollision(2, true, bones.FootL, 0, 0, 225,0, 0, 10, offset, 10, 1)
events:offensiveCollision(3, true, bones.FootR, 0, 0, 315,0, 0, 10, offset, 10, 1)
events:synchronous(3)
events:terminateAllCollisions()
  
events:offensiveCollision(0, true, bones.HandL, 0, 0, 135,0, 0, 8, offset, 8, 1)
events:offensiveCollision(1, true, bones.HandR, 0, 0, 45 ,0, 0, 8, offset, 8, 1)
events:offensiveCollision(2, true, bones.FootL, 0, 0, 225,0, 0, 8, offset, 8, 1)
events:offensiveCollision(3, true, bones.FootR, 0, 0, 315,0, 0, 8, offset, 8, 1)
events:synchronous(15)
events:terminateAllCollisions()
  
events:synchronous(5)
events:disableConstantMomentum()
events:allowInterrupt()
end
}
}),
airNFall = subaction(
{
id = 22,
animationID = 19,
looped = false,
functions =
{
main = function()
coroutine.yield()
end
}
}),
airF =subaction(
{
id = 23,
animationID = 17,
looped = false,
functions =
{
main = function()

coroutine.yield()

events:asynchronous(4)
events:applyImpulse(vector2(0,-50))
events:offensiveCollision( 0,true, bones.HandL, 1, 1, 0,0, 50, 8,vector2(0, -4), 10, 3)
--events:playSound(5)
events:asynchronous(13)
events:terminateAllCollisions()
events:allowInterrupt()
end
}
}),
wallSlide =subaction(
{
id = 30,
animationID = 16,
looped = true,
functions =
{
main = function()
coroutine.yield()

  
--I don't want this subaction being called every frame because it plays sound
local rnd = random.NextDouble(0,10)

local _particle = nil
if(rnd >= 5) then
local life = random.NextDouble(.3,2)
   _particle = particle(11,life,color.White)
_particle:SetInitialMatrix(10,0,0,.7,.7,0,0)
_particle:SetPosition(0,-5,0,0)
_particle:SetRotation(random.NextDouble(0,6),0)
_particle:SetScale(-1/life,-1/life,0,0)
_particle.DeathOnAnimationEnd = true
_particle.FadeOut = true
events:addParticleRelative(_particle)
end

rnd = random.NextDouble(0,10)
if(rnd >= 8) then
local life = random.NextDouble(.3,2)
   _particle = particle(11,life,color.White)
_particle:SetInitialMatrix(10,10,0,.7,.7,0,0)
_particle:SetPosition(0,-10,0,0)
_particle:SetRotation(random.NextDouble(0,6),0)
_particle:SetScale(-1/life,-1/life,0,0)
_particle.DeathOnAnimationEnd = true
_particle.FadeOut = true

events:addParticleRelative(_particle)
end

events:allowInterrupt()
                            
end
}
}),
wallJump =subaction(
{
id = 31,
animationID = 2,
looped = false,
functions =
{
main = function()
coroutine.yield()

--events:playSound(13,1)
events:addParticleRelative(particle(11,1,color.White,vector2(10, 0),vector2(0,-20),true, true))
events:addParticleRelative(particle(11,1,color.White,vector2(10, 0),vector2(0, 20),true, true))

local wallNormal = events.context.PlacementData.BodySensorNormalCollection.AverageNormal
local jumpDirection = vector2.Transform(wallNormal,matrix.CreateRotationZ(-mathHelper.PiOver4))

jumpDirection.X = jumpDirection.X * 300
jumpDirection.Y = jumpDirection.Y * 300

if(jumpDirection.Y > 0) then
jumpDirection.Y = jumpDirection.Y * -1.0
end

local levelMask = events.context.BasicPhysicsData.LevelCollisionMask

if(events:waitForPermission()) then
events:offsetRelative( wallNormal)
levelMask:ApplyLinearImpulse(jumpDirection)
end

events:setFacingDirection(events:getWallSide() * -1)
end
}
}),
}
end

return create(...)

You can check my dead devlog for gifs what this code actually does .  If this is against the rules, I have no problem if this post is deleted or editted.

___

Oh yea, I never got to fully implementing articles.  The way I would've done articles was to have articles also have it's own "Moveset" data (actions/subactions).  Then the owner (Mario->fireball) controls the visibility/active/enabled of an article as well as set Actions directly.  To me (who hasn't PSA-ed in years), it sounds like how brawl might also do it.
82  Super Smash Bros. Brawl Hacking / Attacks and Animations / Re: Tidus' Stadium: Tidus animation progress! Custom Rig Success! PSAing a few moves on: May 20, 2014, 11:07:49 PM
They need startups. They move too fast to the ground pose.  The second one is nicer, but his sword is in the way of his face.  

Here's a reference in case you need one. Go to 2:10

www.youtube.com/watch?v=EMnUR-z84tU


A few key differences are the start up and the end key frame.  Link's body is actually more on his right side.  His right elbow is more back and up too.  His head also down to the right instead of left and hitting his sword.  Although it's hard to tell + I never played the game, but I'd say his left arm should be more straight then bent.
83  Super Smash Bros. Brawl Hacking / Attacks and Animations / Re: KJP's Throne Room. Accepting Testers for Solo Charizard. on: May 18, 2014, 05:52:08 PM
mhm I think it looks a whole lot better now. The only thing that catches my eye is that the front foot should ease back into idle instead of abruptly moving and stopping.  But that's such a small detail that I wouldn't really worry about it too much.  I doubt anyone would even notice in game.  By this point, I think it looks pretty solid.  I don't got much else to say.
84  Super Smash Bros. Brawl Hacking / Attacks and Animations / Re: KJP's Throne Room. Accepting Testers for Solo Charizard. on: May 18, 2014, 05:18:28 PM
Yeahp, buut how about having the front foot slide a bit (instead of a complete halt)  after the lunge and drag on the ground back to idle instead of picking it up all the way (or a mix of this).  His front knee sorta extends too far and looks off. 

Everything else looks better now.  Hand motions are looking good too.

....nope nope...Maybe have the jaw close at the same moment or a moment after he lunges completely.  With a lunge like that, you kinda expect his jaw to snap close ykno?
85  Super Smash Bros. Brawl Hacking / Attacks and Animations / Re: KJP's Throne Room. Accepting Testers for Solo Charizard. on: May 18, 2014, 04:25:08 PM
ehh actually you took a wrong step back.  Along with what Gravity said, the head arc is broken now (the old one was better).  Also don't forget about letting the hands continue to follow through with it's rotation. 

I dunno about this one, but maybe have the a tail whip faster, more in sync at the beginning with the lunge? -with follow through ofc.
86  Super Smash Bros. Brawl Hacking / Attacks and Animations / Re: KJP's Throne Room. Accepting Testers for Solo Charizard. on: May 18, 2014, 03:49:28 PM
Lookin good on the animations.

For the raptor,

My only nitpicks are that everything moves back to idle at the same time (foot lifts up, hands start counter rotating, head comes back all at the same time). It's fine when it's a wip, but for polish, it'd help with flow for things to overlap and follow through instead of everything moving from A to B at the same rate/time throughout.

Also at the start of the lunge, I feel like his right leg should come up a bit, body lean back a little more, then push off with the grounded leg.  When he comes back, his body/head should come back first, then the foot shoot be be delayed and pulled back at some point.  

An even smaller nitpick would be that the hands seem to start rotating back when he comes back.  Instead, it should follow through with it's initial rotation and be dragged back like a rope/cloth/(w/e works for your imagination) object being pulled.


Again, it looks pretty good.
87  Super Smash Bros. Brawl Hacking / Attacks and Animations / Re: WIP PSA Workshop on: May 18, 2014, 12:08:00 PM
It looks pretty nice.  But the hair should relatively counter rotate in the opposite direction of the head at the beginning-so it gives the pulled look.  You did a good job of it towards the end.  It's rotation dies out too quickly though.  The dress should also act similarly.  The rotation of it should sorta lag or drag behind and shouldn't come up so quickly until peach stops rotating.  Then it should unwrap, come up then come back down slowly -after peach has pretty much stopped-not at the same moment.

Besides those,  she seems a bit stiff.  For example, the neck/head area doesn't move much.  At the end, the wave pose is transitioned to in a robotic way.  She stops her twirl, hands stop to the side, her hair even comes to a complete stop- then she raises the right arm and counter rotates.  Maybe remove that stop pose and go straight to the wave.
88  Super Smash Bros. Brawl Hacking / Programming / Re: BrawlBox, To Maya, and BACK! on: May 17, 2014, 12:50:51 AM
I think certain animations are applied differently than others. There are animations that are actually poses, and animations that aren't nessearily PLAYED, like the ones for aiming items. (The upperbody and lowerbody animations are seperate)
that might be the case, those special animations thats are poses and often "merged" with other animations ingame.

can it be possible flags that does it? CHR0 appears have some kind of flags

These sound like they're used along side animation blend trees to me.

And nice lookout for those who use FBX files. It'd be nice to mess around with brawl stuff in Unity. 
89  Super Smash Bros. Brawl Hacking / Attacks and Animations / Re: ShyGuy's Animation ToyBox - Need an animation? on: May 15, 2014, 06:18:41 PM
Okay, i'll give it a shot.  Send em over

Edit:

Would it be cool with you if I base the seismic toss off of this reference? (go to 4:20)

<a href="http://www.youtube.com/watch?v=TQ0A-70yUOg" target="_blank" class="aeva_link bbc_link new_win">http://www.youtube.com/watch?v=TQ0A-70yUOg</a>


Edit2:

Oh the ref gif and the vid are of the same thing haa =p.

Btw, I noticed a few things with your seismic toss animation that was a bit weird.  

1) You have charizard's stomache facing inwards towards the center instead of out -like the reference.

2) The way you made him rotate around a circle is..."ew" hehe.  You could've just placed a center pivot bone to rotate around and used another for the offset/radius.  It becomes alot more simple than whatever you were doing lol.  That's how I'm doing it right now plus I can offset the Y rotation of the pivot bone so that you can easily change how much rotation towards the view the first part of the animation is.  I don't think this should be an issue (teleporting when hit?) since...he shouldn't be able to get hit while doing a final smash.

Edit 3:

Does setting BB to view animations as Linear actually make the animation run linearly in game?  (I can't test as I don't have anything setup nor do I have whats needed to be able to).


Post Merge: May 16, 2014, 03:25:34 PM
Here's progress on the seismic toss.  These are basically just keyframes without any polish (I recreated all the keyframes except the first one heh).  There are extra frames just to see the motion.  The transition from the rotation to throw is just temp, I did it just to show them both together.



I'm still not happy with the throw key frames.  Specifically when Charizard's head points up a lot.  It doesn't give off that heavy pulling feeling from the keyframes only.

Anyone have any crits on this so far?  Does the animation read well at all?

Edit 4:

Sigh... It looks like I was right.  I don't think  I can use BrawlBox/FK to make an animation.  It's just too hard for me to make things look smooth.  Sorry KingOfChaos.  I'd appreciate it if someone locks this.
90  Super Smash Bros. Brawl Hacking / Attacks and Animations / Re: ShyGuy's Animation ToyBox - Need an animation? on: May 15, 2014, 05:50:36 PM
As for Maya, you can get the Student version for free from Autodesk's website.

Except I don't go to any college at the moment =/.  I will start going for the fall though.

I don't watch anime hehe so I'm a bit clueless as to what you're really saying. However, since you have the animation mostly done and it just need polishing, I shouldn't need any references.  Can I see what you have so far before I accept? 
Pages:  1 ... 3 4 5 [6] 7 8 9 ... 42