📄 simulator.java
字号:
private static final int STRING_NATION8 = 95;
private static final int STRING_NATION9 = 96;
private static final int STRING_NATION10 = 97;
private static final int STRING_ATHLETE0 = 98;
private static final int STRING_ATHLETE1 = 99;
private static final int STRING_ATHLETE2 = 100;
private static final int STRING_ATHLETE3 = 101;
private static final int STRING_ATHLETE4 = 102;
private static final int STRING_ATHLETE5 = 103;
private static final int STRING_ATHLETE6 = 104;
private static final int STRING_ATHLETE7 = 105;
private static final int STRING_ATHLETE8 = 106;
private static final int STRING_ATHLETE9 = 107;
private static final int STRING_ATHLETE10 = 108;
private static final int STRING_GAME_TITLE = 109;
private static final int STRING_VERSION = 110;
private static final int STRING_COPYRIGHT_TEXT = 111;
private static final int STRING_CREDITS = 112;
private static final int STRING_SELECT_LANGUAGE = 113;
private static final int STRING_LANG0 = 114;
private static final int STRING_LANG1 = 115;
private static final int STRING_LANG2 = 116;
private static final int STRING_LANG3 = 117;
private static final int STRING_LANG4 = 118;
private static final int STRING_GAME_IN_PROGRESS = 119;
private static final int STRING_RESUME_GAME = 120;
private static final int STRING_ABORT_GAME = 121;
private static final int STRING_BACK = 122;
private static final int STRING_OK = 123;
private static final int STRING_CANCEL = 124;
private static final int STRING_MENU = 125;
private static final int STRING_LOADING = 126;
private static final int STRING_GUEST = 127;
private static final int STRING_LOGGING_IN = 128;
private static final int STRING_GAME_LOBBY = 129;
private static final int STRING_RATE_GAME = 130;
private static final int STRING_LEADERBOARD = 131;
private static final int STRING_REGISTER_ON = 132;
private static final int STRING_GAME_LOBBY_Q = 133;
private static final int STRING_TO_GAME_LOBBY = 134;
private static final int STRING_WELCOME = 135;
private static final int RESFILE_COMMON = 136;
private static final int RESFILE_COUNTRY = 137;
private static final int RESFILE_GFX = 138;
private static final int RESFILE_AUDIO = 139;
// defines from GameData
// we never have more than a few gates on the screen at once
// we're only going to store animation data for a few gates
// we'll pad it a bit to take into account the fact that the
// skier still moves while the gates animate.
//#ifdef _HIRES_GRAPHICS
////#define HURDLE_XOFF 12
////#define HURDLE_HEIGHT 31 // in pixels
////#define SHOOTINGREF_HEIGHT 54
////#define PIXEL_PER_M 24
////#define M_PER_PIXEL 2731
//#else
//#endif
//#define MAX_PLAYERS 4
//#ifndef _MAX_HUMAN_PLAYERS
//#endif
// Virtual key codes
// COLORS (RGB)
//#ifdef _LOW_DETAIL
//#else
////#define COLOR_SKY 0xc1ccf5
//#endif
//#ifdef _MULTI_LANG
////#define LANG_COUNT 5
//#else
//#endif
//#ifndef _LIMITED_EVENTS
//
////#define EVENT_SKI_JUMP 1
////#define EVENT_BIATHLON 2
////#define EVENT_SKIING 3
////#define EVENT_COUNT 4
////#define EVENT_COMPETITION 4
//
//#else
//#endif
//#ifdef _IS_NokiaS40
//// #define SOUND_COUNT 5
//#elif defined(_IS_NokiaS60) && !defined(_MMAPI)
//// #define SOUND_CROWD 5
//// #define SOUND_CRASH 6
//// #define SOUND_COUNT 7
//#elif defined(_LIMITED_SOUNDS)
//// #define SOUND_CRASH 5
//// #define SOUND_COUNT 6
//#else
//#endif
//#endif
//#ifdef _DEBUG
////#define DUMP_EXCEPTION(e) { //System.out.println( e.getMessage()); e.printStackTrace(); }
////#define DUMP_EXCEPTION_MSG(e,msg) { //System.out.println( msg + "\n" + e.getMessage()); e.printStackTrace(); }
////#define DEBUG_MSG(msg) //System.out.println(msg)
//#else
//#endif
//#ifdef _PROFILE
////#define START_TIMER(a) a = System.currentTimeMillis();
////#define STOP_TIMER(a) a = System.currentTimeMillis() - a;
//#else
//#endif
private final static int SIMULATOR_STEP = 50;
public final static int CONSTRAINT_NONE = 0;
public final static int CONSTRAINT_BELOW = 1;
public final static int CONSTRAINT_ABOVE = 2;
// this data should be saved
private SimData m_data;
// end saved data
public Simulator( SimData data )
{
if (data == null)
m_data = new SimData();
else
m_data = data;
if (!m_data.bInitialized)
{
m_data.iTime = 0;
for (int i=0; i<2/*@AXIS_COUNT*/; i++)
{
m_data.fpLastPos[i] = 0;
m_data.fpPos[i] = 0;
m_data.fpVel[i] = 0;
m_data.fpAccel[i] = 0;
m_data.fpCrossing[i] = 0;
m_data.iConstraint[i] = CONSTRAINT_NONE;
m_data.fpVelMin[i] = 0;
m_data.fpVelMax[i] = 0;
m_data.iCrossTime[i] = 0;
for (int j=0; j<2/*@AXIS_COUNT*/; j++)
{
m_data.fpCrossPos[i][j] = 0;
m_data.fpCrossVel[i][j] = 0;
}
}
m_data.bInitialized = true;
}
}
private int m_fpNewPos[] = new int[2/*@AXIS_COUNT*/];
private int m_fpNewCollisionPt[] = new int[2/*@AXIS_COUNT*/];
public void update( int iDeltaTime )
{
while (iDeltaTime > 0)
{
int iDt = ((iDeltaTime) < (SIMULATOR_STEP) ? (iDeltaTime) : (SIMULATOR_STEP)) ;
int fpDt = iDt*FP.MILLI;
// for each axis, do updates
for (int i=0; i<2/*@AXIS_COUNT*/; i++)
{
// apply acceleration
m_data.fpVel[i] += FP.mul(m_data.fpAccel[i], fpDt);
// clamp velocity to range
m_data.fpVel[i] = ( ( (m_data.fpVel[i]) <= (m_data.fpVelMin[i]) ) ? (m_data.fpVelMin[i]) : ( ( (m_data.fpVel[i]) >= (m_data.fpVelMax[i]) ) ? (m_data.fpVelMax[i]) : (m_data.fpVel[i]) ) ) ;
// determine new position
m_fpNewPos[i] = m_data.fpPos[i] + FP.mul(m_data.fpVel[i], fpDt);
}
// test crossings
for (int i=0; i<2/*@AXIS_COUNT*/; i++)
{
if (m_fpNewPos[i] != m_data.fpPos[i])
{
// test crossing
int iDelta1 = m_data.fpCrossing[i]-m_fpNewPos[i];
int iDelta2 = m_data.fpCrossing[i]-m_data.fpPos[i];
if ((iDelta2!=0) && (iDelta1==0 || ((iDelta1 ^ iDelta2) & 0x80000000)!=0 ))
{
// crossed line
int iCrossDt = ((m_data.fpCrossing[i] - m_data.fpPos[i])*iDt)/
(m_fpNewPos[i] - m_data.fpPos[i]);
int fpCrossDt = iCrossDt*FP.MILLI;
m_data.iCrossTime[i] = m_data.iTime + iCrossDt;
m_data.fpCrossVel[i][0] = m_data.fpVel[0]; // estimate - actually velocity at iDt
m_data.fpCrossVel[i][1] = m_data.fpVel[1];
m_data.fpCrossPos[i][i] = m_data.fpCrossing[i];
for (int j=0; j<2/*@AXIS_COUNT*/; j++)
{
if (i!=j)
{
m_data.fpCrossPos[i][j] = m_data.fpPos[j] +
(FP.mul(m_data.fpVel[j],fpCrossDt)/1000);
}
}
}
if (m_fpNewPos[i] > m_data.fpCrossing[i] && m_data.iConstraint[i] == CONSTRAINT_BELOW)
{
m_fpNewPos[i] = m_data.fpCrossing[i];
if (m_data.fpVel[i] > 0)
m_data.fpVel[i] = 0;
}
else if (m_fpNewPos[i] < m_data.fpCrossing[i] && m_data.iConstraint[i] == CONSTRAINT_ABOVE)
{
m_fpNewPos[i] = m_data.fpCrossing[i];
if (m_data.fpVel[i] < 0)
m_data.fpVel[i] = 0;
}
}
}
for (int i=0; i<2/*@AXIS_COUNT*/; i++)
{
m_data.fpLastPos[i] = m_data.fpPos[i];
m_data.fpPos[i] = m_fpNewPos[i];
}
m_data.iTime += iDt;
iDeltaTime -= iDt;
}
}
public void applyImpulse( int iAxis, int fpImp )
{
m_data.fpVel[iAxis] += fpImp;
// clamp velocity to range
m_data.fpVel[iAxis] = ( ( (m_data.fpVel[iAxis]) <= (m_data.fpVelMin[iAxis]) ) ? (m_data.fpVelMin[iAxis]) : ( ( (m_data.fpVel[iAxis]) >= (m_data.fpVelMax[iAxis]) ) ? (m_data.fpVelMax[iAxis]) : (m_data.fpVel[iAxis]) ) ) ;
}
public final int getTime()
{
return m_data.iTime;
}
public final int getPos( int iAxis )
{
return m_data.fpPos[iAxis];
}
public final int getPosConstraint( int iAxis )
{
return m_data.fpCrossing[iAxis];
}
public final int getVel( int iAxis )
{
return m_data.fpVel[iAxis];
}
public final int getVelMin( int iAxis )
{
return m_data.fpVelMin[iAxis];
}
public final int getVelMax( int iAxis )
{
return m_data.fpVelMax[iAxis];
}
public final int getAccel( int iAxis )
{
return m_data.fpAccel[iAxis];
}
public final int getCrossingTime( int iAxis )
{
return m_data.iCrossTime[iAxis];
}
public final int[] getCrossingPos( int iAxis )
{
int fpPos[] = new int[2/*@AXIS_COUNT*/];
for (int i=0; i<2/*@AXIS_COUNT*/; i++)
{
fpPos[i] = m_data.fpCrossPos[iAxis][i];
}
return fpPos;
}
public final int[] getCrossingVel( int iAxis )
{
int fpVel[] = new int[2/*@AXIS_COUNT*/];
for (int i=0; i<2/*@AXIS_COUNT*/; i++)
{
fpVel[i] = m_data.fpCrossVel[iAxis][i];
}
return fpVel;
}
void setPosConstraint( int iAxis, int fpX, int iConstraint )
{
m_data.fpCrossing[iAxis] = fpX;
m_data.iConstraint[iAxis] = iConstraint;
}
void setVelConstraint( int iAxis, int fpMin, int fpMax )
{
m_data.fpVelMin[iAxis] = fpMin;
m_data.fpVelMax[iAxis] = fpMax;
}
void setPosition( int fpX, int fpY )
{
m_data.fpPos[0/*@AXIS_X*/] = fpX;
m_data.fpPos[1/*@AXIS_Y*/] = fpY;
m_data.fpLastPos[0/*@AXIS_X*/] = fpX;
m_data.fpLastPos[1/*@AXIS_Y*/] = fpY;
}
void setVelocity( int fpX, int fpY )
{
m_data.fpVel[0/*@AXIS_X*/] = fpX;
m_data.fpVel[1/*@AXIS_Y*/] = fpY;
}
void setAcceleration( int fpX, int fpY )
{
m_data.fpAccel[0/*@AXIS_X*/] = fpX;
m_data.fpAccel[1/*@AXIS_Y*/] = fpY;
}
void setTime( int iTime )
{
m_data.iTime = iTime;
}
void resetCrossings()
{
m_data.iCrossTime[0/*@AXIS_X*/] = (-1)/*@TIME_INVALID*/;
m_data.iCrossTime[1/*@AXIS_Y*/] = (-1)/*@TIME_INVALID*/;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -