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

📄 r_main.c

📁 制作游戏 魔法师传奇 源代码设计 MOFASHICHUANQI 经典老游戏
💻 C
📖 第 1 页 / 共 2 页
字号:
== R_InitTextureMapping==================*/void R_InitTextureMapping (void){	int			i;	int			x;	int			t;	fixed_t		focallength;//// use tangent table to generate viewangletox// viewangletox will give the next greatest x after the view angle//	// calc focallength so FIELDOFVIEW angles covers SCREENWIDTH	focallength = FixedDiv (centerxfrac	, finetangent[FINEANGLES/4+FIELDOFVIEW/2] );	for (i=0 ; i<FINEANGLES/2 ; i++)	{		if (finetangent[i] > FRACUNIT*2)			t = -1;		else if (finetangent[i] < -FRACUNIT*2)			t = viewwidth+1;		else		{			t = FixedMul (finetangent[i], focallength);			t = (centerxfrac - t+FRACUNIT-1)>>FRACBITS;			if (t < -1)				t = -1;			else if (t>viewwidth+1)				t = viewwidth+1;		}		viewangletox[i] = t;	}//// scan viewangletox[] to generate xtoviewangleangle[]//// xtoviewangle will give the smallest view angle that maps to x	for (x=0;x<=viewwidth;x++)	{		i = 0;		while (viewangletox[i]>x)			i++;		xtoviewangle[x] = (i<<ANGLETOFINESHIFT)-ANG90;	}//// take out the fencepost cases from viewangletox//	for (i=0 ; i<FINEANGLES/2 ; i++)	{		t = FixedMul (finetangent[i], focallength);		t = centerx - t;		if (viewangletox[i] == -1)			viewangletox[i] = 0;		else if (viewangletox[i] == viewwidth+1)			viewangletox[i]  = viewwidth;	}	clipangle = xtoviewangle[0];}//=============================================================================/*====================== R_InitLightTables== Only inits the zlight table, because the scalelight table changes= with view size=====================*/#define		DISTMAP	2void R_InitLightTables (void){	int		i,j, level, startmap;
	int		scale;//// Calculate the light levels to use for each level / distance combination//	for (i=0 ; i< LIGHTLEVELS ; i++)	{		startmap = ((LIGHTLEVELS-1-i)*2)*NUMCOLORMAPS/LIGHTLEVELS;		for (j=0 ; j<MAXLIGHTZ ; j++)		{			scale = FixedDiv ((SCREENWIDTH/2*FRACUNIT), (j+1)<<LIGHTZSHIFT);			scale >>= LIGHTSCALESHIFT;			level = startmap - scale/DISTMAP;			if (level < 0)				level = 0;			if (level >= NUMCOLORMAPS)				level = NUMCOLORMAPS-1;			zlight[i][j] = colormaps + level*256;		}	}}/*================ R_SetViewSize== Don't really change anything here, because i might be in the middle of= a refresh.  The change will take effect next refresh.===============*/boolean	setsizeneeded;int		setblocks, setdetail;void R_SetViewSize (int blocks, int detail){	setsizeneeded = true;	setblocks = blocks;	setdetail = detail;}/*================ R_ExecuteSetViewSize===============*/void R_ExecuteSetViewSize (void){	fixed_t	cosadj, dy;	int		i,j, level, startmap;
	setsizeneeded = false;	if (setblocks == 11)	{		scaledviewwidth = SCREENWIDTH;		viewheight = SCREENHEIGHT;	}	else	{		scaledviewwidth = setblocks*32;		viewheight = (setblocks*161/10);	}	detailshift = setdetail;	viewwidth = scaledviewwidth>>detailshift;	centery = viewheight/2;	centerx = viewwidth/2;	centerxfrac = centerx<<FRACBITS;	centeryfrac = centery<<FRACBITS;	projection = centerxfrac;	if (!detailshift)	{		colfunc = basecolfunc = R_DrawColumn;		fuzzcolfunc = R_DrawFuzzColumn;		transcolfunc = R_DrawTranslatedColumn;		spanfunc = R_DrawSpan;	}	else	{		colfunc = basecolfunc = R_DrawColumnLow;		fuzzcolfunc = R_DrawFuzzColumn;		transcolfunc = R_DrawTranslatedColumn;		spanfunc = R_DrawSpanLow;	}	R_InitBuffer (scaledviewwidth, viewheight);	R_InitTextureMapping ();//// psprite scales//	pspritescale = FRACUNIT*viewwidth/SCREENWIDTH;	pspriteiscale = FRACUNIT*SCREENWIDTH/viewwidth;//// thing clipping//	for (i=0 ; i<viewwidth ; i++)		screenheightarray[i] = viewheight;//// planes//	for (i=0 ; i<viewheight ; i++)	{		dy = ((i-viewheight/2)<<FRACBITS)+FRACUNIT/2;		dy = abs(dy);		yslope[i] = FixedDiv ( (viewwidth<<detailshift)/2*FRACUNIT, dy);	}	for (i=0 ; i<viewwidth ; i++)	{		cosadj = abs(finecosine[xtoviewangle[i]>>ANGLETOFINESHIFT]);		distscale[i] = FixedDiv (FRACUNIT,cosadj);	}//// Calculate the light levels to use for each level / scale combination//	for (i=0 ; i< LIGHTLEVELS ; i++)	{		startmap = ((LIGHTLEVELS-1-i)*2)*NUMCOLORMAPS/LIGHTLEVELS;		for (j=0 ; j<MAXLIGHTSCALE ; j++)		{			level = startmap - j*SCREENWIDTH/(viewwidth<<detailshift)/DISTMAP;			if (level < 0)				level = 0;			if (level >= NUMCOLORMAPS)				level = NUMCOLORMAPS-1;			scalelight[i][j] = colormaps + level*256;		}	}//// draw the border//	R_DrawViewBorder ();    // erase old menu stuff}/*================ R_Init===============*/int detailLevel;int screenblocks;void R_Init(void){	R_InitData();	R_InitPointToAngle();	R_InitTables();	// viewwidth / viewheight / detailLevel are set by the defaults	R_SetViewSize(screenblocks, detailLevel);	R_InitPlanes();	R_InitLightTables();	R_InitSkyMap();	R_InitTranslationTables();	framecount = 0;}/*================ R_PointInSubsector===============*/subsector_t *R_PointInSubsector (fixed_t x, fixed_t y){	node_t	*node;	int		side, nodenum;	if (!numnodes)				// single subsector is a special case		return subsectors;	nodenum = numnodes-1;	while (! (nodenum & NF_SUBSECTOR) )	{		node = &nodes[nodenum];		side = R_PointOnSide (x, y, node);		nodenum = node->children[side];	}	return &subsectors[nodenum & ~NF_SUBSECTOR];}//----------------------------------------------------------------------------//// PROC R_SetupFrame////----------------------------------------------------------------------------void R_SetupFrame(player_t *player){	int i;	int tableAngle;	int tempCentery;	int intensity;	//drawbsp = 1;	viewplayer = player;#ifdef __WATCOMC__
	if(newViewAngleOff)	{		viewangleoffset = newViewAngleOff<<ANGLETOFINESHIFT;
	}#endif
	viewangle = player->mo->angle+viewangleoffset;	tableAngle = viewangle>>ANGLETOFINESHIFT;	viewx = player->mo->x;	viewy = player->mo->y;	if(localQuakeHappening[displayplayer] && !paused)	{		intensity = localQuakeHappening[displayplayer];		viewx += ((M_Random() % (intensity<<2))					-(intensity<<1))<<FRACBITS;		viewy += ((M_Random()%(intensity<<2))					-(intensity<<1))<<FRACBITS;	}	extralight = player->extralight;	viewz = player->viewz;		tempCentery = viewheight/2+(player->lookdir)*screenblocks/10;	if(centery != tempCentery)	{		centery = tempCentery;		centeryfrac = centery<<FRACBITS;		for(i = 0; i < viewheight; i++)		{			yslope[i] = FixedDiv ((viewwidth<<detailshift)/2*FRACUNIT,				abs(((i-centery)<<FRACBITS)+FRACUNIT/2));		}	}	viewsin = finesine[tableAngle];	viewcos = finecosine[tableAngle];	sscount = 0;	if(player->fixedcolormap)	{		fixedcolormap = colormaps+player->fixedcolormap			*256*sizeof(lighttable_t);		walllights = scalelightfixed;		for(i = 0; i < MAXLIGHTSCALE; i++)		{			scalelightfixed[i] = fixedcolormap;		}	}	else	{		fixedcolormap = 0;	}	framecount++;	validcount++;	if(BorderNeedRefresh)	{		if(setblocks < 10)		{			R_DrawViewBorder();		}		BorderNeedRefresh = false;		BorderTopRefresh = false;		UpdateState |= I_FULLSCRN;	}	if(BorderTopRefresh)	{		if(setblocks < 10)		{			R_DrawTopBorder();		}		BorderTopRefresh = false;		UpdateState |= I_MESSAGES;	}#ifdef __NeXT__	RD_ClearMapWindow ();#endif#ifdef __WATCOMC__	destview = destscreen+(viewwindowx>>2)+viewwindowy*80;#endif#if 0{static int frame;memset (screen, frame, SCREENWIDTH*SCREENHEIGHT);frame++;}#endif}/*================ R_RenderView===============*/void R_RenderPlayerView (player_t *player){	R_SetupFrame (player);	R_ClearClipSegs ();	R_ClearDrawSegs ();	R_ClearPlanes ();	R_ClearSprites ();	NetUpdate ();					// check for new console commands	// Make displayed player invisible locally	if (localQuakeHappening[displayplayer] && gamestate == GS_LEVEL)	{		players[displayplayer].mo->flags2 |= MF2_DONTDRAW;		R_RenderBSPNode (numnodes-1);	// head node is the last node output		players[displayplayer].mo->flags2 &= ~MF2_DONTDRAW;	}	else	{		R_RenderBSPNode (numnodes-1);	// head node is the last node output	}	NetUpdate ();					// check for new console commands	R_DrawPlanes ();	NetUpdate ();					// check for new console commands	R_DrawMasked ();	NetUpdate ();					// check for new console commands}

⌨️ 快捷键说明

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