コード例 #1
0
ファイル: ProjectileService.java プロジェクト: Raneman/game
  private void onFlameLifecycle(Room room, Flame flame, Integer flameBathcId) {
    if (!flame.isStoped()) {
      updatePosition(flame);
    }

    if (!flame.isStoped()) {
      if (flame.getxStart() <= 0
          || flame.getxStart() >= room.getMap().getX()
          || flame.getyStart() <= 0
          || flame.getyStart() >= room.getMap().getY()) {
        flame.setStoped(true);
      }
    }
    Circle flameCircle =
        new Circle(flame.getxStart(), flame.getyStart(), PersonWebSocketEndpoint.FIRE_RADIUS);
    if (!flame.isStoped()) {
      for (AbstractZone zone : room.getMap().getZones()) {
        if (!zone.isShootable()) {
          Point[] point =
              CircleService.circleBoundsIntersection(
                  flameCircle,
                  new Bounds(zone.getX(), zone.getY(), zone.getWidth(), zone.getHeight()));
          if (point.length > 0) {
            flame.setStoped(true);
            break;
          }
        }
      }
    }
    for (Person person : room.getPersons().values()) {
      if (person.getId() != flame.getPersonId()) {
        Circle personCircle =
            new Circle(person.getX(), person.getY(), PersonWebSocketEndpoint.PERSON_RADIUS);
        Point[] point = CircleService.circleCircleIntersection(flameCircle, personCircle);
        if (point.length > 0) {
          onDamage(room.getPersons().get(flame.getPersonId()), flame.getDamage(), person, room);
          room.getProjectiles().remove(flameBathcId);
        }
      }
    }
  }
コード例 #2
0
ファイル: ProjectileService.java プロジェクト: Raneman/game
  private void onRocketLifecycle(Room room, Rocket rocket, Integer rocketBatchId) {
    updatePosition(rocket);

    Circle rocketCircle =
        new Circle(rocket.getxStart(), rocket.getyStart(), PersonWebSocketEndpoint.ROCKET_RADIUS);
    Explosion explosion = null;
    if (rocket.getxStart() <= 0
        || rocket.getxStart() >= room.getMap().getX()
        || rocket.getyStart() <= 0
        || rocket.getyStart() >= room.getMap().getY()) {
      explosion = new Explosion((int) rocket.getxStart(), (int) rocket.getyStart());
    }
    if (explosion == null) {
      for (AbstractZone zone : room.getMap().getZones()) {
        if (!zone.isShootable()) {
          Point[] point =
              CircleService.circleBoundsIntersection(
                  rocketCircle,
                  new Bounds(zone.getX(), zone.getY(), zone.getWidth(), zone.getHeight()));
          if (point.length > 0) {
            explosion = new Explosion((int) point[0].getX(), (int) point[0].getY());
            break;
          }
        }
      }
    }
    if (explosion == null) {
      for (Person person : room.getPersons().values()) {
        if (person.getId() != rocket.getPersonId()) {
          Circle personCircle =
              new Circle(person.getX(), person.getY(), PersonWebSocketEndpoint.PERSON_RADIUS);
          Point[] point = CircleService.circleCircleIntersection(rocketCircle, personCircle);
          if (point.length > 0) {
            explosion = new Explosion((int) point[0].getX(), (int) point[0].getY());
            onDamage(room.getPersons().get(rocket.getPersonId()), rocket.getDamage(), person, room);
            break;
          }
        }
      }
    }

    if (explosion != null) {
      explosion.setxEnd((int) explosion.getxStart());
      explosion.setyEnd((int) explosion.getyStart());
      int id = gameContext.getProjectilesIds().getAndIncrement();
      room.getProjectiles().put(id, new Projectile[] {explosion});

      Circle explosionCircle =
          new Circle(explosion.getxStart(), explosion.getyStart(), explosion.getRadius());
      Person shooter = room.getPersons().get(rocket.getPersonId());

      for (Person person : room.getPersons().values()) {
        double damageFactor =
            PointService.pointBelongToCircle(
                new Point(person.getX(), person.getY()), explosionCircle);
        if (damageFactor > -1) {
          double damage = explosion.getDamage() + damageFactor * explosion.getDamageFactor();
          onDamage(shooter, (int) damage, person, room);
        }
      }
      room.getProjectiles().remove(rocketBatchId);
    }
  }
コード例 #3
0
ファイル: ProjectileService.java プロジェクト: Raneman/game
  private synchronized void calculateInstantImpacts(
      Person shooter, Projectile projectile, Room room) {

    double xStart = projectile.getxStart();
    double yStart = projectile.getyStart();

    Person closestPerson = null;
    Point closestPoint = null;

    for (AbstractZone zone : room.getMap().getZones()) {
      if (zone.isShootable()) {
        continue;
      }
      Bounds zoneBounds = GeometryService.getRectangle(zone);
      Point[] zoneIntersection =
          LineService.lineBoundsIntersections(
              new Line(
                  new Point(shooter.getX(), shooter.getY()),
                  new Point(projectile.getxEnd(), projectile.getyEnd())),
              zoneBounds);
      Point closest =
          isMoreClose(
              (int) projectile.getxStart(),
              (int) projectile.getyStart(),
              new Point(projectile.getxEnd(), projectile.getyEnd()),
              zoneIntersection);
      if (closest != null) {
        closestPoint = closest;
        projectile.setxEnd((int) closest.getX());
        projectile.setyEnd((int) closest.getY());
      }
    }

    for (Person person : room.getPersons().values()) {
      Point linePointB = new Point((double) projectile.getxEnd(), (double) projectile.getyEnd());
      Point[] intersectionPoints =
          LineService.lineIntersectCircle(
              new Line(new Point(xStart, yStart), linePointB),
              new Circle(person.getX(), person.getY(), PersonWebSocketEndpoint.PERSON_RADIUS));

      if (shooter == person) {
        projectile.setxStart((int) intersectionPoints[0].getX());
        projectile.setyStart((int) intersectionPoints[0].getY());
        continue;
      }

      if (intersectionPoints != null && intersectionPoints.length > 0) {
        Point closest =
            isMoreClose(
                (int) shooter.getX(), (int) shooter.getY(), closestPoint, intersectionPoints);
        if (closest != null) {
          if (projectile.isPiercing()) {
            onDamage(shooter, projectile.getDamage(), person, room);
          } else {
            closestPoint = closest;
            closestPerson = person;
          }
        }
      }
    }

    if (closestPerson != null) {
      onDamage(shooter, projectile.getDamage(), closestPerson, room);
    }
    if (closestPoint != null) {
      projectile.setxEnd((int) closestPoint.getX());
      projectile.setyEnd((int) closestPoint.getY());
    }
  }