#include "Kamera.h" #include "../Karte/Karte.h" // Inhalt der Kamera Klasse aus Kamera.h // Konstruktor Kamera::Kamera() { pos = Punkt( 0, 0 ); mmr.setFarbe( 0xFFFFFFFF ); mmr.setRamenBreite( 1 ); ref = 1; } // nicht constant void Kamera::setPosition( int x, int y ) { pos = Punkt( x, y ); } void Kamera::addPosition( int x, int y, Karte *zMap ) { pos += Punkt( x, y ); if( zMap ) { if( pos.x < 0 ) pos.x += zMap->getSize().x; if( pos.y < 0 ) pos.y += zMap->getSize().y; if( pos.x >= zMap->getSize().x ) pos.x -= zMap->getSize().x; if( pos.y >= zMap->getSize().y ) pos.y -= zMap->getSize().y; } } bool Kamera::beginnRender( Bild &zRObj, Karte *zMap, int n ) { Punkt kamLO( pos.x - zRObj.getBreite() / 2, pos.y - zRObj.getHeight() / 2 ); Punkt kamRU( pos.x + zRObj.getBreite() / 2, pos.y + zRObj.getHeight() / 2 ); Punkt mapGr = zMap->getSize(); int c = 0; if( kamLO.x < 0 ) c |= 1; if( kamLO.y / 2 < 0 ) c |= 2; if( kamRU.x > mapGr.x ) c |= 4; if( kamRU.y > mapGr.y ) c |= 8; switch( c ) { case 0: if( n ) return 0; if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) ) return 0; zRObj.addScrollOffset( kamLO.x, kamLO.y ); break; case 1: if( n > 1 ) return 0; if( !n ) { if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) ) return 0; zRObj.addScrollOffset( kamLO.x + zMap->getSize().x, kamLO.y ); } if( n == 1 ) { if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) ) return 0; zRObj.addScrollOffset( kamLO.x, kamLO.y ); } break; case 2: if( n > 1 ) return 0; if( !n ) { if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) ) return 0; zRObj.addScrollOffset( kamLO.x, kamLO.y + mapGr.y ); } if( n == 1 ) { if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) ) return 0; zRObj.addScrollOffset( kamLO.x, kamLO.y ); } break; case 3: if( n > 3 ) return 0; if( !n ) { if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) ) return 0; zRObj.addScrollOffset( kamLO.x + mapGr.x, kamLO.y + mapGr.y ); } if( n == 1 ) { if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) ) return 0; zRObj.addScrollOffset( kamLO.x + mapGr.x, kamLO.y ); } if( n == 2 ) { if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) ) return 0; zRObj.addScrollOffset( kamLO.x, kamLO.y + mapGr.y ); } if( n == 3 ) { if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) ) return 0; zRObj.addScrollOffset( kamLO.x, kamLO.y ); } break; case 4: if( n > 1 ) return 0; if( !n ) { if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) ) return 0; zRObj.addScrollOffset( kamLO.x, kamLO.y ); } if( n == 1 ) { if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) ) return 0; zRObj.addScrollOffset( kamLO.x - mapGr.x, kamLO.y ); } break; case 6: if( n > 3 ) return 0; if( !n ) { if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) ) return 0; zRObj.addScrollOffset( kamLO.x, kamLO.y + mapGr.y ); } if( n == 1 ) { if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) ) return 0; zRObj.addScrollOffset( kamLO.x - mapGr.x, kamLO.y + mapGr.y ); } if( n == 2 ) { if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) ) return 0; zRObj.addScrollOffset( kamLO.x - mapGr.x, kamLO.y ); } if( n == 3 ) { if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) ) return 0; zRObj.addScrollOffset( kamLO.x, kamLO.y ); } break; case 8: if( n > 1 ) return 0; if( !n ) { if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) ) return 0; zRObj.addScrollOffset( kamLO.x, kamLO.y ); } if( n == 1 ) { if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) ) return 0; zRObj.addScrollOffset( kamLO.x, kamLO.y - mapGr.y ); } break; case 9: if( n > 3 ) return 0; if( !n ) { if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) ) return 0; zRObj.addScrollOffset( kamLO.x + mapGr.x, kamLO.y ); } if( n == 1 ) { if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) ) return 0; zRObj.addScrollOffset( kamLO.x + mapGr.x, kamLO.y - mapGr.y ); } if( n == 2 ) { if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) ) return 0; zRObj.addScrollOffset( kamLO.x, kamLO.y - mapGr.y ); } if( n == 3 ) { if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) ) return 0; zRObj.addScrollOffset( kamLO.x, kamLO.y ); } break; case 12: if( n > 3 ) return 0; if( !n ) { if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) ) return 0; zRObj.addScrollOffset( kamLO.x, kamLO.y ); } if( n == 1 ) { if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) ) return 0; zRObj.addScrollOffset( kamLO.x, kamLO.y - mapGr.y ); } if( n == 2 ) { if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) ) return 0; zRObj.addScrollOffset( kamLO.x - mapGr.x, kamLO.y ); } if( n == 3 ) { if( !zRObj.setDrawOptions( 0, 0, zRObj.getBreite(), zRObj.getHeight() ) ) return 0; zRObj.addScrollOffset( kamLO.x - mapGr.x, kamLO.y - mapGr.y ); } break; } return 1; } void Kamera::endRender( Bild &zRObj ) { zRObj.releaseDrawOptions(); } void Kamera::beginnMinimap( Bild &zRObj, Karte *zMap ) { zRObj.setDrawOptions( zRObj.getBreite() - 260, zRObj.getHeight() - 260, 250, 250 ); zRObj.drawLinieH( 0, 0, 250, 0xFFFFFFFF ); zRObj.drawLinieH( 0, 249, 250, 0xFFFFFFFF ); zRObj.drawLinieV( 0, 0, 250, 0xFFFFFFFF ); zRObj.drawLinieV( 249, 0, 250, 0xFFFFFFFF ); mmr.setSize( (int)( ( zRObj.getBreite() / (double)zMap->getSize().x ) * 250 + 0.5 ), (int)( ( zRObj.getHeight() / (double)zMap->getSize().y ) * 250 + 0.5 ) ); mmr.setPosition( (int)( ( pos.x / (double)zMap->getSize().x ) * 250 + 0.5 ), (int)( ( pos.y / (double)zMap->getSize().y ) * 250 + 0.5 ) ); mmr.setPosition( mmr.getPosition() - mmr.getSize() / 2 ); mmr.render( zRObj ); if( mmr.getX() < 0 ) mmr.setPosition( mmr.getPosition() + Punkt( 250, 0 ) ); mmr.render( zRObj ); if( mmr.getY() < 0 ) mmr.setPosition( mmr.getPosition() + Punkt( 0, 250 ) ); if( mmr.getX() >= 250 - mmr.getBreite() ) mmr.setPosition( mmr.getPosition() - Punkt( 250, 0 ) ); mmr.render( zRObj ); if( mmr.getY() >= 250 - mmr.getHeight() ) mmr.setPosition( mmr.getPosition() - Punkt( 0, 250 ) ); mmr.render( zRObj ); } void Kamera::endMinimap( Bild &zRObj ) { zRObj.releaseDrawOptions(); } // constant Punkt Kamera::getPos() const { return pos; } // Reference Counting Kamera *Kamera::getThis() { ref++; return this; } Kamera *Kamera::release() { ref--; if( !ref ) delete this; return 0; }