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

📄 nfs.c

📁 一个用纯c写的模拟3d程序,利用了些扩大缩小来模拟浮点数
💻 C
📖 第 1 页 / 共 2 页
字号:
             
//******************************************************
//*Copyright(C)2004-8,NOTHEOREM(R).All rights reserved.*
//******************************************************

//NT3D v1.2

#include "AEEModGen.h"
#include "AEEAppGen.h"
#include "AEEShell.h"
#include "AEESprite.h"
#include "AEEStdLib.h"

#include "NFS.bid"
#define USE_TRANSFORMS

#define UNITS (60)//总共60片贴图完成模型



/*Image
	    a_______b
		 |     |
		 |     |
		 |_____|
		c	   	d	*/
//记录每小片贴图abc三点空间位置[(Xa,Ya,Za),(Xb,Yb,Zb),(Xc,Yc,Zc),材质图片ID]=[10]
//由于是正方形,d点可以用abc算得
static const short D3dPos[UNITS][10]={
	//后脸
	-22,52,313,-67,52,308,-22,10,313,27,
	22,52,313,-22,52,313,22,10,313,26,
	22,52,313,67,52,308,22,10,313,27,

	//后盖
	-67,52,313,0,52,313,-67,52,269,19,
	67,52,313,0,52,313,67,52,269,19,
	   
	//左后盖头
	67,52,269,57,52,269,67,52,191,20,
	//右后盖头
	-67,52,269,-57,52,269,-67,52,191,20,

	//左尾
	67,52,231,67,52,272,67,29,231,36,
	67,52,272,67,52,309,67,10,272,37,
	//右尾
	-67,52,231,-67,52,272,-67,29,231,36,
	-67,52,272,-67,52,309,-67,10,272,37,

	//左后轮
	65,35,224,65,35,275,65,-16,224,39,
	//右后轮
	-65,35,224,-65,35,275,-65,-16,224,39,

	//压风板
	-67,76,324,-23,76,324,-67,66,277,21,
	-23,76,324,23,76,324,-23,66,277,22,
	23,76,324,67,76,324,23,66,277,23,

	//左尾支架
	67,81,277,67,81,317,67,52,277,38,
	//右尾支架
	-67,81,277,-67,81,317,-67,52,277,38,

	//后窗
	-57,52,269,0,52,269,-57,85,216,17,
	0,52,269,57,52,269,0,85,216,18,

	//顶
	-41,85,216,0,85,216,-41,85,178,13,
    -41,85,178,0,85,178,-41,85,140,14,
	0,85,216,41,85,216,0,85,178,15,
    0,85,178,41,85,178,0,85,140,16,

	//左门后
	57,52,191,67,52,231,57,0,191,35,
	//右门后
	-57,52,191,-67,52,231,-57,0,191,35,
 
	//左侧窗
	41,85,100,41,85,157,57,52,100,28,
	41,85,157,41,85,213,57,52,157,29,
	41,85,213,41,85,269,57,52,213,30,
	//右侧窗
	-41,85,100,-41,85,157,-57,52,100,28,
	-41,85,157,-41,85,213,-57,52,157,29,
	-41,85,213,-41,85,269,-57,52,213,30,

	//左门
	57,52,99,57,52,145,57,0,99,33,
	57,52,145,57,52,191,57,0,145,34,
	//右门
	-57,52,99,-57,52,145,-57,0,99,33,
	-57,52,145,-57,52,191,-57,0,145,34,	
	   
	//前窗
	-57,85,140,-18,85,140,-57,52,100,10,
	-19,85,140,19,85,140,-19,52,100,11,
	18,85,140,57,85,140,18,52,100,12,
	   
	//左门前
	67,53,72,57,53,100,67,0,72,32,
	//右门前
	-67,53,72,-57,53,100,-67,0,72,32,

	//左前轮
	65,35,29,65,35,80,65,-16,29,39,
	//右前轮
	-65,35,29,-65,35,80,-65,-16,29,39,

	//左翅
	67,49,23,67,49,72,67,0,23,31,
	//右翅
	-67,49,23,-67,49,72,-67,0,23,31,

	//发动机盖
	//0
	-67,52,100,-33,52,100,-67,49,66,0,
	-33,52,100,0,52,100,-33,49,66,1,
	33,52,100,0,52,100,33,49,66,1,
	33,52,100,67,52,100,33,49,66,2,
	//1
	-67,49,66,-33,49,66,-67,45,33,6,
	-33,49,66,0,49,66,-33,49,33,5,
	0,49,66,33,49,66,0,49,33,4,
	33,49,66,67,49,66,33,45,33,3,
	//2
	-67,45,33,-33,45,33,-67,40,0,7,
	-33,49,33,0,49,33,-33,40,0,8,
	0,49,33,33,49,33,0,40,0,9,
	67,45,33,33,45,33,67,40,0,7,
	   
	//左灯
	25,44,1,67,44,23,25,0,1,25,
	//右灯
	-25,44,1,-67,44,23,-25,0,1,25,
	//前脸
	-25,40,1,25,40,1,-25,0,1,24,
};


//按键标志位定义
#define KEY_LEFT  (1)
#define KEY_RIGHT (2)
#define KEY_UP    (4)
#define KEY_DOWN  (8)
#define KEY_HIGH  (16)
#define KEY_LOW   (32)

