Example #1
0
void EnnemyDog::update(GameScene *scene, double delta, Keys keys){
    if (state() == DEAD){
		return;
	}
	animationTime_ += delta;


	/* Update the enemi animation. */
	AnimationState new_state = get_animation_state(animationFrames_);

	if (state_ != new_state) {
		state_ = new_state;
		animationIndex_ = 0;
	}
	else if (animationTime_ >= ANIMATION_INTERVAL) {
		animationTime_ -= ANIMATION_INTERVAL;
	
		animationIndex_ = (animationIndex_ + 1) % 2;
}

	process_gravity(delta);
}
Example #2
0
int main(int, char**)
{
	// Timing
	unsigned int lastUpdate;
	unsigned int thisUpdate;
	unsigned int dt = 0;

	// FPS
	int frames = 0;
	int fps = 0;
	int lastFPSUpdate;

	// Pixel buffer
	PixelBuffer pixelBuffer(width, height);

	// SDL structures
	SDL_Event event;
	SDL_Window* window;
	SDL_Renderer* renderer;
	SDL_Texture* renderTexture;

	// Seed random number generator
	srand((unsigned int)time(0));

	// Initialise SDL
	SDL_Init(SDL_INIT_EVERYTHING);

	// Initilialise timing
	lastUpdate = thisUpdate = SDL_GetTicks();
	lastFPSUpdate = lastUpdate;

	// Create window
	window = createWindow(TITLE_FORMAT, width, height);

	// Create renderer
	renderer = createRenderer(window);

	// Create render texture
	renderTexture = createTexture(renderer, width, height);

	// Set window values
    //int width  = INITIAL_WIDTH;
    //int height = INITIAL_HEIGHT;

	// Create and initialise managers
	BallManager ballManager(width, height);

	// Create some balls
	ballManager.createBalls(INITIAL_BALLS);

	// Start main loop
	bool running = true;
	bool rendering_enabled = true;
    bool movement_enabled  = true;

	while (running)
	{
		const SDL_Rect screenRect = {0, 0, width, height};

		// Update timer
		thisUpdate = SDL_GetTicks();
		dt = thisUpdate - lastUpdate;

		// Handle all events
		while (SDL_PollEvent(&event))
		{
			// End when the user closes the window or presses esc
			if (event.type == SDL_QUIT ||
				(event.type == SDL_KEYDOWN && event.key.keysym.scancode == SDL_SCANCODE_ESCAPE))
			{
				running = false;
			}

			// Handle keyboard input
			if (event.type == SDL_KEYDOWN)
			{
				// Toggle rendering when player presses R
				if (event.key.keysym.sym == SDLK_r)
				{
					// Disable rendering
					rendering_enabled = !rendering_enabled;

					// Clear screen to white
                    pixelBuffer.clear(0xFFFFFFFF);

					// Update render texture
					SDL_UpdateTexture(renderTexture, &screenRect, pixelBuffer.getBuffer(), width * 4);

					// Render texture to screen
					SDL_RenderCopy(renderer, renderTexture, &screenRect, &screenRect);

					// Flip screen buffer
					SDL_RenderPresent(renderer);
				}
				// Toggle movement when player presses M
				else if (event.key.keysym.sym == SDLK_m)
				{
                    movement_enabled = !movement_enabled;
				}
				// Add 10 balls when user presses right arrow
				else if (event.key.keysym.scancode == SDL_SCANCODE_RIGHT)
				{
					ballManager.createBalls(100);
				}
				// Remove 10 balls when user presses left arrow
				else if (event.key.keysym.scancode == SDL_SCANCODE_LEFT)
				{
					ballManager.destroyBalls(100);
				}
			}
		}

		// Update game
        float delta = dt*GAME_SPEED;

        if(movement_enabled)
        {
            process_collisions(width, height, ballManager.balls());
            process_movement(delta, ballManager.balls());
            process_gravity(delta, ballManager.balls());
        }

        // Clear window
        SDL_RenderClear(renderer);

		if (rendering_enabled)
		{
			// Clear buffer
            pixelBuffer.clear(CLEAR_COLOUR);

			// Run rendering system
            process_rendering(&pixelBuffer, ballManager.balls());

			// Blit buffer to screen renderer
			SDL_UpdateTexture(renderTexture, &screenRect, pixelBuffer.getBuffer(), width * 4);

			// Render texture to screen
			SDL_RenderCopy(renderer, renderTexture, &screenRect, &screenRect);

			// Flip screen buffer
			SDL_RenderPresent(renderer);
		}

		// Update last time
		lastUpdate = thisUpdate;

		// Average FPS calculations
		frames++;
		if (thisUpdate - lastFPSUpdate >= 1000)
		{
			// Update FPS counters
			fps = frames;
			frames = 0;
			lastFPSUpdate = thisUpdate;
		}

		// Update window title
		{
			const int titleBufferLen = 256;
			char titleBuffer[titleBufferLen];

			// Format window title
			const char* renderingEnabled = (rendering_enabled ? "Enabled" : "Disabled");
			const char* movementEnabled = (true ? "Enabled" : "Disabled");
			snprintf(titleBuffer, titleBufferLen, TITLE_FORMAT, ballManager.ballCount(), fps, renderingEnabled, movementEnabled);

			// Set window title
			SDL_SetWindowTitle(window, titleBuffer);
		}
	}

	// Clean up
	SDL_DestroyRenderer(renderer);
	SDL_DestroyWindow(window);
	SDL_Quit();

	return 0;
}
Example #3
0
void Player::update(GameScene *scene, double delta, Keys keys) {
	animationTime_ += delta;

    /* Update movement according to keys pressed. */
    keys_ = keys;
    if (!(keys & KEY_DOWN) && keys & KEY_RIGHT) {
		velocity_ += (Vector2((keys & KEY_DASH) ? DASH_ACCEL : WALK_ACCEL, 0) * delta);
	} else if (velocity_.x > 0) {
        velocity_ += velocity_ < (Vector2(WALK_FRICTION, 0) * delta)
            ? -velocity_ 
            : (Vector2(-WALK_FRICTION, 0) * delta);
    }

    if (!(keys & KEY_DOWN) && keys & KEY_LEFT) {
		velocity_ -= (Vector2((keys & KEY_DASH) ? DASH_ACCEL : WALK_ACCEL, 0) * delta);
	} else if (velocity_.x < 0) {
        velocity_ -= velocity_ < (Vector2(WALK_FRICTION, 0) * delta)
            ? velocity_ 
            : (Vector2(-WALK_FRICTION, 0) * delta);
    }

    /* Use abilities */
    if (sneakingAbility_)
        sneakingAbility_->use(scene, this, keys);
    if (jumpingAbility_)
        jumpingAbility_->use(scene, this, keys);
    if (sprintingAbility_)
        sprintingAbility_->use(scene, this, keys);
    if (splashingAbility_)
        splashingAbility_->use(scene, this, keys);
    if (duckingAbility_)
        duckingAbility_->use(scene, this, keys);

    /* Check player at end of level? */
    if (scene->level()->is_end_game_right() == 
        position_.x > scene->level()->end_game_x()) {
        scene->state(GameScene::REACHED_END);
        return;
    }

    if (scene->level()->bottom_y() < position_.y)
    {
        state(Actor::DEAD);
        scene->state(GameScene::PLAYER_DEAD);
    }
    if (velocity_.x != 0.00)
        isLastMovementLeft_ = velocity_.x < 0;

    /* Process science */
    process_gravity(delta);
	velocity_.truncate_x((keys & KEY_DASH) ? DASH_SPEED : WALK_SPEED);


    /* Update the player animation. */
    AnimationState new_state = get_animation_state(animationFrames_);

    if (state_ != new_state) {
        state_ = new_state;
        animationIndex_ = 0;
    }
    else if (animationTime_ >= ANIMATION_INTERVAL) {
        animationTime_ -= ANIMATION_INTERVAL;

        /* Limit the animation index to the number of available frames.
         * The number of available frames is calcuated according to the 
         * following table: 
         * 
         * animationFrames_ | number of available frames
         * -----------------+---------------------------
         * 1                | 1
         * 2                | 2
         * 3                | 4
         * 4                | 6
         * 5                | 8
         * ...
         *
         * We need this number of available frames to go back and forth trough
         * all the frames, (0, 1, 2, 1, 0, 1, 2, ...) instead of looping trough
         * the frames (0, 1, 2, 0, 1, 2, ...).
         */
        int available_frames = animationFrames_ > 2 
            ? animationFrames_ * 2 - 2 
            : animationFrames_;

        animationIndex_ = (animationIndex_ + 1) % available_frames;
    }
}