void cCamera::Update(bool keys[],int mouseX,int mouseY, object *plane)
{
	float angle;
	float alfa;
	Map = plane;
	if(mouseX!=middleX)
	{
		angle = (middleX - mouseX) / 50.0f;
		RotateY(angle);
	}
	if(mouseY!=middleY)
	{
		angle = (middleY - mouseY) / 50.0f;
		RotateX(angle);
	}

	if (keys['w'])		MoveForwards(-speed);
	if (keys['s'])		MoveForwards(speed);
	if (keys['a'])		StrafeRight(-speed);
	if (keys['d'])		StrafeRight(speed);
	if (keys[' '])		Jump();


	// JUMP & GRAVITY
	if (jumping)
	{
		jump_alfa += JUMP_STEP;

		if (jump_alfa == 180)
		{
			jumping = false;
			Position.y = jump_y;
		}
		else
		{
			alfa = ((float)jump_alfa) * 0.017453f;
			Position.y = jump_y + (int)(((float)JUMP_HEIGHT) * sin(alfa));

			if (jump_alfa > 90)
			{
				//Over floor?
				jumping = !CollidesMap(GetCollider(), Map);
			}
		}
	}
	else
	{
		//Over floor?
		if (!CollidesMap(GetCollider(), Map))
			Position.y -= (2 * speed);
	}


}
void cCamera::Jump()
{
	if (!jumping)
	{
		if (CollidesMap(GetCollider(), Map))
		{
			jumping = true;
			jump_alfa = 0;
			jump_y = Position.y;
		}
	}
		
}
void cCamera::StrafeRight ( GLfloat distance )
{
	if (ViewDirChanged) GetViewDir();
	cVector3D MoveVector;
	MoveVector.z = -ViewDir.x * -distance;
	MoveVector.y = 0.0;
	MoveVector.x = ViewDir.z * -distance;

	if (CollidesMap(GetCollider(), Map))
		MoveVector.y = 0;
	else
		MoveVector.y = -1;
	Position.Add(MoveVector);
}
void cCamera::MoveForwards( GLfloat distance )
{
	bool col;
	if (ViewDirChanged) GetViewDir();
	cVector3D MoveVector;
	MoveVector.x = ViewDir.x * -distance;
	MoveVector.y = ViewDir.y * -distance;
	MoveVector.z = ViewDir.z * -distance;
	
	if (CollidesMap(GetCollider(), Map))
		MoveVector.y = 0;
	else
		MoveVector.y = -1;
	Position.Add(MoveVector);
}
void cCamera::Folk(GLfloat distance)
{
	cVector3D MoveVector;
	MoveVector.x = 0.0;
	MoveVector.y = 1.0 * distance;
	MoveVector.z = 0.0;
	
	if (CollidesMap(GetCollider(), Map))
	{
		onFloor = true;
	}
	else
	{
		Position.Add(MoveVector);
	}
}
Example #6
0
bool cBicho::Move(const cMap& map, Direction dir, int sceneX, int sceneY) {
    if (IsDying() || IsDead()) {
        return false;
    }
	float &axis = (dir == Direction::Left || dir == Direction::Right) ? x : y;
	int mult = 1;
	bool canMove = true;
	if (dir == Direction::Left || dir == Direction::Down) {
		mult = -1;
	}
	// What's next tile
	if (int(axis) % TILE_SIZE == 0) {
		float aux = axis;
		axis += stepLength * mult;
		if (ReachesMapLimit(map, sceneX, sceneY)) {
			canMove = ReachLimit(dir);
			axis = aux;
		} else if (CollidesMap(map)) {
			axis = aux;
			state = State::Look;
			canMove = false;
		}
	} else {
		// Advance
		axis += stepLength * mult;
	}
	// Always set direction
	direction = dir;
	if (canMove && state != State::Walk) {
		state = State::Walk;
	}
    // Calculate if entering DungeonDoor from below.
    int cellx = x/TILE_SIZE;
    int celly = y/TILE_SIZE;
    if (!ReachesMapLimit(map, sceneX, sceneY) && map.DungeonDoor(cellx, celly)) {
        InDungeonDoor();
    }


	return canMove;
}