#include "Kamera.h"
#include "..\Karte\Karte.h"
#include <Punkt.h>
#include <Rahmen.h>

// Inhalt der Kamera Klasse aus Kamera.h
// Konstruktor
Kamera::Kamera()
{
	pos = Punkt( 0, 0 );
	gr = Punkt( 0, 0 );
	rGr =  Punkt( 0, 0 );
	rahmen = new LRahmen();
	rahmen->setFarbe( 0xFF505050 );
	rahmen->setRamenBreite( 1 );
	ref = 1;
}

// Destruktor
Kamera::~Kamera()
{
	rahmen->release();
}

// nicht constant
void Kamera::setPosition( int x, int y )
{
	pos.x = x;
	pos.y = y;
}

void Kamera::addPosition( int x, int y, Karte *zMap )
{
	pos.x += x;
	pos.y += y;
	if( pos.x < 0 )
		pos.x = 0;
	if( pos.y < 0 )
		pos.y = 0;
	if( pos.x > zMap->getBreite() )
		pos.x = zMap->getBreite();
	if( pos.y > zMap->getHeight() )
		pos.y = zMap->getHeight();
}

void Kamera::setSize( int br, int h� )
{
	gr.x = br;
	gr.y = h�;
}

void Kamera::render( Bild &zRObj )
{
	rGr = zRObj.getSize();
	rahmen->setPosition( getRX( getLinks() ), getRY( getOben() ) );
	rahmen->setSize( gr );
	rahmen->render( zRObj );
}

// constant
int Kamera::getLinks() const
{
	return pos.x - (int)( gr.x / 2.0 + 0.5 );
}

int Kamera::getOben() const
{
	return pos.y - gr.y / 2;
}

int Kamera::getRechts() const
{
	return pos.x + gr.x / 2;
}

int Kamera::getUnten() const
{
	return pos.y + gr.y / 2;
}

bool Kamera::istSichtbar( int x, int y ) const
{
	return ( x >= getLinks() && x < getRechts() && y >= getOben() && y < getUnten() );
}

bool Kamera::istMausIn( int x, int y ) const
{
	return ( x >= ( rGr.x / 2 - gr.x / 2 ) && x < ( rGr.x / 2 + gr.x / 2 ) && y >= ( rGr.y / 2 - gr.y / 2 ) && y < ( rGr.y / 2 + gr.y / 2 ) );
}

int Kamera::getRX( int mapX ) const
{
	return rGr.x / 2 - ( pos.x - mapX );
}

int Kamera::getRY( int mapY ) const
{
	return rGr.y / 2 - ( pos.y - mapY );
}

int Kamera::getX() const
{
	return pos.x;
}

int Kamera::getY() const
{
	return pos.y;
}

// Reference Counting
Kamera *Kamera::getThis()
{
	ref++;
	return this;
}

Kamera *Kamera::release()
{
	ref--;
	if( !ref )
		delete this;
	return 0;
}