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

📄 presence.cc

📁 国外一套很好的游戏代码,款经典的小游戏 希望大家提出宝贵意见 让我们一起进步
💻 CC
字号:
/*	presence.cc		(c) Richard Thrippleton	Licensing terms are in the 'LICENSE' file	If that file is not included with this source then permission is not given to use this source in any way whatsoever.*/#include <SDL.h>#include <string.h>#include "calc.h"#include "graphic.h"#include "protocol.h"#include "camera.h"#include "interface.h"#include "client.h"#include "error.h"#include "presence.h"void presence::init(){	me=NULL;	trg=NULL;	hl=NULL;	hltm=0;	hul=0;	pow=0;	shd=0;	ful=0;	srng=0;	lrng=0;	vel.rad=0;	vel.ang=0;	for(int i=0;i<ISIZE;i++)		objs[i]=NULL;}void presence::purgeall(){	for(int i=0;i<ISIZE;i++)		if(objs[i])			delete objs[i];	init();}void presence::feed(unsigned char* buf){	int id; //Id to use	if(buf[0]==SERV_SELF)	{		updself(buf);	}	if(buf[0]==SERV_NEW)	{		id=calc::dattoint(buf+1);		if(id>=0 && id<ISIZE)		{			if(objs[id])				delete objs[id];			objs[id]=new presence(id,buf);		}	}	if(buf[0]==SERV_NAME)	{		id=calc::dattoint(buf+1);		if(id>=0 && id<ISIZE)		{			if(objs[id])				objs[id]->name(buf);		}	}	if(buf[0]==SERV_UPD)	{		id=calc::dattoint(buf+1);		if(id>=0 && id<ISIZE)		{			if(objs[id])				objs[id]->update(buf);		}	}	if(buf[0]==SERV_DEL)	{		id=calc::dattoint(buf+1);		if(id>=0 && id<ISIZE)			if(objs[id])				delete objs[id];	}	if(buf[0]==SERV_HILIGHT)	{		id=calc::dattoint(buf+1);		if(id>=0 && id<ISIZE && objs[id])		{			hl=objs[id];			hltm=120;		}	}}void presence::interpolateall(){	if(hltm>0)	{		hltm--;		if(hltm==0)			hl=NULL;	}	for(int i=0;i<ISIZE;i++)		if(objs[i])			objs[i]->interpolate();}presence* presence::get(int indx){	if(indx>=0 && indx<ISIZE)	{		if(objs[indx])			return objs[indx];		else			return NULL;	}	else	{		return NULL;	}}void presence::render(){	sbox bbox; //Box for rendering indicator bar	graphic::clip(&interface::barsb);		if(me)	{		graphic::box(&interface::barsb,graphic::BLACK);		bbox.w=8;		bbox.x=interface::barsb.x;		bbox.y=interface::barsb.y+(interface::barsb.h-(shd*interface::barsb.h)/100);		bbox.h=interface::barsb.h+interface::barsb.y-bbox.y;		graphic::box(&bbox,graphic::RED);		bbox.x+=8;		bbox.y=interface::barsb.y+(interface::barsb.h-(pow*interface::barsb.h)/100);		bbox.h=interface::barsb.h+interface::barsb.y-bbox.y;		graphic::box(&bbox,graphic::GREEN);		bbox.x+=8;		bbox.y=interface::barsb.y+(interface::barsb.h-(hul*interface::barsb.h)/100);		bbox.h=interface::barsb.h+interface::barsb.y-bbox.y;		graphic::box(&bbox,graphic::WHITE);		bbox.x+=8;		bbox.y=interface::barsb.y+(interface::barsb.h-(ful*interface::barsb.h)/100);		bbox.h=interface::barsb.h+interface::barsb.y-bbox.y;		graphic::box(&bbox,graphic::BLUE);	}}void presence::controls(){	presence* trg; //Target		trg=NULL;	if(interface::keys[SDLK_LEFT])		client::action(CLIENT_TURN,-1);	if(interface::keys[SDLK_RIGHT])		client::action(CLIENT_TURN,+1);	if(interface::keys[SDLK_DOWN])		if(interface::keys[SDLK_LSHIFT] || interface::keys[SDLK_RSHIFT])			client::action(CLIENT_ACCEL,-2);		else			client::action(CLIENT_ACCEL,-1);	if(interface::keys[SDLK_UP])		if(interface::keys[SDLK_LSHIFT] || interface::keys[SDLK_RSHIFT])			client::action(CLIENT_ACCEL,+2);		else			client::action(CLIENT_ACCEL,+1);	if(!interface::inp)	{		if(interface::keys[SDLK_SPACE])			client::action(CLIENT_SHOOT,0);		if(interface::lasc==SDLK_z)			client::action(CLIENT_SHOOT,1);		if(interface::lasc=='0')			client::action(CLIENT_CONS,0);		if(interface::lasc>='1' && interface::lasc<='9')			client::action(CLIENT_CONS,interface::lasc-'1'+1);		if(interface::lasc=='t')			trg=gettarget(PT_SHIP,+1,camera::cov,false,false);		if(interface::lasc=='T')			trg=gettarget(PT_SHIP,-1,camera::cov,false,false);		if(interface::lasc=='e')			trg=gettarget(PT_SHIP,+1,camera::cov,false,true);		if(interface::lasc=='E')			trg=gettarget(PT_SHIP,-1,camera::cov,false,true);		if(interface::lasc=='p')			trg=gettarget(PT_PLANET,+1,camera::cov,false,false);		if(interface::lasc=='P')			trg=gettarget(PT_PLANET,-1,camera::cov,false,false);		if(trg)			client::action(CLIENT_TRG,trg->self);		if(interface::lasc=='q')			throw error("User requested quit");		if(interface::keys[SDLK_MINUS])			camera::radarzoom(-1);		if(interface::keys[SDLK_EQUALS] || interface::lasc=='+')			camera::radarzoom(+1);		if(interface::lasc=='/')			camera::viewzoom();	}	if(interface::lkey>=SDLK_F1 && interface::lkey<=SDLK_F10)	{		client::action(CLIENT_CMOD,interface::lkey-SDLK_F1);	}}void presence::drawat(int sx,short sy,short zout){	int rot; //Rotation frame to use	long lx,ly; //Co-ordinates of 'link' presence	long thx,thy; //Thickness offsets	graphic* pspr; //Graphic for marking position while cloaked	int zm; //Zoom amount to use	zm=0;	if(spr)	{		rot=((ang+5)/10)%36;		if(rot<0)			rot+=36;		if(vis)		{			if(this==trg)				spr->draw(sx,sy,rot,zout,100-vis,true);			else				spr->draw(sx,sy,rot,zout,100-vis,false);		}		else		{			pspr=graphic::get(graphic::POS);			pspr->draw(sx,sy,rot,1,0,false);		}		}	if(col>=0 && link)	{		lx=sx-((mov.xx-link->mov.xx)*8*age)/(zout*9);		ly=sy-((mov.yy-link->mov.yy)*8*age)/(zout*9);		graphic::line(sx,sy,lx,ly,col);		if(zout==1)		{			if(lx>0)			{				if(ly>0)				{					thx=+1;					thy=-1;				}				else				{					thx=+1;					thy=+1;				}			}			else			{				if(ly>0)				{					thx=-1;					thy=+1;				}				else				{					thx=-1;					thy=-1;				}			}			graphic::line(sx+thx,sy+thy,lx+thx,ly+thy,col);		}	}}presence* presence::me;presence* presence::trg;presence* presence::hl;int presence::hul;int presence::pow;int presence::shd;int presence::ful;ipol presence::vel;long presence::srng,presence::lrng;presence::presence(int self,unsigned char* buf){	this->self=self;	age=0;	buf+=3;	typ=*buf;	buf+=1;	col=calc::dattoint(buf);	if(col>=0)	{		spr=graphic::get(col);		col=-1;	}	else	{		spr=NULL;		col=-col;	}	buf+=2;	link=presence::get(calc::dattoint(buf));	buf+=2;}presence::~presence(){	if(self>=0 && self<ISIZE)		objs[self]=NULL;	if(me==this)	{		me=NULL;		camera::unbind();	}	if(trg==this)		trg=NULL;	if(hl==this)		hl=NULL;}presence* presence::gettarget(int typ,short dir,box cov,bool out,bool enem){	int st; //Starting index	if(!me)		return NULL;	if(dir>0)		dir=+1;	else		dir=-1;	if(trg)		st=trg->self+dir;	else		st=0;	if(st<0)		st=ISIZE;	else if(st>=ISIZE)		st=0;	for(int i=0;i<ISIZE;i++)	{		if(objs[st] && objs[st]!=me && objs[st]->typ==typ)			if(			objs[st]->loc.x<cov.x2 &&			objs[st]->loc.x>cov.x1 &&					objs[st]->loc.y<cov.y2 &&					objs[st]->loc.y>cov.y1			)			{				if(!out && ((objs[st]->enem && enem) || !enem))					return objs[st];			}			else			{				if(out && ((objs[st]->enem && enem) || !enem))					return objs[st];			}						st=(st+dir);		if(st<0)			st=ISIZE;		st=st%ISIZE;	}	return NULL;}void presence::updself(unsigned char* buf){	int i; //Temp, for resolving other presences	buf+=1;	i=calc::dattoint(buf);	me=get(i);	if(me)	{		camera::turnon();		camera::bind(me);	}	else	{		camera::unbind();	}	buf+=2;	hul=calc::dattoint(buf);	buf+=2;	pow=calc::dattoint(buf);	buf+=2;	shd=calc::dattoint(buf);	buf+=2;	ful=calc::dattoint(buf);	buf+=2;	srng=calc::dattolong(buf);	buf+=4;	lrng=calc::dattolong(buf);	buf+=4;	i=calc::dattoint(buf);	if(i>=0 && i<ISIZE && objs[i])		trg=objs[i];	else		trg=NULL;	buf+=2;}void presence::name(unsigned char* buf){	buf+=3;	memcpy(nam,buf,64);	nam[64]='\0';	buf+=64;	memcpy(anno,buf,64);	nam[64]='\0';	buf+=64;}void presence::update(unsigned char* buf){	buf+=3;	loc.x=calc::dattolong(buf);	buf+=4;	loc.y=calc::dattolong(buf);	buf+=4;	mov.xx=calc::dattolong(buf);	buf+=4;	mov.yy=calc::dattolong(buf);	buf+=4;	ang=calc::dattoint(buf);	buf+=2;	enem=*buf;	buf+=1;	vis=*buf;	if(vis>100)		vis=100;	buf+=1;}void presence::interpolate(){	if(!me && (link || (typ==PT_FRAG && calc::rnd(40)==0)))	{		delete this;		return;	}	//if(typ==PT_FRAG && col!=-1 && age>=5)	//	return;	if(this==me)	{		vel=mov.topol();		vel.ang=ang;	}	loc.x+=mov.xx;	loc.y+=mov.yy;	age++;}presence* presence::objs[ISIZE];int presence::hltm;

⌨️ 快捷键说明

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