//程序结构体
typedef struct
{
	AEEApplet            a;
	ISprite              *pISprite;
	AEESpriteCmd         pCmds[3];
	AEETransformMatrix   pTransform[2];

	byte                 hW,hH,Key,units,flag[UNITS];
	short                userPos[3],bufPos[UNITS][9],order[UNITS],
		                 frames,clocksec,clockmin,angle,sin,cos;
	uint16               distance[UNITS];
	
	AECHAR               fps[9],sysclock[9],buf[16],inf[8];
} Data;


//函数声明
static boolean NFS_HandleEvent(IApplet * pi, AEEEvent eCode, uint16 wParam, uint32 dwParam);
static void NFS_Init(Data *pMe);
static int  NFS_LoadResources(Data *pMe);
static void NFS_UnloadResources(Data *pMe);
static void NFS_Display(Data *pMe);
static void NFS_Circu(Data *pMe);
static void NFS_KeyEvent(Data *pMe);
static void NFS_Help(Data *pMe);

//自定义三角函数
#ifdef USE_TRANSFORMS
static short Sin(Data *pMe);
static short Cos(Data *pMe);
#endif



int AEEClsCreateInstance(AEECLSID ClsId,IShell * pIShell,IModule * po,void ** ppObj)
{
   *ppObj = NULL;
		
   if(ClsId == AEECLSID_NFS){
      if(AEEApplet_New(sizeof(Data), ClsId, pIShell,po,(IApplet**)ppObj,
         (AEEHANDLER)NFS_HandleEvent,(PFNFREEAPPDATA)NFS_UnloadResources)
         == TRUE)
      {
         return (AEE_SUCCESS);
      }
   }
	return (EFAILED);
}


static boolean NFS_HandleEvent(IApplet * pi, AEEEvent eCode, uint16 wParam, uint32 dwParam)
{  
	Data* pMe=(Data*)pi;
	switch (eCode) 
	{
		case EVT_APP_START:
			NFS_Init(pMe);
			if (NFS_LoadResources(pMe) != SUCCESS) return FALSE;//加载并处理图片
			NFS_Display(pMe);//不断刷新显示
			NFS_Circu(pMe);//自动旋转
			NFS_KeyEvent(pMe);//完成按键连击事件
			NFS_Help(pMe);//显示系统clock&fps
      		return TRUE;

		case EVT_KEY:
		switch (wParam) 
		{
			case AVK_LEFT:
			case AVK_4:
				pMe->Key |= KEY_LEFT;
				return(TRUE);
			case AVK_RIGHT:
			case AVK_6:
				pMe->Key |= KEY_RIGHT;
				return(TRUE);
			case AVK_UP:
			case AVK_8:
				pMe->Key |= KEY_UP;
				return(TRUE);
			case AVK_DOWN:
			case AVK_2:
				pMe->Key |= KEY_DOWN;
				return(TRUE);

			case AVK_3:
				pMe->Key |= KEY_HIGH;
				return(TRUE);
			case AVK_1:
				pMe->Key |= KEY_LOW;
				return(TRUE);
		}
		return FALSE;

		case EVT_KEY_RELEASE:
		switch (wParam) 
		{
			case AVK_LEFT:
			case AVK_4:
				pMe->Key &= ~KEY_LEFT;
				return(TRUE);
			case AVK_RIGHT:
			case AVK_6:
				pMe->Key &= ~KEY_RIGHT;
				return(TRUE);
			case AVK_UP:
			case AVK_8:
				pMe->Key &= ~KEY_UP;
				return(TRUE);
			case AVK_DOWN:
			case AVK_2:
				pMe->Key &= ~KEY_DOWN;
				return(TRUE);

			case AVK_3:
				pMe->Key &= ~KEY_HIGH;
				return(TRUE);
			case AVK_1:
				pMe->Key &= ~KEY_LOW;
				return(TRUE);
		}
		return FALSE;
		case EVT_APP_NO_SLEEP:
			return TRUE;
		case EVT_APP_STOP:
			NFS_UnloadResources(pMe);
			return TRUE;
		default:
		break;
	}
	return FALSE;
}


//=====================================================
//NFS_Init
//=====================================================
static void NFS_Init(Data *pMe)
{
   AEEDeviceInfo di;
   int i;

   //user位置初始化
   pMe->userPos[0]=0;pMe->userPos[1]=90;pMe->userPos[2]=-220;

   //获取设备尺寸
   ISHELL_GetDeviceInfo(pMe->a.m_pIShell, &di);
   pMe->hW = di.cxScreen >> 1; pMe->hH = di.cyScreen >> 1;

   //每次draw 2个sprite的命令数组初始化
   for(i=0;i<2;i++)
   {
	 pMe->pCmds[i].unTransform = SPRITE_MATRIX_TRANSFORM;
	 pMe->pCmds[i].unMatrixTransform = i;
	 pMe->pCmds[i].unSpriteSize = SPRITE_SIZE_32X32;
	 pMe->pCmds[i].unComposite = 0;
	 pMe->pCmds[i].unLayer = 0;
   }
   pMe->pCmds[2].unSpriteSize = SPRITE_SIZE_END;//sptite结束


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -