mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-09-16 11:06:06 -04:00
Add basic for old classic arms animation.
This commit is contained in:
parent
8a934df673
commit
b56edd2dad
@ -14,7 +14,10 @@ namespace ClassicalSharp {
|
|||||||
INetworkProcessor network = game.Network;
|
INetworkProcessor network = game.Network;
|
||||||
|
|
||||||
buttons = new ButtonWidget[] {
|
buttons = new ButtonWidget[] {
|
||||||
// Column 1
|
// Column 1
|
||||||
|
Make( -140, -150, "Use simple arms", OnWidgetClick,
|
||||||
|
g => g.SimpleArmsAnim ? "yes" : "no",
|
||||||
|
(g, v) => g.SimpleArmsAnim = v == "yes"),
|
||||||
|
|
||||||
Make( -140, -100, "Use sound", OnWidgetClick,
|
Make( -140, -100, "Use sound", OnWidgetClick,
|
||||||
g => g.UseSound ? "yes" : "no",
|
g => g.UseSound ? "yes" : "no",
|
||||||
@ -71,10 +74,11 @@ namespace ClassicalSharp {
|
|||||||
(g, w) => g.SetNewScreen( new PauseScreen( g ) ) ),
|
(g, w) => g.SetNewScreen( new PauseScreen( g ) ) ),
|
||||||
null,
|
null,
|
||||||
};
|
};
|
||||||
buttons[1].Metadata = typeof(NameMode);
|
buttons[2].Metadata = typeof(NameMode);
|
||||||
buttons[2].Metadata = typeof(FpsLimitMethod);
|
buttons[3].Metadata = typeof(FpsLimitMethod);
|
||||||
|
|
||||||
validators = new MenuInputValidator[] {
|
validators = new MenuInputValidator[] {
|
||||||
|
new BooleanValidator(),
|
||||||
new BooleanValidator(),
|
new BooleanValidator(),
|
||||||
new EnumValidator(),
|
new EnumValidator(),
|
||||||
new EnumValidator(),
|
new EnumValidator(),
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using ClassicalSharp.Model;
|
||||||
using OpenTK;
|
using OpenTK;
|
||||||
|
|
||||||
namespace ClassicalSharp {
|
namespace ClassicalSharp {
|
||||||
@ -21,12 +22,14 @@ namespace ClassicalSharp {
|
|||||||
double distance = Math.Sqrt( dx * dx + dz * dz );
|
double distance = Math.Sqrt( dx * dx + dz * dz );
|
||||||
|
|
||||||
if( distance > 0.05 ) {
|
if( distance > 0.05 ) {
|
||||||
walkTimeN += (float)distance * 2 * (float)(20 * delta);
|
float walkDelta = (float)distance * 2 * (float)(20 * delta);
|
||||||
|
walkTimeN += walkDelta;
|
||||||
swingN += (float)delta * 3;
|
swingN += (float)delta * 3;
|
||||||
} else {
|
} else {
|
||||||
swingN -= (float)delta * 3;
|
swingN -= (float)delta * 3;
|
||||||
}
|
}
|
||||||
Utils.Clamp( ref swingN, 0, 1 );
|
Utils.Clamp( ref swingN, 0, 1 );
|
||||||
|
UpdateHumanState();
|
||||||
}
|
}
|
||||||
|
|
||||||
const float armMax = 60 * Utils.Deg2Rad;
|
const float armMax = 60 * Utils.Deg2Rad;
|
||||||
@ -49,6 +52,72 @@ namespace ClassicalSharp {
|
|||||||
|
|
||||||
bobYOffset = (float)(Math.Abs( Math.Cos( walkTime ) ) * swing * (2/16f));
|
bobYOffset = (float)(Math.Abs( Math.Cos( walkTime ) ) * swing * (2/16f));
|
||||||
tilt = (float)Math.Cos( walkTime ) * swing * (0.15f * Utils.Deg2Rad);
|
tilt = (float)Math.Cos( walkTime ) * swing * (0.15f * Utils.Deg2Rad);
|
||||||
|
|
||||||
|
if( Model is PlayerModel )
|
||||||
|
CalcHumanAnim( idleXRot, idleZRot );
|
||||||
|
}
|
||||||
|
|
||||||
|
internal float leftXRot, leftYRot, leftZRot;
|
||||||
|
internal float rightXRot, rightYRot, rightZRot;
|
||||||
|
ArmsAnim animMode = ArmsAnim.NoPerpendicular;
|
||||||
|
int statesDone;
|
||||||
|
static Random rnd = new Random();
|
||||||
|
|
||||||
|
void UpdateHumanState() {
|
||||||
|
if( game.SimpleArmsAnim ) {
|
||||||
|
animMode = ArmsAnim.NoPerpendicular;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// crosses over body, finished an arm swing
|
||||||
|
int oldState = Math.Sign( Math.Cos( walkTimeO ) );
|
||||||
|
int newState = Math.Sign( Math.Cos( walkTimeN ) );
|
||||||
|
if( oldState != newState )
|
||||||
|
statesDone++;
|
||||||
|
|
||||||
|
// should we switch animations?
|
||||||
|
if( statesDone == 5 ) {
|
||||||
|
statesDone = 0;
|
||||||
|
animMode = (ArmsAnim)rnd.Next( 0, 4 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CalcHumanAnim( float idleXRot, float idleZRot ) {
|
||||||
|
switch( animMode ) {
|
||||||
|
case ArmsAnim.NoPerpendicular:
|
||||||
|
leftXRot = armXRot; leftYRot = 0; leftZRot = armZRot;
|
||||||
|
rightXRot = -armXRot; rightYRot = 0; rightZRot = -armZRot;
|
||||||
|
return;
|
||||||
|
case ArmsAnim.LeftPerpendicular:
|
||||||
|
PerpendicularAnim( out leftXRot, out leftYRot, out leftZRot );
|
||||||
|
rightXRot = -armXRot; rightYRot = 0; rightZRot = -armZRot;
|
||||||
|
return;
|
||||||
|
case ArmsAnim.RightPerpendicular:
|
||||||
|
leftXRot = armXRot; leftYRot = 0; leftZRot = armZRot;
|
||||||
|
PerpendicularAnim( out rightXRot, out rightYRot, out rightZRot );
|
||||||
|
rightXRot = -rightXRot; rightZRot = -rightZRot;
|
||||||
|
return;
|
||||||
|
case ArmsAnim.BothPerpendicular:
|
||||||
|
PerpendicularAnim( out leftXRot, out leftYRot, out leftZRot );
|
||||||
|
PerpendicularAnim( out rightXRot, out rightYRot, out rightZRot );
|
||||||
|
rightXRot = -rightXRot; rightZRot = -rightZRot;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const float maxAngle = 90 * Utils.Deg2Rad;
|
||||||
|
void PerpendicularAnim( out float xRot, out float yRot, out float zRot ) {
|
||||||
|
xRot = 0;
|
||||||
|
yRot = 0;
|
||||||
|
yRot = (float)(Math.Cos( walkTime ) * swing * armMax * 1.5f);
|
||||||
|
float angle = (float)(1 + 0.3 * Math.Sin( walkTime ) );
|
||||||
|
zRot = -angle * swing * maxAngle;
|
||||||
|
}
|
||||||
|
|
||||||
|
enum ArmsAnim {
|
||||||
|
NoPerpendicular, // i.e. both parallel
|
||||||
|
LeftPerpendicular,
|
||||||
|
RightPerpendicular,
|
||||||
|
BothPerpendicular,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -103,6 +103,9 @@ namespace ClassicalSharp {
|
|||||||
/// <summary> Whether lines should be rendered for each axis. </summary>
|
/// <summary> Whether lines should be rendered for each axis. </summary>
|
||||||
public bool ShowAxisLines;
|
public bool ShowAxisLines;
|
||||||
|
|
||||||
|
/// <summary> Whether players should animate using simple swinging parallel to their bodies. </summary>
|
||||||
|
public bool SimpleArmsAnim = true;
|
||||||
|
|
||||||
public long Vertices;
|
public long Vertices;
|
||||||
public FrustumCulling Culling;
|
public FrustumCulling Culling;
|
||||||
int width, height;
|
int width, height;
|
||||||
|
@ -73,8 +73,10 @@ namespace ClassicalSharp.Model {
|
|||||||
DrawPart( model.Torso );
|
DrawPart( model.Torso );
|
||||||
DrawRotate( 0, 12/16f, 0, p.legXRot, 0, 0, model.LeftLeg );
|
DrawRotate( 0, 12/16f, 0, p.legXRot, 0, 0, model.LeftLeg );
|
||||||
DrawRotate( 0, 12/16f, 0, -p.legXRot, 0, 0, model.RightLeg );
|
DrawRotate( 0, 12/16f, 0, -p.legXRot, 0, 0, model.RightLeg );
|
||||||
DrawRotate( -6/16f, 22/16f, 0, p.armXRot, 0, p.armZRot, model.LeftArm );
|
Rotate = RotateOrder.XZY;
|
||||||
DrawRotate( 6/16f, 22/16f, 0, -p.armXRot, 0, -p.armZRot, model.RightArm );
|
DrawRotate( -6/16f, 22/16f, 0, p.leftXRot, p.leftYRot, p.leftZRot, model.LeftArm );
|
||||||
|
DrawRotate( 6/16f, 22/16f, 0, p.rightXRot, p.rightYRot, p.rightZRot, model.RightArm );
|
||||||
|
Rotate = RotateOrder.ZYX;
|
||||||
graphics.UpdateDynamicIndexedVb( DrawMode.Triangles, cache.vb, cache.vertices, index, index * 6 / 4 );
|
graphics.UpdateDynamicIndexedVb( DrawMode.Triangles, cache.vb, cache.vertices, index, index * 6 / 4 );
|
||||||
|
|
||||||
graphics.AlphaTest = true;
|
graphics.AlphaTest = true;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user