⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 simulator.java

📁 国外人写的操作感挺好的一款滑雪游戏.结构也比较清楚
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
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 + -