view import/myrrdin/renderer.d @ 5:f4b89014ad39

added moving figure stuff + animated sprites. not usable atm.
author fred@reichbier.de
date Sat, 19 Jul 2008 14:33:08 +0200
parents src/renderer.d@292df259cc85
children 510541745cd1
line wrap: on
line source

/*
    This file is part of myrrdin.

    myrrdin is free software: you can redistribute it and/or modify
    it under the terms of the GNU Lesser General Public License as 
    published by the Free Software Foundation, either version 3 of 
    the License, or (at your option) any later version.

    myrrdin is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public 
    License along with myrrdin. If not, see <http://www.gnu.org/licenses/>.
*/

module renderer;

import dsfml.window.all;
import dsfml.system.all;
import dsfml.graphics.all;

import consumer;
import imagecache;
import animatedsprite;

class Renderer {
    public RenderWindow app;
    public Cache cache;
    private Consumer[] draw_consumers;
    private Consumer[] event_consumers;
    
    this(char[] title, int width, int height, int depth=32) {
	this.app = new RenderWindow(VideoMode(width, height, depth), title);
	this.app.setFramerateLimit(40);

	this.cache = new Cache("."); // TODO
    }

    /* add a consumer for event handling and drawing */
    void add_consumer(Consumer consumer) {
	this.add_event_consumer(consumer);
	this.add_draw_consumer(consumer);
    }

    /* add a consumer only for event handling */
    void add_event_consumer(Consumer consumer) {
	this.event_consumers ~= consumer;
    }

    /* add a consumer only for drawing */
    void add_draw_consumer(Consumer consumer) {
	this.draw_consumers ~= consumer;
    }

    /* use this instead of this.app.draw - it contains a hook for animated sprites */
    void draw(AnimatedSprite obj) {
	obj.update();
	this.app.draw(obj);
    }

    void draw(IDrawable obj) {
	this.app.draw(obj);
    }

    void draw(Sprite obj) {
	if(cast(AnimatedSprite)obj !is null) {
	    this.draw(cast(AnimatedSprite)obj);
	}
	else {
	    this.app.draw(obj);
	}
    }

    /* start the mainloop */
    void mainloop() {
	Event evt;

	while(this.app.isOpened()) {
	    // handle all events
	    while(this.app.getEvent(evt)) {
		if (evt.Type == Event.EventType.CLOSED) {
		    this.app.close();
		} else {
		    foreach(Consumer consumer; this.event_consumers) {
			if(consumer.handle_event(evt)) break;
		    }
		}		    
	    }
	    // loop iteration
	    foreach(Consumer consumer; this.draw_consumers) {
		consumer.loop_iteration();
	    }
	    // draw all
	    foreach(Consumer consumer; this.draw_consumers) {
		consumer.draw();
	    }
	    // display all
	    this.app.display();
	}
    }
}