Brick Breaker
Dependencies: 4DGL-uLCD-SE mbed-rtos mbed
Graphics.h
- Committer:
- hotwheelharry
- Date:
- 2014-10-21
- Revision:
- 0:099e4258aba4
File content as of revision 0:099e4258aba4:
#include <vector> #include <string> #include <list> struct vec2 { float x; float y; }; class Physics; class Renderer; class Color{ public: unsigned char r; unsigned char g; unsigned char b; Color() : r(0), g(0), b(0) {} Color(unsigned char r, unsigned char g, unsigned char b) : r(r), g(g), b(b) {} Color(int c) : r( (c & 0xff0000) >> 16), g( (c & 0xff00) >> 8), b(c & 0xff) {} operator int(){ int c = 0; return c | (r << 2*8) | (g << 8) | b; } }; class Block{ friend Physics; friend Renderer; private: vec2 next_coord; vec2 next_size; vec2 next_velocity; public: bool updated; bool locked; //fixed position bool interactive; //collidable in physics bool render; vec2 coord; vec2 size; vec2 velocity; Color color; vec2 prev_coord; vec2 prev_size; Block() : updated(true), locked(false), interactive(true), render(true) { coord.x = 0; coord.y = 0; velocity.x = 0; velocity.y = 0; color = RED; size.x = 2; size.y = 2; } virtual bool touching(const Block& b){ if ( coord.x < b.coord.x + b.size.x && coord.x + size.x > b.coord.x && coord.y < b.coord.y + b.size.y && size.y + coord.y > b.coord.y ) { if(this == &b){ return false; } return true; } return false; } virtual void next_swap(){ coord = next_coord; size = next_size; velocity = next_velocity; } void store_prev(){ prev_coord = coord; prev_size = size; } void copy(){ prev_coord = coord; prev_size = size; next_coord = coord; next_size = size; next_velocity = velocity; } }; class Text{ public: bool updated; std::string message; vec2 coord; Color color; int font; Text() : color(0xffffff), updated(true) { } }; class Scene{ public: int lives; int score; bool beat; Color bg; Block paddle; Block ball; std::list<Block> blocks; std::vector<Text> text; }; class Renderer{ private: public: uLCD_4DGL& g; Color background; vec2 screen; Renderer(uLCD_4DGL& gfx, vec2 screen) : g(gfx), screen(screen) { } void render(Scene s){ //g.cls(); // draw blocks for(std::list<Block>::iterator b = s.blocks.begin(); b != s.blocks.end(); b++){ if(b->updated){ //draw over where it was //g.filled_rectangle(b->prev_coord.x, b->prev_coord.y, b->prev_coord.x+b->prev_size.x, b->prev_coord.y+b->prev_size.y, background); //x1,y1,x2,y2,color //draw new location g.filled_rectangle(b->coord.x, b->coord.y, b->coord.x+b->size.x, b->coord.y+b->size.y, b->color); //x1,y1,x2,y2,color b->updated = false; } } //draw paddle { Block* b = &(s.paddle); if(b->updated){ //draw over where it was g.filled_rectangle(b->prev_coord.x, b->prev_coord.y, b->prev_coord.x+b->prev_size.x, b->prev_coord.y+b->prev_size.y, background); //x1,y1,x2,y2,color //draw new location g.filled_rectangle(b->coord.x, b->coord.y, b->coord.x+b->size.x, b->coord.y+b->size.y, b->color); //x1,y1,x2,y2,color b->updated = false; } } //draw ball { Block* b = &(s.ball); if(b->updated){ //draw over where it was g.filled_rectangle(b->prev_coord.x, b->prev_coord.y, b->prev_coord.x+b->prev_size.x, b->prev_coord.y+b->prev_size.y, background); //x1,y1,x2,y2,color //draw new location g.filled_rectangle(b->coord.x, b->coord.y, b->coord.x+b->size.x, b->coord.y+b->size.y, b->color); //x1,y1,x2,y2,color b->updated = false; } } //draw text for(size_t i = 0; i < s.text.size(); i++){ Text& t = s.text[i]; if(t.updated){ g.set_font(t.font); g.color(t.color); g.locate(t.coord.x, t.coord.y); g.printf(t.message.c_str()); t.updated = false; } } } };