From c478aeeb9b7b40bfd3415500b4886c0c0542bc26 Mon Sep 17 00:00:00 2001 From: Vegard Storheil Eriksen Date: Sun, 23 May 2010 18:13:50 +0200 Subject: Added Stage-class. --- engine/stage.cpp | 116 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 engine/stage.cpp (limited to 'engine/stage.cpp') diff --git a/engine/stage.cpp b/engine/stage.cpp new file mode 100644 index 0000000..59377da --- /dev/null +++ b/engine/stage.cpp @@ -0,0 +1,116 @@ +#include "stage.h" + +#include "texturesdl.h" + +#include +#include + +class BulletPattern1 : public BulletPattern { + unsigned int base; + public: + BulletPattern1(bool reverse, unsigned int base) { + num_bullets = 0; + color_r = 1; + color_g = 0; + color_b = 1; + bullets = new float[128]; + this->base = base; + + int j = 0; + for(float i = 0; i < M_PI; i += 0.1, j++) { + bullets[j*4] = 0.5 + sinf(!reverse ? M_PI_2 + i : M_PI - i + M_PI_2) * 0.09; + bullets[j*4 + 1] = 0.8 + cosf(M_PI_2 + i) * 0.1; + bullets[j*4 + 2] = sinf(!reverse ? M_PI_2 + i : M_PI - i + M_PI_2) / 15000.0; + bullets[j*4 + 3] = -0.0001; + } + }; + void update(unsigned int time, unsigned int step) { + if(num_bullets < 32 && base + num_bullets * 10 < time) { + num_bullets += time / 10 - num_bullets - base / 10; + if(num_bullets > 32) num_bullets = 32; + } + for(int i = 0; i < num_bullets; i++) { + bullets[i*4] += bullets[i*4 + 2] * step; + bullets[i*4 + 1] += bullets[i*4 + 3] * step; + } + } +}; + +class BulletPattern2 : public BulletPattern { + public: + BulletPattern2(unsigned int base) { + num_bullets = 0; + color_r = 0; + color_g = 1; + color_b = 0; + stride = sizeof(float); + bullets = new float[8*32*5]; + + int k = 0; + for(int j = 0; j < 8; j++) { + for(float i = 0; i < M_PI; i += 0.1, k++) { + bullets[k*5] = 0.5 + sinf(j % 2 ? M_PI_2 + i : M_PI - i + M_PI_2) * 0.09; + bullets[k*5 + 1] = 0.8 + cosf(M_PI_2 + i) * 0.1; + bullets[k*5 + 2] = sinf(j % 2 ? M_PI_2 + i : M_PI - i + M_PI_2) / 15000; + bullets[k*5 + 3] = -0.0001; + bullets[k*5 + 4] = base + j * 400 + i * 100; + } + } + + }; + void update(unsigned int time, unsigned int step) { + while(num_bullets < 256 && (unsigned int)(bullets[num_bullets*5 + 4]) < time) { + num_bullets++; + } + for(int i = 0; i < num_bullets; i++) { + bullets[i*5] += bullets[i*5 + 2] * step; + bullets[i*5 + 1] += bullets[i*5 + 3] * step; + } + } +}; + +Stage::Stage() { + player = new Player(); + + texture = new TextureSDL("textures/shot1.png"); + shader = new GLShaderProgram(); + + patterns.push_back(new BulletPattern()); + for(int i = 0; i < 8; i++) { + patterns.push_back(new BulletPattern1(i % 2 == 1, 5000 + i * 400)); + } + patterns.push_back(new BulletPattern2(9000)); + + GLFragmentShader shader1("shaders/bullet_fragment.glsl"); + GLVertexShader shader2("shaders/bullet_vertex.glsl"); + shader->attach(shader1); + shader->attach(shader2); + shader->link(); +} + +void Stage::update() { + player->update(); + + static int i; + + for(std::vector::iterator it = patterns.begin(); it < patterns.end(); it++) { + (*it)->update(i++, 1); + } +} + +void Stage::draw() { + player->draw(); + + shader->use(); + glPointSize(32.0); + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, texture->tex()); + + for(std::vector::iterator it = patterns.begin(); it < patterns.end(); it++) { + BulletPattern *bp = (*it); + glColor3f(bp->color_r, bp->color_g, bp->color_b); + bp->draw(); + } + + glUseProgram(0); +} \ No newline at end of file -- cgit v1.2.3