├── .gitignore ├── README ├── compile ├── curlable ├── install ├── package.json ├── src └── NodeSFML.cc ├── test ├── a.out ├── buildstraight.sh ├── file ├── straight_cpp.cc ├── test.js ├── test.png └── test.wav └── wscript /.gitignore: -------------------------------------------------------------------------------- 1 | deps 2 | lib 3 | build 4 | .lock-wscript 5 | -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- 1 | SFML Bindings for Node: 2 | 3 | Building: 4 | 5 | node-waf configure build 6 | 7 | Requires: 8 | 9 | SFML Shared Libraries (http://www.sfml-dev.org/download.php) 10 | OpenAL Shared Library (http://connect.creativelabs.com/openal/default.aspx, or http://kcat.strangesoft.net/openal.html) 11 | libsndfile Shared Libary (http://www.mega-nerd.com/libsndfile/) 12 | 13 | Usage: 14 | 15 | var sfml = require('nodesfml') 16 | var music = new sfml.Music() 17 | var window = new sfml.RenderWindow(sfml.VideoMode.GetDesktopMode(),"my title") 18 | 19 | Status (operator overloading is not supported in v8, so manual checks for equality will be required): 20 | * 100% 21 | please report and missing features except operator overloads) 22 | * In Progress 23 | Some supported methods, but not complete (may require other features that are not 100%) 24 | * Delayed 25 | To be done after all In Progress (may be upgraded if enough tickets arise) 26 | 27 | sf::Color - 100% 28 | 29 | sf::Image - In Progress 30 | * Constructors working except from ptr 31 | * SetPixel / GetPixel working 32 | * SaveToFile / LoadFromFile working 33 | 34 | sf::Sprite - In Progress 35 | * Constructors Working 36 | * GetPixel working 37 | 38 | sf::Joy - In Progress 39 | sf::Key - In Progress 40 | 41 | sf::Mouse::Buttons - 100% 42 | sf::Music - 100% 43 | 44 | sf::RenderWindow - Delayed 45 | * Constructors working 46 | * Clear 47 | * Close 48 | * Display 49 | * Draw 50 | * GetHeight 51 | * GetWidth 52 | * IsOpened 53 | 54 | sf::Sound::Status - 100% 55 | sf::Style - 100% 56 | sf::VideoMode - 100% 57 | -------------------------------------------------------------------------------- /compile: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | echo "Building node-sfml" 3 | `node-waf configure build` 4 | if [ ! -e "./lib" ] ; then 5 | mkdir lib 6 | fi 7 | cp build/default/* lib/ 8 | -------------------------------------------------------------------------------- /curlable: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | echo "Downloading node-sfml source" 3 | git clone http://github.com/bmeck/node-sfml 4 | pushd node-sfml 5 | if [ ! `which npm` = "" ] ; then 6 | echo "npm found, installing to npm" 7 | npm install . 8 | else 9 | sh install 10 | fi 11 | popd 12 | -------------------------------------------------------------------------------- /install: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | echo "Automated SFML Installer from source..." 3 | platform='unknown' ; 4 | unamestr=`uname` ; 5 | if [ "$unamestr" = 'Linux' ] ; then 6 | platform='linux' ; 7 | elif [ "$unamestr" = 'FreeBSD' ]; then 8 | platform='freebsd' ; 9 | elif [ "$unamestr" = 'Darwin' ]; then 10 | platform='darwin' ; 11 | fi 12 | echo "OS: $platform" 13 | #not used for now 14 | processor='unknown' ; 15 | unamestr=`uname -m` 16 | if [ "$unamestr" = 'i686' ] ; then 17 | processor='x86' ; 18 | elif [ "$unamestr" = 'x86_64' ] ; then 19 | processor='x86_64' ; 20 | fi 21 | echo "PROCESSOR: $processor" 22 | 23 | if [ ! -e "./deps" ] ; then 24 | echo "Making deps directory..." 25 | mkdir "deps" 26 | fi 27 | cd deps 28 | if [ "$platform" != 'darwin' ] ; then 29 | #openal 30 | if [ ! -e "./openalsoft" ] ; then 31 | echo "Downloading OpenALSoft source" 32 | `/usr/bin/curl -o "./openalsoft.tar.bz2" "http://kcat.strangesoft.net/openal-releases/openal-soft-1.12.854.tar.bz2"` 33 | `tar -xvf "openalsoft.tar.bz2"` 34 | rm ./*.tar.bz2 35 | mv openal-soft*/ openalsoft 36 | 37 | cd openalsoft/build 38 | echo "Making OpenALSoft" 39 | `cmake ..` 40 | `make` 41 | echo "Installing OpenALSoft" 42 | `sudo make install` 43 | cd ../.. 44 | else 45 | echo "OpenALSoft already exists, remove directory for a fresh compile" 46 | fi 47 | #libsndfile 48 | if [ ! -e "./libsndfile" ] ; then 49 | echo "Downloading libsndfile source" 50 | `/usr/bin/curl -o "libsndfile.tar.gz" "http://www.mega-nerd.com/libsndfile/files/libsndfile-1.0.21.tar.gz"` 51 | `tar -xvf "libsndfile.tar.gz"` 52 | rm ./*.tar.gz 53 | mv libsndfile*/ libsndfile 54 | 55 | cd libsndfile 56 | echo "Making libsndfile" 57 | `./configure` 58 | `make` 59 | echo "Installing libsndfile" 60 | `sudo make install` 61 | cd .. 62 | else 63 | echo "libsndfile already exists, remove directory for a fresh compile" 64 | fi 65 | fi 66 | #SFML 67 | if [ ! -e "./sfml" ] ; then 68 | echo "Downloading SFML source" 69 | `/usr/bin/svn checkout "http://sfml.svn.sourceforge.net/svnroot/sfml/tags/1.6" "sfml"` 70 | cd sfml 71 | 72 | 73 | if [ "$platform" != 'darwin' ] ; then 74 | echo "Installing External Frameworks" 75 | if [ "$processor" = 'x86_64' ] ; then 76 | sudo cp extlibs/bin/x86_64/* /Library/Frameworks 77 | else 78 | sudo cp extlibs/bin/OpenAL.framework /Library/Frameworks 79 | sudo cp extlibs/bin/libsndfile.framework /Library/Frameworks 80 | fi 81 | fi 82 | 83 | echo "Making SFML" 84 | `make` 85 | 86 | if [ "$platform" = 'darwin' ] ; then 87 | echo "Installing SFML Frameworks" 88 | if [ "$processor" = 'x86_64' ] ; then 89 | sudo cp lib64/* /Library/Frameworks 90 | else 91 | sudo cp lib/* /Library/Frameworks 92 | fi 93 | else 94 | echo "Installing SFML" 95 | `sudo make install` 96 | fi 97 | cd .. 98 | else 99 | echo "sfml already exists, remove directory for a fresh compile" 100 | fi 101 | cd .. 102 | echo "Building node-sfml" 103 | if [ -e "./build" ] ; then 104 | node-waf distclean 105 | fi 106 | node-waf configure build 107 | if [ ! -e "./lib" ] ; then 108 | mkdir lib 109 | fi 110 | cp ./build/default/nodesfml.node ./lib/ 111 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { "name" : "sfml" 2 | , "description" : "Node v8 Bindings for SFML" 3 | , "version" : "0.0.1" 4 | , "author" : 5 | { "name" : "bradley meck" 6 | , "email" : "bradley.meck@gmail.com" 7 | } 8 | , "engines" : [ "node >=0.1.102" ] 9 | , "repository" : 10 | { "type" : "git" 11 | , "url" : "http://github.com/bmeck/node-sfml.git" 12 | } 13 | , "directories" : {} 14 | , "main" : "lib/nodesfml.node" 15 | , "scripts" : { 16 | "preinstall" : "sh install" 17 | , "update" : "sh compile" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/NodeSFML.cc: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace v8; 3 | #include 4 | #include 5 | #include 6 | #include 7 | //TODO: make this work 8 | /* 9 | #include 10 | #include 11 | using namespace std; 12 | const std::Vector event_emitters = new std::Vector(); 13 | 14 | int Window_EventLoop(eio_req req) { 15 | bool valid; 16 | sf::Event evt; 17 | sf::Window* window; 18 | do { 19 | valid = false; 20 | for (vector::iterator it = event_emitters.begin(); it!=event_emitters.end(); ++it) { 21 | window = *it; 22 | if(window->IsOpened()) { 23 | valid = true; 24 | while(window->GetEvent(&evt)) { 25 | //emit the event 26 | } 27 | } 28 | } 29 | } while (valid); 30 | ev_unref(EV_DEFAULT_UC); 31 | return 0; 32 | } 33 | 34 | void EventLoop_addEventEmitter(sf::Window window) { 35 | if(event_emitters.empty()) { 36 | eio_custom(Window_EventLoop, EIO_PRI_DEFAULT, NULL, window); 37 | ev_ref(EV_DEFAULT_UC); 38 | } 39 | } 40 | */ 41 | //ENDTODO 42 | 43 | Persistent NodeSFMLMusicTemplate; 44 | void NodeSFMLMusicDispose(Persistent object, void* parameter) { 45 | ((sf::Music*)External::Unwrap(object->ToObject()->GetInternalField(0)))->sf::Music::~Music(); 46 | } 47 | Handle NodeSFMLMusic(const Arguments &args) { 48 | HandleScope scope; 49 | if(args.IsConstructCall()) { 50 | sf::Music* music = new sf::Music(args[0]->IsUndefined() ? 44100 : args[0]->IntegerValue()); 51 | Handle m = args.This(); 52 | m->SetInternalField(0,External::New(music)); 53 | Persistent::New(m).MakeWeak(NULL,NodeSFMLMusicDispose); 54 | return scope.Close(m); 55 | } 56 | else { 57 | return scope.Close(ThrowException(Exception::Error(String::New("Must use new operator")))); 58 | } 59 | } 60 | 61 | Handle NodeSFMLMusic_OpenFromFile(const Arguments &args) { 62 | HandleScope scope; 63 | 64 | Handle success = Boolean::New(((sf::Music*)External::Unwrap(args.Holder()->GetInternalField(0)))->OpenFromFile(*String::Utf8Value(args[0]))); 65 | return scope.Close(success); 66 | } 67 | 68 | //@Untested 69 | Handle NodeSFMLMusic_OpenFromMemory(const Arguments &args) { 70 | HandleScope scope; 71 | Handle success = False(); 72 | Handle buffer = args[0]; 73 | if(node::Buffer::HasInstance(buffer)) { 74 | node::Buffer* node_buffer = node::ObjectWrap::Unwrap(buffer->ToObject()); 75 | success = Boolean::New(((sf::Music*)External::Unwrap(args.Holder()->GetInternalField(0)))->OpenFromMemory( 76 | node_buffer->data(), node_buffer->length() 77 | )); 78 | } 79 | else { 80 | success = Boolean::New(((sf::Music*)External::Unwrap(args.Holder()->GetInternalField(0)))->OpenFromMemory( 81 | (char*)args[0]->IntegerValue(), args[1]->IntegerValue() 82 | )); 83 | } 84 | return scope.Close(success); 85 | } 86 | 87 | Handle NodeSFMLMusic_GetStatus(const Arguments &args) { 88 | HandleScope scope; 89 | Handle status = Number::New(((sf::Music*)External::Unwrap(args.Holder()->GetInternalField(0)))->GetStatus()); 90 | return scope.Close(status); 91 | } 92 | 93 | Handle NodeSFMLMusic_GetChannelsCount(const Arguments &args) { 94 | HandleScope scope; 95 | Handle channels = Number::New(((sf::Music*)External::Unwrap(args.Holder()->GetInternalField(0)))->GetChannelsCount()); 96 | return scope.Close(channels); 97 | } 98 | 99 | Handle NodeSFMLMusic_GetSampleRate(const Arguments &args) { 100 | HandleScope scope; 101 | Handle samples_per_second = Number::New(((sf::Music*)External::Unwrap(args.Holder()->GetInternalField(0)))->GetSampleRate()); 102 | return scope.Close(samples_per_second); 103 | } 104 | 105 | Handle NodeSFMLMusic_GetDuration(const Arguments &args) { 106 | HandleScope scope; 107 | Handle duration = Number::New(((sf::Music*)External::Unwrap(args.Holder()->GetInternalField(0)))->GetDuration()); 108 | return scope.Close(duration); 109 | } 110 | 111 | Handle NodeSFMLMusic_GetPlayingOffset(const Arguments &args) { 112 | HandleScope scope; 113 | Handle offset = Number::New(((sf::Music*)External::Unwrap(args.Holder()->GetInternalField(0)))->GetPlayingOffset()); 114 | return scope.Close(offset); 115 | } 116 | 117 | Handle NodeSFMLMusic_Play(const Arguments &args) { 118 | HandleScope scope; 119 | ((sf::Music*)External::Unwrap(args.Holder()->GetInternalField(0)))->Play(); 120 | return scope.Close(Undefined()); 121 | } 122 | 123 | Handle NodeSFMLMusic_GetLoop(const Arguments &args) { 124 | HandleScope scope; 125 | Handle is_looping = Boolean::New(((sf::Music*)External::Unwrap(args.Holder()->GetInternalField(0)))->GetLoop()); 126 | return scope.Close(is_looping); 127 | } 128 | Handle NodeSFMLMusic_SetLoop(const Arguments &args) { 129 | HandleScope scope; 130 | ((sf::Music*)External::Unwrap(args.Holder()->GetInternalField(0)))->SetLoop(args[0]->IsTrue()); 131 | return scope.Close(Undefined()); 132 | } 133 | 134 | Handle NodeSFMLMusic_Stop(const Arguments &args) { 135 | HandleScope scope; 136 | ((sf::Music*)External::Unwrap(args.Holder()->GetInternalField(0)))->Stop(); 137 | return scope.Close(Undefined()); 138 | } 139 | 140 | Handle NodeSFMLMusic_Pause(const Arguments &args) { 141 | HandleScope scope; 142 | ((sf::Music*)External::Unwrap(args.Holder()->GetInternalField(0)))->Pause(); 143 | return scope.Close(Undefined()); 144 | } 145 | 146 | 147 | Persistent NodeSFMLVideoModeTemplate; 148 | void NodeSFMLVideoModeDispose(Persistent object, void* parameter) { 149 | ((sf::VideoMode*)External::Unwrap(object->ToObject()->GetInternalField(0)))->sf::VideoMode::~VideoMode(); 150 | } 151 | 152 | Handle NodeSFMLVideoMode(const Arguments &args) { 153 | HandleScope scope; 154 | if(args.IsConstructCall()) { 155 | sf::VideoMode* video_mode; 156 | Handle vm = args.This(); 157 | if(args.Length() == 0) { 158 | video_mode = new sf::VideoMode(); 159 | } 160 | else { 161 | int bits_per_pixel = args[2]->IsUndefined() ? 32 : args[2]->IntegerValue(); 162 | video_mode = new sf::VideoMode(args[0]->IntegerValue(),args[1]->IntegerValue(),bits_per_pixel); 163 | } 164 | vm->SetInternalField(0,External::New(video_mode)); 165 | Persistent::New(vm).MakeWeak(NULL,NodeSFMLVideoModeDispose); 166 | return scope.Close(vm); 167 | } 168 | else { 169 | return scope.Close(ThrowException(Exception::Error(String::New("Must use new operator")))); 170 | } 171 | } 172 | 173 | Handle NodeSFMLVideoMode_IsValid(const Arguments &args) { 174 | HandleScope scope; 175 | Handle valid = Boolean::New(((sf::VideoMode*)External::Unwrap(args.Holder()->GetInternalField(0)))->IsValid()); 176 | return scope.Close(valid); 177 | } 178 | Handle NodeSFMLVideoMode_GetDesktopMode(const Arguments &args) { 179 | HandleScope scope; 180 | sf::VideoMode* video_mode = new sf::VideoMode(sf::VideoMode::GetDesktopMode()); 181 | Handle vm = NodeSFMLVideoModeTemplate->InstanceTemplate()->NewInstance(); 182 | vm->SetInternalField(0,External::New(video_mode)); 183 | Persistent::New(vm).MakeWeak(NULL,NodeSFMLVideoModeDispose); 184 | return scope.Close(vm); 185 | } 186 | Handle NodeSFMLVideoMode_GetMode(const Arguments &args) { 187 | HandleScope scope; 188 | sf::VideoMode* video_mode = new sf::VideoMode(sf::VideoMode::GetMode(args[0]->IntegerValue())); 189 | Handle vm = NodeSFMLVideoModeTemplate->InstanceTemplate()->NewInstance(); 190 | vm->SetInternalField(0,External::New(video_mode)); 191 | Persistent::New(vm).MakeWeak(NULL,NodeSFMLVideoModeDispose); 192 | return scope.Close(vm); 193 | } 194 | Handle NodeSFMLVideoMode_GetModesCount(const Arguments &args) { 195 | HandleScope scope; 196 | return scope.Close(Number::New(sf::VideoMode::GetModesCount())); 197 | } 198 | 199 | Handle NodeSFMLVideoMode__Getter_Width(Local property, const AccessorInfo& info) { 200 | HandleScope scope; 201 | Handle width = Number::New(((sf::VideoMode*)External::Unwrap(info.Holder()->GetInternalField(0)))->Width); 202 | return scope.Close(width); 203 | } 204 | void NodeSFMLVideoMode__Setter_Width(Local property, Local value, const AccessorInfo& info) { 205 | HandleScope scope; 206 | ((sf::VideoMode*)External::Unwrap(info.Holder()->GetInternalField(0)))->Width = value->IntegerValue(); 207 | scope.Close(value); 208 | } 209 | Handle NodeSFMLVideoMode__Getter_Height(Local property, const AccessorInfo& info) { 210 | HandleScope scope; 211 | Handle height = Number::New(((sf::VideoMode*)External::Unwrap(info.Holder()->GetInternalField(0)))->Height); 212 | return scope.Close(height); 213 | } 214 | void NodeSFMLVideoMode__Setter_Height(Local property, Local value, const AccessorInfo& info) { 215 | HandleScope scope; 216 | ((sf::VideoMode*)External::Unwrap(info.Holder()->GetInternalField(0)))->Height = value->IntegerValue(); 217 | scope.Close(value); 218 | } 219 | Handle NodeSFMLVideoMode__Getter_BitsPerPixel(Local property, const AccessorInfo& info) { 220 | HandleScope scope; 221 | Handle bits_per_pixel = Number::New(((sf::VideoMode*)External::Unwrap(info.Holder()->GetInternalField(0)))->BitsPerPixel); 222 | return scope.Close(bits_per_pixel); 223 | } 224 | void NodeSFMLVideoMode__Setter_BitsPerPixel(Local property, Local value, const AccessorInfo& info) { 225 | HandleScope scope; 226 | ((sf::VideoMode*)External::Unwrap(info.Holder()->GetInternalField(0)))->BitsPerPixel = value->IntegerValue(); 227 | scope.Close(value); 228 | } 229 | 230 | 231 | 232 | void NodeSFMLRenderWindowDispose(Persistent object, void* parameter) { 233 | ((sf::RenderWindow*)External::Unwrap(object->ToObject()->GetInternalField(0)))->sf::RenderWindow::~RenderWindow(); 234 | object.Dispose(); 235 | } 236 | 237 | Handle NodeSFMLRenderWindow(const Arguments &args) { 238 | HandleScope scope; 239 | if(args.IsConstructCall()) { 240 | sf::VideoMode* video_mode = static_cast(External::Unwrap(args[0]->ToObject()->GetInternalField(0))); 241 | char* title = args[1]->IsUndefined() ? (char*)"" : *String::Utf8Value(args[1]); 242 | int style = args[2]->IsUndefined() ? (sf::Style::Resize|sf::Style::Close) : args[2]->IntegerValue(); 243 | sf::RenderWindow* RenderWindow = new sf::RenderWindow( 244 | *video_mode 245 | , title 246 | , style 247 | ); 248 | args.This()->SetInternalField(0,External::New(RenderWindow)); 249 | Persistent::New(args.This()).MakeWeak(NULL,NodeSFMLRenderWindowDispose); 250 | return scope.Close(args.This()); 251 | } 252 | else { 253 | return scope.Close(ThrowException(Exception::Error(String::New("Must use new operator")))); 254 | } 255 | } 256 | 257 | Handle NodeSFMLRenderWindow_Close(const Arguments &args) { 258 | HandleScope scope; 259 | ((sf::RenderWindow*)External::Unwrap(args.Holder()->GetInternalField(0)))->Close(); 260 | return scope.Close(Undefined()); 261 | } 262 | 263 | Handle NodeSFMLRenderWindow_Display(const Arguments &args) { 264 | HandleScope scope; 265 | ((sf::RenderWindow*)External::Unwrap(args.Holder()->GetInternalField(0)))->Display(); 266 | return scope.Close(Undefined()); 267 | } 268 | 269 | Handle NodeSFMLRenderWindow_GetWidth(const Arguments &args) { 270 | HandleScope scope; 271 | Handle width = Number::New(((sf::RenderWindow*)External::Unwrap(args.Holder()->GetInternalField(0)))->GetHeight()); 272 | return scope.Close(width); 273 | } 274 | Handle NodeSFMLRenderWindow_GetHeight(const Arguments &args) { 275 | HandleScope scope; 276 | Handle height = Number::New(((sf::RenderWindow*)External::Unwrap(args.Holder()->GetInternalField(0)))->GetHeight()); 277 | return scope.Close(height); 278 | } 279 | Handle NodeSFMLRenderWindow_Draw(const Arguments &args) { 280 | HandleScope scope; 281 | sf::Sprite sprite = *((sf::Sprite*)args[0]->ToObject()->GetPointerFromInternalField(0)); 282 | const sf::Image* img = sprite.GetImage(); 283 | ((sf::RenderWindow*)External::Unwrap(args.Holder()->GetInternalField(0)))->Draw( 284 | sprite 285 | ); 286 | return scope.Close(Undefined()); 287 | } 288 | 289 | Handle NodeSFMLRenderWindow_Clear(const Arguments &args) { 290 | HandleScope scope; 291 | ((sf::RenderWindow*)External::Unwrap(args.Holder()->GetInternalField(0)))->Clear(); 292 | return scope.Close(Undefined()); 293 | } 294 | 295 | Handle NodeSFMLRenderWindow_IsOpened(const Arguments &args) { 296 | HandleScope scope; 297 | Handle is_opened = Boolean::New(((sf::RenderWindow*)External::Unwrap(args.Holder()->GetInternalField(0)))->IsOpened()); 298 | return scope.Close(is_opened); 299 | } 300 | 301 | 302 | void NodeSFMLColorDispose(Persistent object, void* parameter) { 303 | ((sf::Color*)object->ToObject()->GetPointerFromInternalField(0))->sf::Color::~Color(); 304 | } 305 | 306 | Persistent NodeSFMLColorTemplate; 307 | Persistent NodeSFMLColorTemplateInstanceTemplate; 308 | Handle NodeSFMLColor(const Arguments &args) { 309 | HandleScope scope; 310 | if(args.IsConstructCall()) { 311 | sf::Color* color; 312 | if(args.Length()) { 313 | color = new sf::Color(args[0]->IntegerValue(),args[1]->IntegerValue(),args[2]->IntegerValue(),args[3]->IntegerValue()); 314 | } 315 | else { 316 | color = new sf::Color(); 317 | } 318 | args.This()->SetPointerInInternalField(0,color); 319 | //Persistent::New(args.This()).MakeWeak(NULL,NodeSFMLColorDispose); 320 | return scope.Close(args.This()); 321 | } 322 | else { 323 | return scope.Close(ThrowException(Exception::Error(String::New("Must use new operator")))); 324 | } 325 | } 326 | Handle NodeSFMLColor__Getter_r(Local property, const AccessorInfo& info) { 327 | HandleScope scope; 328 | Handle red = Number::New(((sf::Color*)info.Holder()->GetPointerFromInternalField(0))->r); 329 | return scope.Close(red); 330 | } 331 | void NodeSFMLColor__Setter_r(Local property, Local value, const AccessorInfo& info) { 332 | HandleScope scope; 333 | ((sf::Color*)info.Holder()->GetPointerFromInternalField(0))->r = value->IntegerValue(); 334 | scope.Close(value); 335 | } 336 | 337 | Handle NodeSFMLColor__Getter_g(Local property, const AccessorInfo& info) { 338 | HandleScope scope; 339 | Handle green = Number::New(((sf::Color*)info.Holder()->GetPointerFromInternalField(0))->g); 340 | return scope.Close(green); 341 | } 342 | void NodeSFMLColor__Setter_g(Local property, Local value, const AccessorInfo& info) { 343 | HandleScope scope; 344 | ((sf::Color*)info.Holder()->GetPointerFromInternalField(0))->g = value->IntegerValue(); 345 | scope.Close(value); 346 | } 347 | 348 | Handle NodeSFMLColor__Getter_b(Local property, const AccessorInfo& info) { 349 | HandleScope scope; 350 | Handle blue = Number::New(((sf::Color*)info.Holder()->GetPointerFromInternalField(0))->b); 351 | return scope.Close(blue); 352 | } 353 | void NodeSFMLColor__Setter_b(Local property, Local value, const AccessorInfo& info) { 354 | HandleScope scope; 355 | ((sf::Color*)info.Holder()->GetPointerFromInternalField(0))->b = value->IntegerValue(); 356 | scope.Close(value); 357 | } 358 | 359 | Handle NodeSFMLColor__Getter_a(Local property, const AccessorInfo& info) { 360 | HandleScope scope; 361 | Handle alpha = Number::New(((sf::Color*)info.Holder()->GetPointerFromInternalField(0))->a); 362 | return scope.Close(alpha); 363 | } 364 | void NodeSFMLColor__Setter_a(Local property, Local value, const AccessorInfo& info) { 365 | HandleScope scope; 366 | ((sf::Color*)info.Holder()->GetPointerFromInternalField(0))->a = value->IntegerValue(); 367 | scope.Close(value); 368 | } 369 | //GetPointerFromInternalField 370 | 371 | void NodeSFMLImageDispose(Persistent object, void* parameter) { 372 | ((sf::Image*)object->ToObject()->GetPointerFromInternalField(0))->sf::Image::~Image(); 373 | } 374 | Persistent NodeSFMLImageTemplate; 375 | Handle NodeSFMLImage(const Arguments &args) { 376 | HandleScope scope; 377 | if(args.IsConstructCall()) { 378 | sf::Image* image; 379 | if(args.Length()) { 380 | if(NodeSFMLImageTemplate->HasInstance(args[0])) { 381 | image = new sf::Image(*(sf::Image*)args[0]->ToObject()->GetPointerFromInternalField(0)); 382 | } 383 | else { 384 | if(node::Buffer::HasInstance(args[2])) { 385 | image = new sf::Image(); 386 | } 387 | else { 388 | Handle bg = args[2]->ToObject(); 389 | image = new sf::Image( 390 | args[0]->IntegerValue() 391 | ,args[1]->IntegerValue() 392 | ,NodeSFMLColorTemplate->HasInstance(bg) ? *((sf::Color*)bg->GetPointerFromInternalField(0)) : sf::Color::Black 393 | ); 394 | } 395 | } 396 | } 397 | else { 398 | image = new sf::Image(); 399 | } 400 | args.This()->SetPointerInInternalField(0,image); 401 | //Persistent::New(args.This()).MakeWeak(NULL,NodeSFMLImageDispose); 402 | return scope.Close(args.This()); 403 | } 404 | else { 405 | return scope.Close(ThrowException(Exception::Error(String::New("Must use new operator")))); 406 | } 407 | } 408 | /*Handle NodeSFMLImage_GetPixel(const Arguments &args) { 409 | HandleScope scope; 410 | sf::Color* c = new sf::Color(((sf::Image*)args.Holder()->GetPointerFromInternalField(0))->GetPixel( 411 | args[0]->IsUndefined() ? 0 : args[0]->IntegerValue(), 412 | args[1]->IsUndefined() ? 0 : args[1]->IntegerValue() 413 | )); 414 | Handle jsc = NodeSFMLColorTemplateInstanceTemplate->NewInstance(); 415 | jsc->SetPointerInInternalField(0,c); 416 | return scope.Close(jsc); 417 | }*/ 418 | Handle NodeSFMLImage_GetPixel(const Arguments &args) { 419 | HandleScope scope; 420 | sf::Color* c = new sf::Color(((sf::Image*)args.Holder()->GetPointerFromInternalField(0))->GetPixel( 421 | args[0]->IsUndefined() ? 0 : args[0]->IntegerValue(), 422 | args[1]->IsUndefined() ? 0 : args[1]->IntegerValue() 423 | )); 424 | Handle jsc = NodeSFMLColorTemplateInstanceTemplate->NewInstance(); 425 | jsc->SetPointerInInternalField(0,c); 426 | return scope.Close(jsc); 427 | } 428 | Handle NodeSFMLImage_SetPixel(const Arguments &args) { 429 | HandleScope scope; 430 | sf::Color c = *(sf::Color*)args[2]->ToObject()->GetPointerFromInternalField(0); 431 | sf::Image* img = (sf::Image*)args.Holder()->GetPointerFromInternalField(0); 432 | int x = args[0]->IntegerValue(); 433 | int y = args[1]->IntegerValue(); 434 | img->SetPixel(x,y,c); 435 | return scope.Close(Undefined()); 436 | } 437 | Handle NodeSFMLImage_LoadFromFile(const Arguments &args) { 438 | HandleScope scope; 439 | Handle success = Boolean::New(((sf::Image*)args.Holder()->GetPointerFromInternalField(0))->LoadFromFile(*String::Utf8Value(args[0]))); 440 | return scope.Close(success); 441 | } 442 | Handle NodeSFMLImage_SaveToFile(const Arguments &args) { 443 | HandleScope scope; 444 | Handle success = Boolean::New(((sf::Image*)args.Holder()->GetPointerFromInternalField(0))->SaveToFile(*String::Utf8Value(args[0]))); 445 | return scope.Close(success); 446 | } 447 | 448 | void NodeSFMLSpriteDispose(Persistent object, void* parameter) { 449 | ((sf::Sprite*)object->ToObject()->GetPointerFromInternalField(0))->sf::Sprite::~Sprite(); 450 | } 451 | Persistent NodeSFMLSpriteTemplate; 452 | Handle NodeSFMLSprite(const Arguments &args) { 453 | HandleScope scope; 454 | if(args.IsConstructCall()) { 455 | sf::Sprite* sprite; 456 | if(args.Length()) { 457 | // (const Image &Img, const Vector2f &Position=Vector2f(0, 0), const Vector2f &Scale=Vector2f(1, 1), float Rotation=0.f, const Color &Col=Color(255, 255, 255, 255)) 458 | sf::Image* img = (sf::Image*)args[0]->ToObject()->GetPointerFromInternalField(0); 459 | float x; 460 | float y; 461 | Handle position = args[1]; 462 | Handle arr; 463 | if(position->IsArray()) { 464 | arr = position->ToObject(); 465 | x = arr->Get(0)->NumberValue(); 466 | y = arr->Get(0)->NumberValue(); 467 | } 468 | else { 469 | x = 0.0; 470 | y = 0.0; 471 | } 472 | float sx; 473 | float sy; 474 | Handle scale = args[2]; 475 | if(scale->IsArray()) { 476 | arr = scale->ToObject(); 477 | sx = arr->Get(0)->NumberValue(); 478 | sy = arr->Get(0)->NumberValue(); 479 | } 480 | else { 481 | sx = 1; 482 | sy = 1; 483 | } 484 | float r = args[3]->IsUndefined() ? 0.0 : args[3]->NumberValue(); 485 | sf::Color c = args[4]->IsUndefined() ? sf::Color::White : *(sf::Color*)args[4]->ToObject()->GetPointerFromInternalField(0); 486 | sprite = new sf::Sprite(*img,sf::Vector2f(x,y),sf::Vector2f(sx,sy), r, c); 487 | } 488 | else { 489 | sprite = new sf::Sprite(); 490 | } 491 | args.Holder()->SetPointerInInternalField(0,sprite); 492 | //Persistent::New(args.This()).MakeWeak(NULL,NodeSFMLSpriteDispose); 493 | return scope.Close(args.This()); 494 | } 495 | else { 496 | return scope.Close(ThrowException(Exception::Error(String::New("Must use new operator")))); 497 | } 498 | } 499 | Handle NodeSFMLSprite_GetPixel(const Arguments &args) { 500 | HandleScope scope; 501 | sf::Color* c = new sf::Color(((sf::Sprite*)args.Holder()->GetPointerFromInternalField(0))->GetPixel( 502 | args[0]->IsUndefined() ? 0 : args[0]->IntegerValue(), 503 | args[1]->IsUndefined() ? 0 : args[1]->IntegerValue() 504 | )); 505 | Handle jsc = NodeSFMLColorTemplateInstanceTemplate->NewInstance(); 506 | jsc->SetPointerInInternalField(0,c); 507 | return scope.Close(jsc); 508 | } 509 | 510 | 511 | extern "C" void 512 | init (Handle target) 513 | { 514 | HandleScope scope; 515 | 516 | Handle ModeObject = Object::New(); 517 | ModeObject->Set(String::New("Alpha"),Number::New(sf::Blend::Alpha)); 518 | ModeObject->Set(String::New("Add"),Number::New(sf::Blend::Add)); 519 | ModeObject->Set(String::New("Multiply"),Number::New(sf::Blend::Multiply)); 520 | ModeObject->Set(String::New("None"),Number::New(sf::Blend::None)); 521 | target->Set(String::New("Joy"),ModeObject); 522 | 523 | Handle ButtonsObject = Object::New(); 524 | ButtonsObject->Set(String::New("Left"),Number::New(sf::Mouse::Left)); 525 | ButtonsObject->Set(String::New("Right"),Number::New(sf::Mouse::Right)); 526 | ButtonsObject->Set(String::New("Middle"),Number::New(sf::Mouse::Middle)); 527 | ButtonsObject->Set(String::New("XButton1"),Number::New(sf::Mouse::XButton1)); 528 | ButtonsObject->Set(String::New("XButton2"),Number::New(sf::Mouse::XButton2)); 529 | ButtonsObject->Set(String::New("ButtonCount"),Number::New(sf::Mouse::ButtonCount)); 530 | target->Set(String::New("Mouse"),ButtonsObject); 531 | 532 | NodeSFMLColorTemplate = Persistent::New(FunctionTemplate::New(NodeSFMLColor)); 533 | NodeSFMLColorTemplateInstanceTemplate = Persistent::New(NodeSFMLColorTemplate->InstanceTemplate()); 534 | NodeSFMLColorTemplateInstanceTemplate->SetInternalFieldCount(1); 535 | NodeSFMLColorTemplateInstanceTemplate->SetAccessor( 536 | String::New("r") 537 | ,NodeSFMLColor__Getter_r 538 | ,NodeSFMLColor__Setter_r 539 | ); 540 | NodeSFMLColorTemplateInstanceTemplate->SetAccessor( 541 | String::New("g") 542 | ,NodeSFMLColor__Getter_g 543 | ,NodeSFMLColor__Setter_g 544 | ); 545 | NodeSFMLColorTemplateInstanceTemplate->SetAccessor( 546 | String::New("b") 547 | ,NodeSFMLColor__Getter_b 548 | ,NodeSFMLColor__Setter_b 549 | ); 550 | NodeSFMLColorTemplateInstanceTemplate->SetAccessor( 551 | String::New("a") 552 | ,NodeSFMLColor__Getter_a 553 | ,NodeSFMLColor__Setter_a 554 | ); 555 | Handle color_f = NodeSFMLColorTemplate->GetFunction(); 556 | Handle color = NodeSFMLColorTemplateInstanceTemplate->NewInstance(); 557 | color->SetPointerInInternalField(0,new sf::Color(sf::Color::Black)); 558 | color_f->Set(String::New("Black"),color); 559 | 560 | color = NodeSFMLColorTemplateInstanceTemplate->NewInstance(); 561 | color->SetPointerInInternalField(0,new sf::Color(sf::Color::White)); 562 | color_f->Set(String::New("White"),color); 563 | 564 | color = NodeSFMLColorTemplateInstanceTemplate->NewInstance(); 565 | color->SetPointerInInternalField(0,new sf::Color(sf::Color::Red)); 566 | color_f->Set(String::New("Red"),color); 567 | 568 | color = NodeSFMLColorTemplateInstanceTemplate->NewInstance(); 569 | color->SetPointerInInternalField(0,new sf::Color(sf::Color::Green)); 570 | color_f->Set(String::New("Green"),color); 571 | 572 | color = NodeSFMLColorTemplateInstanceTemplate->NewInstance(); 573 | color->SetPointerInInternalField(0,new sf::Color(sf::Color::Blue)); 574 | color_f->Set(String::New("Blue"),color); 575 | 576 | color = NodeSFMLColorTemplateInstanceTemplate->NewInstance(); 577 | color->SetPointerInInternalField(0,new sf::Color(sf::Color::Yellow)); 578 | color_f->Set(String::New("Yellow"),color); 579 | 580 | color = NodeSFMLColorTemplateInstanceTemplate->NewInstance(); 581 | color->SetPointerInInternalField(0,new sf::Color(sf::Color::Magenta)); 582 | color_f->Set(String::New("Magenta"),color); 583 | 584 | color = NodeSFMLColorTemplateInstanceTemplate->NewInstance(); 585 | color->SetPointerInInternalField(0,new sf::Color(sf::Color::Cyan)); 586 | color_f->Set(String::New("Cyan"),color); 587 | target->Set(String::New("Color"), color_f); 588 | 589 | NodeSFMLImageTemplate = Persistent::New(FunctionTemplate::New(NodeSFMLImage)); 590 | Handle NodeSFMLImageTemplateInstanceTemplate = NodeSFMLImageTemplate->InstanceTemplate(); 591 | NodeSFMLImageTemplateInstanceTemplate->SetInternalFieldCount(1); 592 | NodeSFMLImageTemplateInstanceTemplate->Set("SetPixel", FunctionTemplate::New(NodeSFMLImage_SetPixel)); 593 | NodeSFMLImageTemplateInstanceTemplate->Set("GetPixel", FunctionTemplate::New(NodeSFMLImage_GetPixel)); 594 | NodeSFMLImageTemplateInstanceTemplate->Set("LoadFromFile", FunctionTemplate::New(NodeSFMLImage_LoadFromFile)); 595 | NodeSFMLImageTemplateInstanceTemplate->Set("SaveToFile", FunctionTemplate::New(NodeSFMLImage_SaveToFile)); 596 | target->Set(String::New("Image"), NodeSFMLImageTemplate->GetFunction()); 597 | 598 | 599 | NodeSFMLSpriteTemplate = Persistent::New(FunctionTemplate::New(NodeSFMLSprite)); 600 | Handle NodeSFMLSpriteTemplateInstanceTemplate = NodeSFMLSpriteTemplate->InstanceTemplate(); 601 | NodeSFMLSpriteTemplateInstanceTemplate->SetInternalFieldCount(1); 602 | NodeSFMLSpriteTemplateInstanceTemplate->Set("GetPixel", FunctionTemplate::New(NodeSFMLSprite_GetPixel)); 603 | target->Set(String::New("Sprite"), NodeSFMLSpriteTemplate->GetFunction()); 604 | 605 | Handle NodeSFMLRenderWindowTemplate = FunctionTemplate::New(NodeSFMLRenderWindow); 606 | Handle NodeSFMLRenderWindowTemplateInstanceTemplate = NodeSFMLRenderWindowTemplate->InstanceTemplate(); 607 | NodeSFMLRenderWindowTemplateInstanceTemplate->SetInternalFieldCount(1); 608 | NodeSFMLRenderWindowTemplateInstanceTemplate->Set("Clear", FunctionTemplate::New(NodeSFMLRenderWindow_Clear)); 609 | NodeSFMLRenderWindowTemplateInstanceTemplate->Set("Close", FunctionTemplate::New(NodeSFMLRenderWindow_Close)); 610 | NodeSFMLRenderWindowTemplateInstanceTemplate->Set("Display", FunctionTemplate::New(NodeSFMLRenderWindow_Display)); 611 | NodeSFMLRenderWindowTemplateInstanceTemplate->Set("Draw", FunctionTemplate::New(NodeSFMLRenderWindow_Draw)); 612 | NodeSFMLRenderWindowTemplateInstanceTemplate->Set("GetHeight", FunctionTemplate::New(NodeSFMLRenderWindow_GetHeight)); 613 | NodeSFMLRenderWindowTemplateInstanceTemplate->Set("GetWidth", FunctionTemplate::New(NodeSFMLRenderWindow_GetWidth)); 614 | NodeSFMLRenderWindowTemplateInstanceTemplate->Set("IsOpened", FunctionTemplate::New(NodeSFMLRenderWindow_IsOpened)); 615 | target->Set(String::New("RenderWindow"), NodeSFMLRenderWindowTemplate->GetFunction()); 616 | 617 | NodeSFMLVideoModeTemplate = Persistent::New(FunctionTemplate::New(NodeSFMLVideoMode)); 618 | NodeSFMLVideoModeTemplate->Set("GetModesCount", FunctionTemplate::New(NodeSFMLVideoMode_GetModesCount)); 619 | NodeSFMLVideoModeTemplate->Set("GetMode", FunctionTemplate::New(NodeSFMLVideoMode_GetMode)); 620 | NodeSFMLVideoModeTemplate->Set("GetDesktopMode", FunctionTemplate::New(NodeSFMLVideoMode_GetDesktopMode)); 621 | Handle NodeSFMLVideoModeTemplateInstanceTemplate = NodeSFMLVideoModeTemplate->InstanceTemplate(); 622 | NodeSFMLVideoModeTemplateInstanceTemplate->SetInternalFieldCount(1); 623 | NodeSFMLVideoModeTemplateInstanceTemplate->SetAccessor( 624 | String::New("Width") 625 | ,NodeSFMLVideoMode__Getter_Width 626 | ,NodeSFMLVideoMode__Setter_Width 627 | ); 628 | NodeSFMLVideoModeTemplateInstanceTemplate->SetAccessor( 629 | String::New("Height") 630 | ,NodeSFMLVideoMode__Getter_Height 631 | ,NodeSFMLVideoMode__Setter_Height 632 | ); 633 | NodeSFMLVideoModeTemplateInstanceTemplate->SetAccessor( 634 | String::New("BitsPerPixel") 635 | ,NodeSFMLVideoMode__Getter_BitsPerPixel 636 | ,NodeSFMLVideoMode__Setter_BitsPerPixel 637 | ); 638 | NodeSFMLVideoModeTemplateInstanceTemplate->Set("IsValid", FunctionTemplate::New(NodeSFMLVideoMode_IsValid)); 639 | target->Set(String::New("VideoMode"), NodeSFMLVideoModeTemplate->GetFunction()); 640 | 641 | Handle NodeSFMLStyle = Object::New(); 642 | NodeSFMLStyle->Set(String::New("None"),Number::New(sf::Style::None)); 643 | NodeSFMLStyle->Set(String::New("Titlebar"),Number::New(sf::Style::Titlebar)); 644 | NodeSFMLStyle->Set(String::New("Resize"),Number::New(sf::Style::Resize)); 645 | NodeSFMLStyle->Set(String::New("Close"),Number::New(sf::Style::Close)); 646 | NodeSFMLStyle->Set(String::New("Fullscreen"),Number::New(sf::Style::Fullscreen)); 647 | target->Set(String::New("Style"), NodeSFMLStyle); 648 | 649 | Handle NodeSFMLSoundTemplate = FunctionTemplate::New(); 650 | Handle NodeSFMLSoundTemplateInstanceTemplate = NodeSFMLSoundTemplate->InstanceTemplate(); 651 | Handle StatusObject = Object::New(); 652 | StatusObject->Set(String::New("Paused"),Number::New(sf::Sound::Paused)); 653 | StatusObject->Set(String::New("Playing"),Number::New(sf::Sound::Playing)); 654 | StatusObject->Set(String::New("Stopped"),Number::New(sf::Sound::Stopped)); 655 | NodeSFMLSoundTemplate->Set(String::New("Status"),StatusObject); 656 | target->Set(String::New("Sound"), NodeSFMLSoundTemplate->GetFunction()); 657 | 658 | NodeSFMLMusicTemplate = Persistent::New(FunctionTemplate::New(NodeSFMLMusic)); 659 | Handle NodeSFMLMusicInstanceTemplate = NodeSFMLMusicTemplate->InstanceTemplate(); 660 | NodeSFMLMusicInstanceTemplate->SetInternalFieldCount(1); 661 | NodeSFMLMusicInstanceTemplate->Set("GetChannelsCount", FunctionTemplate::New(NodeSFMLMusic_GetChannelsCount)); 662 | NodeSFMLMusicInstanceTemplate->Set("GetDuration", FunctionTemplate::New(NodeSFMLMusic_GetDuration)); 663 | NodeSFMLMusicInstanceTemplate->Set("GetLoop", FunctionTemplate::New(NodeSFMLMusic_GetLoop)); 664 | NodeSFMLMusicInstanceTemplate->Set("GetPlayingOffset", FunctionTemplate::New(NodeSFMLMusic_GetPlayingOffset)); 665 | NodeSFMLMusicInstanceTemplate->Set("GetSampleRate", FunctionTemplate::New(NodeSFMLMusic_GetSampleRate)); 666 | NodeSFMLMusicInstanceTemplate->Set("GetStatus", FunctionTemplate::New(NodeSFMLMusic_GetStatus)); 667 | NodeSFMLMusicInstanceTemplate->Set("OpenFromFile", FunctionTemplate::New(NodeSFMLMusic_OpenFromFile)); 668 | NodeSFMLMusicInstanceTemplate->Set("Pause", FunctionTemplate::New(NodeSFMLMusic_Pause)); 669 | NodeSFMLMusicInstanceTemplate->Set("Play", FunctionTemplate::New(NodeSFMLMusic_Play)); 670 | NodeSFMLMusicInstanceTemplate->Set("SetLoop", FunctionTemplate::New(NodeSFMLMusic_SetLoop)); 671 | NodeSFMLMusicInstanceTemplate->Set("Stop", FunctionTemplate::New(NodeSFMLMusic_Stop)); 672 | target->Set(String::New("Music"), NodeSFMLMusicTemplate->GetFunction()); 673 | } 674 | -------------------------------------------------------------------------------- /test/a.out: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bmeck/node-sfml/40fc5b2ffe0c2db27b8f2836c99e20f2ff218474/test/a.out -------------------------------------------------------------------------------- /test/buildstraight.sh: -------------------------------------------------------------------------------- 1 | gcc -lsfml-graphics -lsfml-window -lsfml-system straight_cpp.cc 2 | ./a.out 3 | -------------------------------------------------------------------------------- /test/file: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bmeck/node-sfml/40fc5b2ffe0c2db27b8f2836c99e20f2ff218474/test/file -------------------------------------------------------------------------------- /test/straight_cpp.cc: -------------------------------------------------------------------------------- 1 | 2 | //////////////////////////////////////////////////////////// 3 | // Headers 4 | //////////////////////////////////////////////////////////// 5 | #include 6 | 7 | 8 | //////////////////////////////////////////////////////////// 9 | /// Entry point of application 10 | /// 11 | /// \return Application exit code 12 | /// 13 | //////////////////////////////////////////////////////////// 14 | int main() 15 | { 16 | // Create the main rendering window 17 | sf::RenderWindow App(sf::VideoMode(800, 600, 32), "SFML Graphics"); 18 | 19 | // Load the sprite image from a file 20 | sf::Image* Image = new sf::Image(60,60); 21 | for(int i=0;i<60;i++) Image->SetPixel(i,i,sf::Color::Red); 22 | 23 | // Create the sprite 24 | sf::Sprite* Sprite = new sf::Sprite(*Image); 25 | 26 | 27 | // Start game loop 28 | while (App.IsOpened()) 29 | { 30 | // Process events 31 | sf::Event Event; 32 | while (App.GetEvent(Event)) 33 | { 34 | // Close window : exit 35 | if (Event.Type == sf::Event::Closed) 36 | App.Close(); 37 | } 38 | 39 | // Get elapsed time 40 | float ElapsedTime = App.GetFrameTime(); 41 | 42 | // Move the sprite 43 | if (App.GetInput().IsKeyDown(sf::Key::Left)) Sprite->Move(-100 * ElapsedTime, 0); 44 | if (App.GetInput().IsKeyDown(sf::Key::Right)) Sprite->Move( 100 * ElapsedTime, 0); 45 | if (App.GetInput().IsKeyDown(sf::Key::Up)) Sprite->Move(0, -100 * ElapsedTime); 46 | if (App.GetInput().IsKeyDown(sf::Key::Down)) Sprite->Move(0, 100 * ElapsedTime); 47 | 48 | // Rotate the sprite 49 | if (App.GetInput().IsKeyDown(sf::Key::Add)) Sprite->Rotate(- 100 * ElapsedTime); 50 | if (App.GetInput().IsKeyDown(sf::Key::Subtract)) Sprite->Rotate(+ 100 * ElapsedTime); 51 | 52 | // Clear screen 53 | App.Clear(); 54 | 55 | // Display sprite in our window 56 | App.Draw(*Sprite); 57 | 58 | // Display window contents on screen 59 | App.Display(); 60 | } 61 | 62 | return EXIT_SUCCESS; 63 | } 64 | 65 | -------------------------------------------------------------------------------- /test/test.js: -------------------------------------------------------------------------------- 1 | var sfml = require("../lib/nodesfml.node") 2 | console.log("starting test") 3 | var img = new sfml.Image(120,60,sfml.Color.Green) 4 | //img.LoadFromFile("logo.jpg") 5 | 6 | var vm = sfml.VideoMode.GetDesktopMode() 7 | console.log("video mode ok") 8 | console.log("valid "+vm.IsValid()) 9 | console.log("Height "+vm.Height) 10 | console.log("Width "+vm.Width) 11 | console.log("BitsPerPixel "+vm.BitsPerPixel) 12 | var app = new sfml.RenderWindow(vm,"test",sfml.Style.None) 13 | console.log(sfml.Style) 14 | for(var i=0;i<60;i++) { 15 | for(var j=0;j<60;j++) { 16 | img.SetPixel(i,j,sfml.Color.Red) 17 | //console.log(img.GetPixel(i,j)) 18 | } 19 | } 20 | console.log("SAVING IMG : "+img.SaveToFile("out.png")) 21 | var sprite = new sfml.Sprite(img) 22 | console.log("sprite :"+JSON.stringify(sprite.GetPixel(5,5))) 23 | 24 | 25 | /* 26 | var music = new sfml.Music() 27 | music.OpenFromFile("test.wav") 28 | music.Play() 29 | */ 30 | app.Clear() 31 | var t;t=setInterval(function(){ 32 | app.Display() 33 | app.Draw(sprite) 34 | },100) 35 | setTimeout(function(){clearInterval(t);console.log('done')},1000) 36 | -------------------------------------------------------------------------------- /test/test.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bmeck/node-sfml/40fc5b2ffe0c2db27b8f2836c99e20f2ff218474/test/test.png -------------------------------------------------------------------------------- /test/test.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bmeck/node-sfml/40fc5b2ffe0c2db27b8f2836c99e20f2ff218474/test/test.wav -------------------------------------------------------------------------------- /wscript: -------------------------------------------------------------------------------- 1 | srcdir = '.' 2 | blddir = 'build' 3 | VERSION = '0.0.1' 4 | 5 | nonmac = False 6 | 7 | def set_options(opt): 8 | opt.tool_options('compiler_cxx') 9 | 10 | def configure(conf): 11 | conf.check_tool('compiler_cxx') 12 | conf.check_tool('node_addon') 13 | conf.check(lib=['sfml-system','sfml-window','sfml-graphics','sfml-audio'], uselib_store='SFML') 14 | conf.check(lib='openal', uselib_store='AL') 15 | conf.check(lib='sndfile', uselib_store='SNDFILE') 16 | 17 | 18 | def build(bld): 19 | obj = bld.new_task_gen('cxx', 'shlib', 'node_addon', framework=['OpenAL','SFML','sfml-system','sfml-window','sfml-graphics','sfml-audio']) 20 | obj.uselib=['SFML','AL','SNDFILE'] 21 | obj.target = 'nodesfml' 22 | obj.source = 'src/NodeSFML.cc' 23 | --------------------------------------------------------------------------------