Exemple #1
0
bool W_Cannon::Fire(int mnplt)
{
	//应该发送一个事件给Battlefield,让其生成一个炮弹
	//低级一点的就是用传入一个指向Battlefield的指针来操作(这样总觉得Robot类与Battlefield类紧耦合了又)
	if(General_Fire(mnplt))
	{
		double p=inaccuracy*(Random0_1()-0.5);//偏移角度
		//double r=AnglePlus(AnglePlus(rotation,engineRotation),p);//角度
		double r=AnglePlus(rotation,p);
		double a=AngleToRadian(r);//弧度


		bullettypename bt = (bullettypename)type;
		//bullettypename bt = BT_Cannonball;
		//if(type == WT_Apollo)
		//{
		//	bt = BT_ApolloBall;
		//}


		pDispatcher->DispatchEvent(ID,pBattlefield->GetID(),
			Add_Bullet,
			new B_Cannonball(circle.r*cos(a)+circle.x,circle.r*sin(a)+circle.y,r,pRobot->GetBattlefieldID(),bt)  );
		
		pRobot->GetAchievementData().Add_Fire();

		return true;
	}
	return false;
}
Exemple #2
0
void GameEntity::Update()
{
	//onEnterFrame
	circle.x+=vx;
	circle.y+=vy;
	rotation=AnglePlus(rotation,vr);
}
Exemple #3
0
Fichier : api.c Projet : el303/pses
/**
 * SensorRange = einschränkung der Reichweite. Verhindert unnötig lange Berechnung
 * Return: Distance
 */
uint16_t driven_before(int8_t type, uint16_t SensorRange) {
	double diffR;
#ifdef CARTOGRAPHY_SCENARIO
	gps_reducedData_t *own;
	uint16_t angle, diffL;
	int16_t xCollision = 0, yCollision = 0, ownX, ownY;
	int32_t newX, newY;

	//Aktuelle Orientierung beachten!!! Orientierung in Abhängigkeit der Fahrzeugorientierung und dem aktuell betrachteten Sensor
	own = get_ownCoords();
	switch(type) {
		case RIGHT_SENSOR:
		angle = AngleMinus(own->angle, 16383);
		if (SensorRange > RANGESIDE*2) SensorRange = RANGESIDE*2; //siehe Anforderungen in wallFollow für align = 2
		break;
		case LEFT_SENSOR:
		angle = AnglePlus(own->angle, 16383);
		if (SensorRange > RANGESIDE*2) SensorRange = RANGESIDE*2;//siehe Anforderungen in wallFollow für align = 2
		break;
		case FRONT_SENSOR:
		angle = own->angle;
		if (SensorRange > RANGESIDE*2) SensorRange = RANGESIDE*2;
		break;
		default: angle = own->angle; break;
	}
	SensorRange = SensorRange / 5;

	ownX = CoordinatesToMap(own->x);
	ownY = CoordinatesToMap(own->y);

	if (Sema != NULL) {
		while ( xSemaphoreTake( Sema, ( portTickType ) 10 ) != pdTRUE ) {
			os_wait(10);
		}
		newX = (SensorRange*cos_Taylor(uint16DegreeRelativeToX(angle)))/100 + ownX;
		ownX = (2*cos_Taylor(uint16DegreeRelativeToX(angle)))/100 + ownX; //Ein stück aus dem Urpsrung rausgehen
		newY = (SensorRange*sin_Taylor(uint16DegreeRelativeToX(angle)))/100 + ownY;
		ownY = (2*sin_Taylor(uint16DegreeRelativeToX(angle)))/100 + ownY;

		//gibt es ein bereits befahrenes Gebiet/Hindernis das zwischen Sensorwert und Auto liegt?
		diffL = calc_reachability(&xCollision, &yCollision, ownX, ownY, (int16_t)newX, (int16_t)newY);

		xSemaphoreGive(Sema);
	} else return 600; //600 = max. Sensorreichweite

	if (diffL == 1) {
		diffR = sqrt(abs16(ownX - xCollision)*abs16(ownX - xCollision) + abs16(ownY - yCollision)*abs16(ownY - yCollision));
		diffR = diffR*5;
		if (diffR < 100) {
			Seg_Hex(0x00);
		}
		else Seg_Hex(0x01);

	}
	else {
		diffR = 600; // 600 für nichts gefunden
	}
	if (diffR > 600) diffR = 600;
#endif
	return (uint16_t) diffR;
}