Пример #1
0
bool MarbleSplashLayer::render( GeoPainter *painter, ViewportParams *viewport,
                                const QString &renderPos, GeoSceneLayer *layer )
{
    Q_UNUSED( renderPos );
    Q_UNUSED( layer );

    painter->save();

    QPixmap logoPixmap( MarbleDirs::path( "svg/marble-logo-inverted-72dpi.png" ) );

    if ( logoPixmap.width() > viewport->width() * 0.7
         || logoPixmap.height() > viewport->height() * 0.7 )
    {
        logoPixmap = logoPixmap.scaled( QSize( viewport->width(), viewport->height() ) * 0.7,
                                        Qt::KeepAspectRatio, Qt::SmoothTransformation );
    }

    QPoint logoPosition( ( viewport->width()  - logoPixmap.width() ) / 2,
                         ( viewport->height() - logoPixmap.height() ) / 2 );
    painter->drawPixmap( logoPosition, logoPixmap );

    QString message; // "Please assign a map theme!";

    painter->setPen( Qt::white );

    int yTop = logoPosition.y() + logoPixmap.height() + 10;
    QRect textRect( 0, yTop,
                    viewport->width(), viewport->height() - yTop );
    painter->drawText( textRect, Qt::AlignHCenter | Qt::AlignTop, message );

    painter->restore();

    return true;
}
Пример #2
0
void StateBadVista::update()
{

  const int LOGO_SIDE = logo.getWidth()  / 2;
  const int LOGO_TOP  = logo.getHeight() / 2;

  arm.setScaleX(1);
  arm.setScaleY(1);
  arm.setRotation(-armAngle);

  logo.setScaleX(1);
  logo.setScaleY(1);
  logo.setRotation(-armAngle * 0.5f);


  if(bvState == BV_WINDUP) {
    float radians = armAngle * 3.14159f / 180.0f;
    logo.setPosition(
        (int) LOGO_INIT_X + (armAngle * 0.25f) - (50 * sin(radians)),
        (int) LOGO_INIT_Y - 100 + (100 * cos(radians)));
    return;
  }


  if(bvState == BV_PITCHED) {
    // Calculate motion region
    #ifdef PENJIN_FIXED
        SimpleRegion tempRegion(logoX, logoY, fixedpoint::fix2int(logoX + logoVelocityX), fixedpoint::fix2int(logoY + logoVelocityY));
    #else
        SimpleRegion tempRegion(logoX, logoY, logoX + logoVelocityX, logoY + logoVelocityY);
    #endif
    SimpleRegion motion(
      tempRegion.x1() - LOGO_SIDE,
      tempRegion.y1() - LOGO_TOP,
      tempRegion.x2() + LOGO_SIDE,
      tempRegion.y2() + LOGO_TOP);

    if (hitObstacle(horizontalObstacles, motion)) {
      if (bounce.isPlaying()) bounce.stop();
      bounce.play();
      logoVelocityX *= BOUNCE_DECAY;
      logoVelocityY *= BOUNCE_DECAY;
      logoVelocityY *= -1;
      numBounces++;
    }

    if (hitObstacle(verticalObstacles, motion)) {
      if (bounce.isPlaying()) bounce.stop();
      bounce.play();
      logoVelocityX *= BOUNCE_DECAY;
      logoVelocityY *= BOUNCE_DECAY;
      logoVelocityX *= -1;
    }

    // Sometimes the ball gets caught inside the side of the litter can:
    // neither inside nor out. The following two paragraphs seek to prevent
    // that.
    if (hitObstacle(basketLeft, motion)) {
      bounce.play();
      logoVelocityX *= BOUNCE_DECAY;
      logoVelocityY *= BOUNCE_DECAY;
      if (logoX >= BASKET_LEFT_INSIDE && logoVelocityX < 0)
        logoVelocityX *= -1;
      if (logoX < BASKET_LEFT_INSIDE && logoVelocityX > 0)
        logoVelocityX *= -1;
    }

    if (hitObstacle(basketRight, motion)) {
      bounce.play();
      logoVelocityX *= BOUNCE_DECAY;
      logoVelocityY *= BOUNCE_DECAY;
      if (logoX >= BASKET_RIGHT_INSIDE && logoVelocityX < 0)
        logoVelocityX *= -1;
      if (logoX < BASKET_RIGHT_INSIDE && logoVelocityX > 0)
        logoVelocityX *= -1;
    }

    if (hitObstacle(playerObstacle, motion)) {
      init();
      return;
    }

    SimpleRegion logoPosition(logoX - LOGO_SIDE, logoY - LOGO_TOP, logoX + LOGO_SIDE, logoY + LOGO_TOP);

    // Check for end of game
    if (ballStopped()) {
      bool won = inBasket();
      variables[0].setValue(won ? 1 : 0);
      if (won)
        bvState = BV_WON;
      else
        bvState = BV_LOST;
      counter.start();
    }

    // Ensure gravity doesn't overcome the bounce decay
    if (inBasket()) {
        // Once the logo enters the basket, don't let it bounce out
        float newYPos = GRAVITY + logoVelocityY + logoY + LOGO_TOP;
        if (logoVelocityY < 1 && BASKET_BOT - logoY < LOGO_TOP + 5) {
            logoVelocityY = 0;
            logoVelocityX = 0;
            logoY = BASKET_BOT - LOGO_TOP;
        }
        else if (BASKET_TOP < newYPos && newYPos < BASKET_BOT)
            logoVelocityY += GRAVITY;
        else if (newYPos  > BASKET_BOT)
            logoVelocityY = BASKET_BOT - logoY - LOGO_TOP;
        else
            logoVelocityY = BASKET_TOP - logoY - LOGO_TOP;
    }
    else {
        if (GRAVITY + logoVelocityY + logoY + LOGO_TOP < FLOOR)
            logoVelocityY += GRAVITY;
        else
            logoVelocityY = FLOOR - logoY - LOGO_TOP;
    }


    #ifdef PENJIN_FIXED
        logoY += fixedpoint::fix2int(logoVelocityY);
        logoX += fixedpoint::fix2int(logoVelocityX);
    #else
        logoY += logoVelocityY;
        logoX += logoVelocityX;
    #endif

    logo.setPosition(logoX - LOGO_SIDE, logoY - LOGO_TOP);
    return;
  }


  if(bvState == BV_LOST) {
    if(pwned) {
        bounce.loadSound("music/BadVista/chimes.ogg");
        bounce.play();

        backsound.stop();
        backsound.loadMusic("music/BadVista/pp.bv.windows.e.egg.ogg");
        backsound.setLooping(false);
        backsound.play();

        if (pwned_count < PWNED_PWNED)
            loserBackground.loadSprite("images/BadVista/stopped.jpg");
        else
            loserBackground.loadSprite("images/BadVista/lost.png");

        bvState = BV_PWNED;
    }
    else
        if(counter.getScaledTicks() > END_DELAY)
            setNextState(STATE_MAIN);
  }

  if(bvState == BV_WON) {
    if(counter.getScaledTicks() > END_DELAY)
        setNextState(STATE_MAIN);
  }

  if(bvState == BV_PWNED) {
    if(counter.getScaledTicks() > LOSER_DELAY && !backsound.isPlaying())
      setNextState(STATE_MAIN);
  }
}