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; }
void GameEntity::Update() { //onEnterFrame circle.x+=vx; circle.y+=vy; rotation=AnglePlus(rotation,vr); }
/** * 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; }