diff options
Diffstat (limited to 'examples/cocoa/CocoaAppDelegate.mm')
-rw-r--r-- | examples/cocoa/CocoaAppDelegate.mm | 241 |
1 files changed, 241 insertions, 0 deletions
diff --git a/examples/cocoa/CocoaAppDelegate.mm b/examples/cocoa/CocoaAppDelegate.mm new file mode 100644 index 0000000..ff1bc1e --- /dev/null +++ b/examples/cocoa/CocoaAppDelegate.mm @@ -0,0 +1,241 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2012 Marco Antognini (antognini.marco@gmail.com), +// Laurent Gomila (laurent.gom@gmail.com), +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#import "CocoaAppDelegate.h" +#import "NSString+stdstring.h" + +// These define are used for converting the color of the NSPopUpButton +#define BLUE @"Blue" +#define GREEN @"Green" +#define RED @"Red" + +// Our PIMPL +struct SFMLmainWindow +{ + SFMLmainWindow(sf::WindowHandle win) + : renderWindow(win) + , background(sf::Color::Blue) + { + std::string resPath = [[[NSBundle mainBundle] resourcePath] tostdstring]; + if (!logo.loadFromFile(resPath + "/logo.png")) { + NSLog(@"Couldn't load the logo image"); + } + + logo.setSmooth(true); + + sprite.setTexture(logo, true); + sf::FloatRect rect = sprite.getLocalBounds(); + sf::Vector2f size(rect.width, rect.height); + sprite.setOrigin(size / 2.f); + sprite.scale(0.3, 0.3); + + unsigned int ww = renderWindow.getSize().x; + unsigned int wh = renderWindow.getSize().y; + sprite.setPosition(sf::Vector2f(ww, wh) / 2.f); + + if (!font.loadFromFile(resPath + "/sansation.ttf")) { + NSLog(@"Couldn't load the font"); + } + + text.setColor(sf::Color::White); + text.setFont(font); + } + + sf::RenderWindow renderWindow; + sf::Font font; + sf::Text text; + sf::Texture logo; + sf::Sprite sprite; + sf::Color background; +}; + +// Private stuff +@interface CocoaAppDelegate () + +@property (assign) SFMLmainWindow *mainWindow; +@property (retain) NSTimer *renderTimer; +@property (assign) BOOL visible; + +@property (assign) BOOL initialized; + +-(void)renderMainWindow:(NSTimer *)aTimer; + +@end + + +// Finally, the implementation +@implementation CocoaAppDelegate + +@synthesize window = m_window; +@synthesize sfmlView = m_sfmlView; +@synthesize textField = m_textField; + +@synthesize mainWindow = m_mainWindow; +@synthesize renderTimer = m_renderTimer; +@synthesize visible = m_visible; + +@synthesize initialized = m_initialized; + +- (id)init { + self = [super init]; + if (self) { + self.initialized = NO; + } + return self; +} + +-(void)applicationDidFinishLaunching:(NSNotification *)aNotification +{ + if (!self.initialized) + { + // Init the SFML render area. + self.mainWindow = new SFMLmainWindow(self.sfmlView); + self.mainWindow->text.setString([self.textField.stringValue tostdwstring]); + self.visible = YES; + + // Launch the timer to periodically display our stuff into the Cocoa view. + self.renderTimer = [NSTimer timerWithTimeInterval:1.f/60.f + target:self + selector:@selector(renderMainWindow:) + userInfo:nil + repeats:YES]; + [[NSRunLoop mainRunLoop] addTimer:self.renderTimer + forMode:NSDefaultRunLoopMode]; + [[NSRunLoop mainRunLoop] addTimer:self.renderTimer + forMode:NSEventTrackingRunLoopMode]; + /* + * This is really some ugly code but in order to have the timer fired + * periodically we need to add it to the two above runloop mode. + * + * The default mode allows timer firing while the user doesn't do anything + * while the second mode allows timer firing while he is using a slider + * or a menu. + */ + + self.initialized = YES; + } +} + +-(void)dealloc +{ + [self.renderTimer invalidate]; + self.mainWindow->renderWindow.close(); + + self.window = nil; + self.sfmlView = nil; + self.textField = nil; + + delete (SFMLmainWindow *) self.mainWindow; + self.mainWindow = 0; + self.renderTimer = nil; + + [super dealloc]; +} + +-(void)renderMainWindow:(NSTimer *)aTimer +{ + // Scaling + /* /!\ we do this at 60fps so choose low scaling factor! /!\ */ + if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up)) + { + self.mainWindow->sprite.scale(1.01f, 1.01f); + } + if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down)) + { + self.mainWindow->sprite.scale(0.99f, 0.99f); + } + + // Clear the window, display some stuff and display it into our view. + + self.mainWindow->renderWindow.clear(self.mainWindow->background); + + if (self.visible) + { + self.mainWindow->renderWindow.draw(self.mainWindow->sprite); + } + + self.mainWindow->renderWindow.draw(self.mainWindow->text); + + self.mainWindow->renderWindow.display(); +} + +-(IBAction)colorChanged:(NSPopUpButton *)sender +{ + if (self.initialized) + { + // Convert title to color + NSString *color = [[sender selectedItem] title]; + if ([color isEqualToString:BLUE]) + { + self.mainWindow->background = sf::Color::Blue; + } + else if ([color isEqualToString:GREEN]) + { + self.mainWindow->background = sf::Color::Green; + } + else + { + self.mainWindow->background = sf::Color::Red; + } + } +} + +-(IBAction)rotationChanged:(NSSlider *)sender +{ + if (self.initialized) + { + float angle = [sender floatValue]; + self.mainWindow->sprite.setRotation(angle); + } +} + +-(IBAction)visibleChanged:(NSButton *)sender +{ + if (self.initialized) + self.visible = [sender state] == NSOnState; +} + +-(IBAction)textChanged:(NSTextField *)sender +{ + if (self.initialized) + self.mainWindow->text.setString([[sender stringValue] tostdwstring]); +} + +- (IBAction)updateText:(NSButton *)sender +{ + // Simply simulate textChanged : + [self textChanged:self.textField]; +} + +@end + +@implementation SilentWindow + +-(void)keyDown:(NSEvent *)theEvent +{ + // Do nothing except preventing this alert. +} + +@end |