From: <fu...@us...> - 2007-10-12 08:50:06
|
Revision: 132 http://qonk.svn.sourceforge.net/qonk/?rev=132&view=rev Author: fursund Date: 2007-10-12 01:50:05 -0700 (Fri, 12 Oct 2007) Log Message: ----------- starting a new branch Modified Paths: -------------- branches/animated-sun/config.h.in branches/animated-sun/configure.ac branches/animated-sun/src/fonts.cpp Added Paths: ----------- branches/qonk-opengl-simple/ branches/qonk-opengl-simple/src/canvas.cpp branches/qonk-opengl-simple/src/canvas.h branches/qonk-opengl-simple/src/game.cpp branches/qonk-opengl-simple/src/main.cpp branches/qonk-opengl-simple/src/stars.cpp branches/qonk-opengl-simple/src/stars.h Removed Paths: ------------- branches/qonk-opengl/ branches/qonk-opengl-simple/src/canvas.cpp branches/qonk-opengl-simple/src/canvas.h branches/qonk-opengl-simple/src/game.cpp branches/qonk-opengl-simple/src/main.cpp branches/qonk-opengl-simple/src/stars.cpp branches/qonk-opengl-simple/src/stars.h Modified: branches/animated-sun/config.h.in =================================================================== --- branches/animated-sun/config.h.in 2007-10-12 08:47:52 UTC (rev 131) +++ branches/animated-sun/config.h.in 2007-10-12 08:50:05 UTC (rev 132) @@ -9,6 +9,9 @@ /* Define to 1 if you have the `SDL' library (-lSDL). */ #undef HAVE_LIBSDL +/* Define to 1 if you have the `SDLmain' library (-lSDLmain). */ +#undef HAVE_LIBSDLMAIN + /* Define to 1 if you have the `SDL_gfx' library (-lSDL_gfx). */ #undef HAVE_LIBSDL_GFX Modified: branches/animated-sun/configure.ac =================================================================== --- branches/animated-sun/configure.ac 2007-10-12 08:47:52 UTC (rev 131) +++ branches/animated-sun/configure.ac 2007-10-12 08:50:05 UTC (rev 132) @@ -4,6 +4,7 @@ AC_PREREQ(2.61) AC_INIT([qonk], [0.3.0], [qon...@li...]) AC_CANONICAL_TARGET + AM_INIT_AUTOMAKE AC_CONFIG_SRCDIR([src/animations.h]) @@ -20,12 +21,24 @@ AC_MSG_ERROR([No proper SDL found. Please install at least version 1.2.0!])) -# Checks for libraries. -AC_CHECK_LIB([SDL], [SDL_Init]) -AC_CHECK_LIB([SDL_ttf], [TTF_Init], ,AC_MSG_ERROR([SDL_ttf missing. Please install at least version 2.0!])) -AC_CHECK_LIB([SDL_gfx], [pixelColor], ,AC_MSG_ERROR([SDL_gfx missing. Please install at least version 1.2!])) -AC_CHECK_LIB([SDL_image], [IMG_Load], ,AC_MSG_ERROR([SDL_image missing. Please install at least version 1.2!])) +case $host in + *-*-linux*) + # Checks for libraries. + -L/usr/local/cross-tools/i386-mingw32/lib -lmingw32 -lSDLmain -lSDL -mwindows + AC_CHECK_LIB([SDLmain], [SDL_Init]) + AC_CHECK_LIB([SDL_ttf], [TTF_Init], ,AC_MSG_ERROR([SDL_ttf missing. Please install at least version 2.0!])) + AC_CHECK_LIB([SDL_gfx], [pixelColor], ,AC_MSG_ERROR([SDL_gfx missing. Please install at least version 1.2!])) + AC_CHECK_LIB([SDL_image], [IMG_Load], ,AC_MSG_ERROR([SDL_image missing. Please install at least version 1.2!]));; + *-*-mingw*) + # Checks for libraries. + AC_CHECK_LIB([SDL], [SDL_Init]) + AC_CHECK_LIB([SDL_ttf], [TTF_Init], ,AC_MSG_ERROR([SDL_ttf missing. Please install at least version 2.0!])) + AC_CHECK_LIB([SDL_gfx], [pixelColor], ,AC_MSG_ERROR([SDL_gfx missing. Please install at least version 1.2!])) + AC_CHECK_LIB([SDL_image], [IMG_Load], ,AC_MSG_ERROR([SDL_image missing. Please install at least version 1.2!]));; +esac + + # Checks for header files. AC_HEADER_STDC AC_CHECK_HEADERS([stdlib.h SDL/SDL.h SDL/SDL_gfxPrimitives.h SDL/SDL_ttf.h SDL/SDL_image.h]) Modified: branches/animated-sun/src/fonts.cpp =================================================================== --- branches/animated-sun/src/fonts.cpp 2007-10-12 08:47:52 UTC (rev 131) +++ branches/animated-sun/src/fonts.cpp 2007-10-12 08:50:05 UTC (rev 132) @@ -1,7 +1,6 @@ // Copyright 2005 by Anthony Liekens an...@li... #include "fonts.h" - #include "canvas.h" using namespace std; Copied: branches/qonk-opengl-simple (from rev 129, branches/qonk-opengl) Deleted: branches/qonk-opengl-simple/src/canvas.cpp =================================================================== --- branches/qonk-opengl/src/canvas.cpp 2007-10-09 08:31:27 UTC (rev 129) +++ branches/qonk-opengl-simple/src/canvas.cpp 2007-10-12 08:50:05 UTC (rev 132) @@ -1,470 +0,0 @@ -// Copyright 2005 by Anthony Liekens <an...@li...> -// Copyright 2007 by Robert Schuster <rob...@fs...> - -#include <SDL/SDL_gfxPrimitives.h> - -#include "canvas.h" - -#include "extensions.h" -#include "coordinate.h" -#include "settings.h" -#include "fonts.h" - -#include <math.h> - -SDL_Surface* Canvas::main = 0; -SDL_Surface* Canvas::opengl = 0; - -gcn::OpenGLGraphics *Canvas::openglGraphics = 0; - -Font* Canvas::font = 0; - -void -Canvas::alphaBlend( SDL_Surface* surface, Uint8 alpha ) { - if( alpha == 0 ) { - for( int x = 0; x < surface->w; x++ ) - for( int y = 0; y < surface->h; y++ ) { - Uint32 *bufp; - bufp = (Uint32 *)surface->pixels + y*surface->pitch/4 + x; - if( *bufp != 0 ) - *bufp &= 0x00ffffff; - } - } if( alpha != 255 ) { - for( int x = 0; x < surface->w; x++ ) - for( int y = 0; y < surface->h; y++ ) { - Uint32 *bufp; - bufp = (Uint32 *)surface->pixels + y*surface->pitch/4 + x; - if( *bufp != 0 ) { - // seperate RGB from A, update A for new value, OR them together again - Uint32 color = ( *bufp & 0x00ffffff ) | ( ( *bufp >> 24 ) * alpha >> 8 ) << 24; - *bufp = color; - } - } - } -} - -void -Canvas::drawSelector(Coordinate &c, Sint16 offset, - Sint16 width, Sint16 height, Uint8 R, Uint8 G, Uint8 B) -{ - int x1 = c.getXMapped() + offset; - int y1 = c.getYMapped() + offset; - - hlineRGBA( main, x1, x1 + 2, y1, R, G, B, 255 ); - hlineRGBA( main, x1 + width - 2, x1 + width, y1, R, G, B, 255 ); - hlineRGBA( main, x1, x1 + 2, y1 + height, R, G, B, 255 ); - hlineRGBA( main, x1 + width - 2, x1 + width, y1 + height, R, G, B, 255 ); - vlineRGBA( main, x1, y1, y1 + 2, R, G, B, 255 ); - vlineRGBA( main, x1, y1 + height, y1 + height - 2, R, G, B, 255 ); - vlineRGBA( main, x1 + width, y1, y1 + 2, R, G, B, 255 ); - vlineRGBA( main, x1 + width, y1 + height, y1 + height - 2, R, G, B, 255 ); -} - -void -Canvas::drawNearestPlanetSelector(Coordinate &c, int size) -{ - size *= 3; - int offset = -size/2; - - drawSelector(c, offset, size, size, 255, 0, 0); -} - -void -Canvas::drawPlanet( Coordinate &loc, int size, Uint32 color ) { - drawPlanetMapped(loc.getXMapped(), loc.getYMapped(), size, color); -} - -void -Canvas::drawPlanetMapped(int x, int y, int size, Uint32 color ) { - int R = getRed(color); - int G = getGreen(color); - int B = getBlue(color); - - filledCircleRGBA( main, x, y, size + 2, 0, 0, 0, 128 ); - filledCircleRGBA( main, x, y, size, R, G, B, 255 ); - aacircleRGBA( main, x, y, size, R, G, B, 255 ); - filledEllipseRGBA( main, x, y - size / 2, size, size / 2, 255 - 4 * ( 255 - R ) / 5, 255 - 4 * ( 255 - G ) / 5, 255 - 4 * ( 255 - B ) / 5, 255 ); - aaellipseRGBA( main, x, y - size / 2, size, size / 2, 255 - 4 * ( 255 - R ) / 5, 255 - 4 * ( 255 - G ) / 5, 255 - 4 * ( 255 - B ) / 5, 255 ); -} - -void -Canvas::drawResidentShip(Coordinate& shipLocation, Coordinate& planetLocation, - int color) { - int sx = shipLocation.getXMapped(); - int sy = shipLocation.getYMapped(); - - int px = planetLocation.getXMapped(); - int py = planetLocation.getYMapped(); - - int r = getRed(color); - int g = getGreen(color); - int b = getBlue(color); - - aalineRGBA(main, sx, sy, px, py, r, g, b, 64); - filledCircleRGBA(main, sx, sy, 1, r, g, b, 255); -} - -void -Canvas::drawFlyingShip(Coordinate& shipLocation, double direction, int color) -{ - int sx = shipLocation.getXMapped(); - int sy = shipLocation.getYMapped(); - - int r = getRed(color); - int g = getGreen(color); - int b = getBlue(color); - - int headX, headY; - int leftTipX, leftTipY; - int rightTipX, rightTipY; - - headX = (int) (sx + 5.0 * cos( direction)); - headY = (int) (sy + 5.0 * sin( direction)); - leftTipX = (int) (sx + 2.0 * cos( direction + M_PI / 3.0)); - leftTipY = (int) (sy + 2.0 * sin( direction + M_PI / 3.0)); - rightTipX = (int) (sx + 2.0 * cos( direction - M_PI / 3.0)); - rightTipY = (int) (sy + 2.0 * sin( direction - M_PI / 3.0)); - - aalineRGBA(main, leftTipX, leftTipY, headX, headY, r, g, b, 255); - aalineRGBA(main, rightTipX, rightTipY, headX, headY, r, g, b, 255); - aalineRGBA(main, rightTipX, rightTipY, leftTipX, leftTipY, r, g, b, 255); -} - -void -Canvas::drawSelection(Coordinate& location) -{ - aacircleRGBA(main, location.getXMapped(), location.getYMapped(), 3, 255, 192, 0, 255 ); -} - -void -Canvas::drawOrbit(Coordinate ¢er, double rotationDistance, int color) -{ - int r = getRed(color); - int g = getGreen(color); - int b = getBlue(color); - - aaellipseRGBA(main, center.getXMapped(), center.getYMapped(), - (int) (rotationDistance * Settings::getGameWidth()), - (int) (rotationDistance * Settings::getGameHeight()), - r, g, b, 64); -} - -void -Canvas::drawBuildProgress(Coordinate& location, int size, double percentage) -{ - - - int x = location.getXMapped(); - int y = location.getYMapped(); - glEnable(GL_BLEND); - glColor4f (1,1,1, (int)( 0.2 * percentage )/255); - int radius = (int) (size + 102.5 - percentage); - double y1=y+radius; - double x1=x; - glBegin(GL_LINE_STRIP); - for(double angle=0.0f;angle<=(2.0f*3.14159);angle+=0.01f) - { - glLineWidth(3); - double x2=x+(radius*(float)sin((double)angle)); - double y2=y+(radius*(float)cos((double)angle)); - glVertex2d(x1,y1); - y1=y2; - x1=x2; - } - glEnd(); - glDisable(GL_BLEND); -// aacircleRGBA( main, location.getXMapped(), location.getYMapped(), -// (int) (size + 102.5 - percentage), -// 0xff, 0xff, 0xff, -// (int)( 0.2 * percentage )); -} - -void -Canvas::drawText(int x, int y, const char *msg, int r, int g, int b, int a) -{ - - font->render(main, x, y, msg, r, g, b, a); -} - -void -Canvas::drawBox(int x, int y, int w, int h, int r, int g, int b) -{ - glBegin(GL_QUADS); - glColor3f(r,g,b); - glVertex3f(x, y, 1.0); - glVertex3f(x+w, y, 1.0); - glVertex3f(x+w, y+h, 1.0); - glVertex3f(x,y+h, 1.0); - glEnd();//( main, x, y, w, h, r, g, b, 255 ); -} - -int -Canvas::getFontHeight() -{ - return font->getHeight(); -} - -void -Canvas::drawRadar() -{ - int radarSteps = 4; - Uint32 radarColor = 0xfee190; - double x = Settings::getGameOffsetX() + Settings::getGameWidth() / 2; - double y = Settings::getGameHeight() / 2; - - double s = 1.0 / radarSteps; - for( int i = 1; i <= radarSteps; i++ ) { - glEnable(GL_BLEND); - glColor4f(144/255, 225/255, 144/255, 64/255); - int radius = (int)( i * s * Settings::getGameHeight() / 2 ); - double y1=y+radius; - double x1=x; - glBegin(GL_LINE_STRIP); - for(double angle=0.0f;angle<=(2.0f*3.14159);angle+=0.01f) - { - glLineWidth(3); - double x2=x+(radius*(float)sin((double)angle)); - double y2=y+(radius*(float)cos((double)angle)); - glVertex2d(x1,y1); - y1=y2; - x1=x2; - } - glEnd(); - glDisable(GL_BLEND); - - //aaellipseRGBA( main, Settings::getGameOffsetX() + Settings::getGameWidth() / 2, - // Settings::getGameHeight() / 2, (int) (i * s * Settings::getGameWidth() / 2), - // (int)( i * s * Settings::getGameHeight() / 2 ), 144, 225, 144, 64 ); - } -// lineRGBA( main, -// Settings::getGameOffsetX() + Settings::getGameWidth() / 2, 0, -// Settings::getGameOffsetX() + Settings::getGameWidth() / 2, -// Settings::getGameHeight(), 255, 225, 144, 64 ); -// lineRGBA( main, -// Settings::getGameOffsetX(), -// Settings::getGameHeight() / 2, -// Settings::getGameOffsetX() + Settings::getGameWidth(), -// Settings::getGameHeight() / 2, 255, 225, 144, 64 ); -} - -//void -//Canvas::drawSun() -//{ -// // Sun in the middle -// Sint16 x0 = Settings::getGameOffsetX() + Settings::getGameWidth() / 2; -// Sint16 y0 = Settings::getGameHeight() / 2; - -// static Counter counter(1000); //number of frames per cycle -// int amplitude = 3; - -// double phase = static_cast<double>(counter.getCountMax())/8; -// double p0 = sin( 2*M_PI * ( counter.getCount() - 0*phase )/( counter.getCountMax() ) ); -// double p1 = sin( 2*M_PI * ( counter.getCount() - 1*phase )/( counter.getCountMax() ) ); -// double p2 = sin( 2*M_PI * ( counter.getCount() - 2*phase )/( counter.getCountMax() ) ); -// double p3 = sin( 2*M_PI * ( counter.getCount() - 3*phase )/( counter.getCountMax() ) ); - -// counter.increment(); - -// filledTrigonRGBA( main, x0+5, y0, x0-5,y0, x0, y0+15 + amplitude*p0, 255, 205, 0, 255); -// filledTrigonRGBA( main, x0+5, y0, x0-5,y0, x0, y0-15 + amplitude*p2, 255, 205, 0, 255); -// filledTrigonRGBA( main, x0+15 + amplitude*p1, y0, x0,y0+5, x0, y0-5, 255, 205, 0, 255); -// filledTrigonRGBA( main, x0-15 + amplitude*p3, y0, x0,y0+5, x0, y0-5, 255, 205, 0, 255); - -// filledTrigonRGBA( main, x0+10, y0-10, x0+5,y0, x0, y0-5, 255, 205, 0, 255); -// filledTrigonRGBA( main, x0-10, y0-10, x0-5,y0, x0, y0-5, 255, 205, 0, 255); -// filledTrigonRGBA( main, x0+10, y0+10, x0+5,y0, x0, y0+5, 255, 205, 0, 255); -// filledTrigonRGBA( main, x0-10, y0+10, x0-5,y0, x0, y0+5, 255, 205, 0, 255); - -// filledCircleRGBA( main, x0,y0, 7, 255, 255, 0, 255 ); -// filledCircleRGBA( main, x0,y0, 6, 255, 245, 0, 255 ); -// filledCircleRGBA( main, x0,y0, 5, 255, 225, 0, 255 ); -// filledCircleRGBA( main, x0,y0, 4, 255, 205, 0, 255 ); -//} - -/** Little star drawn in the background. - * - */ -void -Canvas::drawStar(int x, int y, int brightness) -{ - glEnable(GL_BLEND); - glBegin(GL_POINTS); - glColor4f((brightness + rand() % 64)/255,(brightness + rand() % 64)/255,(brightness + rand() % 64)/255,1); - glVertex2d(x,y); - glEnd(); - glDisable(GL_BLEND); - //pixelRGBA( main, x, y, brightness + rand() % 64, brightness + rand() % 64, brightness + rand() % 64, 255 ); - -} - -void -Canvas::drawSonar(Coordinate coord, int size, double percentage, int r, int g, int b, bool circle) -{ - int x = coord.getXMapped(); - int y = coord.getYMapped(); - glEnable(GL_BLEND); - glColor4f (r/255, g/255, b/255, ( ( 255 - 255 * percentage ) * 0.05 )/255); - int radius = (int)( size * sin( percentage * M_PI ) ); - double y1=y+radius; - double x1=x; - glBegin(GL_LINE_STRIP); - for(double angle=0.0f;angle<=(2.0f*3.14159);angle+=0.01f) - { - glLineWidth(3); - double x2=x+(radius*(float)sin((double)angle)); - double y2=y+(radius*(float)cos((double)angle)); - glVertex2d(x1,y1); - y1=y2; - x1=x2; - } - glEnd(); - glDisable(GL_BLEND); - //filledCircleRGBA( main, x, y, (int)( size * sin( percentage * M_PI ) ), r, g, b, (int)( ( 255 - 255 * percentage ) * 0.05 ) ); - - //if( circle ) - // aacircleRGBA( main, x, y, (int)( size * sin( percentage * M_PI ) ), r, g, b, 255 - (int)( 255 * percentage ) ); - -} - -void -Canvas::drawPlayerStat(int size, int index, int previousValue, int currentValue, int r, int g, int b) -{ - int w = Settings::getScreenWidth(); - int h = Settings::getScreenHeight(); - - glBegin(GL_LINE_STRIP); - glLineWidth(5); - glEnable(GL_BLEND); - glColor4f (r, g, b, index * 2); - glVertex2d(w - size + index - 1,h - previousValue); - glVertex2d( w - size + index,h - currentValue); - glEnd(); - //aalineRGBA( main, w - size + index - 1, h - previousValue, w - size + index, h - currentValue, r, g, b, index * 2 ); -} - -void -Canvas::drawMouseSelection(Coordinate &c1, Coordinate &c2) -{ - int y1 = (c1.getYMapped()-Settings::getScreenHeight())*(-1); - int y2 = (c2.getYMapped()-Settings::getScreenHeight())*(-1); - if(y1 < 0) - y1 = 0; - if(y2 < 0) - y2 = 0; - if(y2 > Settings::getScreenHeight()) - y2 = Settings::getScreenHeight(); - if(y1 > Settings::getScreenHeight()) - y1 = Settings::getScreenHeight(); - c1.setYMapped(y1); - c2.setYMapped(y2); - glEnable(GL_BLEND); - glBegin(GL_LINE_LOOP); - glColor4f(1,1,1, 1); - glVertex2d(c2.getXMapped(), c2.getYMapped()); - glVertex2d(c1.getXMapped(), c2.getYMapped()); - glVertex2d(c1.getXMapped(), c1.getYMapped()); - glVertex2d(c2.getXMapped(),c1.getYMapped()); - glEnd(); - glDisable(GL_BLEND); - //rectangleColor( main, c1.getXMapped(), c1.getYMapped(), c2.getXMapped(), c2.getYMapped(), 0xfee19080 ); -} - -void -Canvas::drawCursor(int x, int y) -{ - y = (y-Settings::getScreenHeight())*(-1); - glEnable(GL_BLEND); - glColor4f (1.0, 1.0, 1.0, 1.0); - double radius = 6; - double y1=y+radius; - double x1=x; - glBegin(GL_LINE_STRIP); - for(double angle=0.0f;angle<=(2.0f*3.14159);angle+=0.01f) - { - glLineWidth(3); - double x2=x+(radius*(float)sin((double)angle)); - double y2=y+(radius*(float)cos((double)angle)); - glVertex2d(x1,y1); - y1=y2; - x1=x2; - } - glEnd(); - glDisable(GL_BLEND); - //aacircleRGBA( main, x,y, 4, 255, 255, 255, 255 ); -} - -void -Canvas::glEnable2d() -{ - int vPort[4]; - glGetIntegerv(GL_VIEWPORT, vPort); - - glMatrixMode(GL_PROJECTION); - glPushMatrix(); - glLoadIdentity(); - - glOrtho(0, vPort[2], 0, vPort[3], -1, 1); - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - glLoadIdentity(); - glDisable(GL_DEPTH_TEST); -} - -void -Canvas::glDisable2d() -{ - glEnable(GL_DEPTH_TEST); - - glMatrixMode(GL_PROJECTION); - glPopMatrix(); - glMatrixMode(GL_MODELVIEW); - glPopMatrix(); -} - -void -Canvas::initScreen() -{ - if (!openglGraphics) - openglGraphics = new gcn::OpenGLGraphics(); - - if (!font) - font = new Font("font.ttf", 18); - - SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 5 ); - SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 5 ); - SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 5 ); - SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 16 ); - SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); - - - long flags = SDL_SWSURFACE | SDL_HWSURFACE | SDL_OPENGL; - if (Settings::getFullscreen()) - flags |= SDL_FULLSCREEN; - - main = SDL_SetVideoMode( Settings::getScreenWidth(), Settings::getScreenHeight(), 0, flags); - - openglGraphics->setTargetPlane(Settings::getScreenWidth(), Settings::getScreenHeight()); -} - -void -Canvas::shutdown() -{ - delete openglGraphics; - SDL_FreeSurface(main); - main = NULL; -} - -void -Canvas::updateScreen() -{ - - glFlush(); - glFinish(); - SDL_GL_SwapBuffers(); -} - -gcn::OpenGLGraphics * -Canvas::getOpenGLGraphics() -{ - return openglGraphics; -} Copied: branches/qonk-opengl-simple/src/canvas.cpp (from rev 131, branches/qonk-opengl/src/canvas.cpp) =================================================================== --- branches/qonk-opengl-simple/src/canvas.cpp (rev 0) +++ branches/qonk-opengl-simple/src/canvas.cpp 2007-10-12 08:50:05 UTC (rev 132) @@ -0,0 +1,553 @@ +// Copyright 2005 by Anthony Liekens <an...@li...> +// Copyright 2007 by Robert Schuster <rob...@fs...> + +#include <SDL/SDL_gfxPrimitives.h> + +#include "canvas.h" + +#include "extensions.h" +#include "coordinate.h" +#include "settings.h" +#include "fonts.h" + +#include <math.h> + +SDL_Surface* Canvas::main = 0; +SDL_Surface* Canvas::opengl = 0; + +gcn::OpenGLGraphics *Canvas::openglGraphics = 0; + +Font* Canvas::font = 0; + +void +Canvas::alphaBlend( SDL_Surface* surface, Uint8 alpha ) { + if( alpha == 0 ) { + for( int x = 0; x < surface->w; x++ ) + for( int y = 0; y < surface->h; y++ ) { + Uint32 *bufp; + bufp = (Uint32 *)surface->pixels + y*surface->pitch/4 + x; + if( *bufp != 0 ) + *bufp &= 0x00ffffff; + } + } if( alpha != 255 ) { + for( int x = 0; x < surface->w; x++ ) + for( int y = 0; y < surface->h; y++ ) { + Uint32 *bufp; + bufp = (Uint32 *)surface->pixels + y*surface->pitch/4 + x; + if( *bufp != 0 ) { + // seperate RGB from A, update A for new value, OR them together again + Uint32 color = ( *bufp & 0x00ffffff ) | ( ( *bufp >> 24 ) * alpha >> 8 ) << 24; + *bufp = color; + } + } + } +} + +void +Canvas::drawSelector(Coordinate &c, Sint16 offset, + Sint16 width, Sint16 height, Uint8 R, Uint8 G, Uint8 B) +{ + int x1 = c.getXMapped() + offset; + int y1 = ((c.getYMapped()-Settings::getScreenHeight())*(-1)) + offset; + + glColor4f(1.0f,1.0f,0.0f,1.0f); + + glBegin(GL_LINE_STRIP); + glVertex2d(x1, y1); + glVertex2d(x1+2, y1); + glVertex2d(x1 + width - 2, y1); + glVertex2d(x1 + width , y1); + glVertex2d(x1, y1 + height); + glVertex2d(x1+2, y1 + height); + glVertex2d(x1 + width - 2, y1 + height); + glVertex2d(x1 + width, y1 + height); + glVertex2d(x1, y1); + glVertex2d(x1, y1+2); + glVertex2d(x1, y1 + height); + glVertex2d(x1, y1 + height - 2); + glVertex2d(x1 + width, y1); + glVertex2d(x1 + width, y1 + 2); + glVertex2d(x1 + width, y1 + height); + glVertex2d(x1 + width, y1 + height - 2); + glEnd(); +} + +void +Canvas::drawNearestPlanetSelector(Coordinate &c, int size) +{ + size *= 3; + int offset = -size/2; + + drawSelector(c, offset, size, size, 255, 0, 0); +} + +void +Canvas::drawPlanet( Coordinate &loc, int size, Uint32 color ) { + drawPlanetMapped(loc.getXMapped(), (loc.getYMapped()-Settings::getScreenHeight())*(-1), size, color); +} + +void +Canvas::drawPlanetMapped(int x, int y, int size, Uint32 color ) { + float R = (float) getRed(color)/255.0f; + float G = (float) getGreen(color)/255.0f; + float B = (float) getBlue(color)/255.0f; + + glEnable(GL_BLEND); + glColor4f (R, G, B, 1.0f); + int radius = size; + double y1=y+radius; + double x1=x; + glBegin(GL_TRIANGLE_FAN); + for(double angle=0.0f;angle<=(2.0f*3.14159);angle+=0.01f) + { + //glLineWidth(3); + double x2=x+(radius*(float)sin((double)angle)); + double y2=y+(radius*(float)cos((double)angle)); + glVertex2d(x1,y1); + glVertex2d(x2,y2); + glVertex2d(x,y); + y1=y2; + x1=x2; + } + glEnd(); + glDisable(GL_BLEND); + +} + +void +Canvas::drawResidentShip(Coordinate& shipLocation, Coordinate& planetLocation, + int color) { + int sx = shipLocation.getXMapped(); + int sy = (shipLocation.getYMapped()-Settings::getScreenHeight())*(-1); + + int px = planetLocation.getXMapped(); + int py = (planetLocation.getYMapped()-Settings::getScreenHeight())*(-1); + + float R = (float) getRed(color)/255.0f; + float G = (float) getGreen(color)/255.0f; + float B = (float) getBlue(color)/255.0f; + + + glColor4f(R,G,B,0.4f); + + glBegin(GL_LINE_STRIP); + glVertex2d(sx, sy); + glVertex2d(px, py); + glEnd(); + + + glEnable(GL_BLEND); + glColor4f (R, G, B, 1.0f); + int radius = 1; + double y1=sy+radius; + double x1=sx; + glBegin(GL_TRIANGLE_FAN); + for(double angle=0.0f;angle<=(2.0f*3.14159);angle+=0.01f) + { + //glLineWidth(3); + double x2=sx+(radius*(float)sin((double)angle)); + double y2=sy+(radius*(float)cos((double)angle)); + glVertex2d(x1,y1); + glVertex2d(x2,y2); + glVertex2d(sx,sy); + y1=y2; + x1=x2; + } + glEnd(); + glDisable(GL_BLEND); + + //aalineRGBA(main, sx, sy, px, py, r, g, b, 64); + //filledCircleRGBA(main, sx, sy, 1, r, g, b, 255); +} + +void +Canvas::drawFlyingShip(Coordinate& shipLocation, double direction, int color) +{ + int sx = shipLocation.getXMapped(); + int sy = (shipLocation.getYMapped()-Settings::getScreenHeight())*(-1); + + float R = (float) getRed(color)/255.0f; + float G = (float) getGreen(color)/255.0f; + float B = (float) getBlue(color)/255.0f; + + int headX, headY; + int leftTipX, leftTipY; + int rightTipX, rightTipY; + + headX = (int) (sx + 5.0 * cos( direction)); + headY = (int) (sy + 5.0 * sin( direction)); + leftTipX = (int) (sx + 2.0 * cos( direction + M_PI / 3.0)); + leftTipY = (int) (sy + 2.0 * sin( direction + M_PI / 3.0)); + rightTipX = (int) (sx + 2.0 * cos( direction - M_PI / 3.0)); + rightTipY = (int) (sy + 2.0 * sin( direction - M_PI / 3.0)); + + glColor4f(R,G,B,1.0f); + + glBegin(GL_LINE_STRIP); + glVertex2d(leftTipX, leftTipY); + glVertex2d(headX, headY); + glVertex2d(rightTipX, rightTipY); + glVertex2d(headX, headY); + glVertex2d(rightTipX, rightTipY); + glVertex2d(leftTipX, leftTipY); + glEnd(); +} + +void +Canvas::drawSelection(Coordinate& location) +{ + int x = location.getXMapped(); + int y = (location.getYMapped()-Settings::getScreenHeight())*(-1); + glEnable(GL_BLEND); + glColor4f (1.0f, 0.75f , 0, 1.0f); + int radius = 3; + double y1=y+radius; + double x1=x; + glBegin(GL_LINE_STRIP); + for(double angle=0.0f;angle<=(2.0f*3.14159);angle+=0.01f) + { + glLineWidth(3); + double x2=x+(radius*(float)sin((double)angle)); + double y2=y+(radius*(float)cos((double)angle)); + glVertex2d(x1,y1); + y1=y2; + x1=x2; + } + glEnd(); + glDisable(GL_BLEND); + //aacircleRGBA(main, location.getXMapped(), location.getYMapped(), 3, 255, 192, 0, 255 ); +} + +void +Canvas::drawOrbit(Coordinate ¢er, double rotationDistance, int color) +{ + int r = getRed(color); + int g = getGreen(color); + int b = getBlue(color); + +// aaellipseRGBA(main, center.getXMapped(), center.getYMapped(), +// (int) (rotationDistance * Settings::getGameWidth()), +// (int) (rotationDistance * Settings::getGameHeight()), +// r, g, b, 64); +} + +void +Canvas::drawBuildProgress(Coordinate& location, int size, double percentage) +{ + + + int x = location.getXMapped(); + int y = (location.getYMapped()-Settings::getScreenHeight())*(-1); + glEnable(GL_BLEND); + float fade = (float)( 0.2 * percentage/255.0f); + glColor4f (1.0f,1.0f,1.0f, fade ); + int radius = (int) (size + 102.5 - percentage); + double y1=y+radius; + double x1=x; + glBegin(GL_LINE_STRIP); + for(double angle=0.0f;angle<=(2.0f*3.14159);angle+=0.01f) + { + glLineWidth(3); + double x2=x+(radius*(float)sin((double)angle)); + double y2=y+(radius*(float)cos((double)angle)); + glVertex2d(x1,y1); + y1=y2; + x1=x2; + } + glEnd(); + glDisable(GL_BLEND); +// aacircleRGBA( main, location.getXMapped(), location.getYMapped(), +// (int) (size + 102.5 - percentage), +// 0xff, 0xff, 0xff, +// (int)( 0.2 * percentage )); +} + +void +Canvas::drawText(int x, int y, const char *msg, int r, int g, int b, int a) +{ + + font->render(main, x, y, msg, r, g, b, a); +} + +void +Canvas::drawBox(int x, int y, int w, int h, int r, int g, int b) +{ + glBegin(GL_QUADS); + glColor3f(r,g,b); + glVertex3f(x, y, 1.0); + glVertex3f(x+w, y, 1.0); + glVertex3f(x+w, y+h, 1.0); + glVertex3f(x,y+h, 1.0); + glEnd();//( main, x, y, w, h, r, g, b, 255 ); +} + +int +Canvas::getFontHeight() +{ + return font->getHeight(); +} + +void +Canvas::drawRadar() +{ + int radarSteps = 4; + Uint32 radarColor = 0xfee190; + double x = Settings::getGameOffsetX() + Settings::getGameWidth() / 2; + double y = Settings::getGameHeight() / 2; + + double s = 1.0 / radarSteps; + for( int i = 1; i <= radarSteps; i++ ) { + glEnable(GL_BLEND); + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + int radius = (int)( i * s * Settings::getGameHeight() / 2 ); + double y1=y+radius; + double x1=x; + glBegin(GL_LINE_STRIP); + for(double angle=0.0f;angle<=(2.0f*3.14159);angle+=0.01f) + { + glLineWidth(3); + double x2=x+(radius*(float)sin((double)angle)); + double y2=y+(radius*(float)cos((double)angle)); + glVertex2d(x1,y1); + y1=y2; + x1=x2; + } + glEnd(); + glDisable(GL_BLEND); + + //aaellipseRGBA( main, Settings::getGameOffsetX() + Settings::getGameWidth() / 2, + // Settings::getGameHeight() / 2, (int) (i * s * Settings::getGameWidth() / 2), + // (int)( i * s * Settings::getGameHeight() / 2 ), 144, 225, 144, 64 ); + } +// lineRGBA( main, +// Settings::getGameOffsetX() + Settings::getGameWidth() / 2, 0, +// Settings::getGameOffsetX() + Settings::getGameWidth() / 2, +// Settings::getGameHeight(), 255, 225, 144, 64 ); +// lineRGBA( main, +// Settings::getGameOffsetX(), +// Settings::getGameHeight() / 2, +// Settings::getGameOffsetX() + Settings::getGameWidth(), +// Settings::getGameHeight() / 2, 255, 225, 144, 64 ); +} + +//void +//Canvas::drawSun() +//{ +// // Sun in the middle +// Sint16 x0 = Settings::getGameOffsetX() + Settings::getGameWidth() / 2; +// Sint16 y0 = Settings::getGameHeight() / 2; + +// static Counter counter(1000); //number of frames per cycle +// int amplitude = 3; + +// double phase = static_cast<double>(counter.getCountMax())/8; +// double p0 = sin( 2*M_PI * ( counter.getCount() - 0*phase )/( counter.getCountMax() ) ); +// double p1 = sin( 2*M_PI * ( counter.getCount() - 1*phase )/( counter.getCountMax() ) ); +// double p2 = sin( 2*M_PI * ( counter.getCount() - 2*phase )/( counter.getCountMax() ) ); +// double p3 = sin( 2*M_PI * ( counter.getCount() - 3*phase )/( counter.getCountMax() ) ); + +// counter.increment(); + +// filledTrigonRGBA( main, x0+5, y0, x0-5,y0, x0, y0+15 + amplitude*p0, 255, 205, 0, 255); +// filledTrigonRGBA( main, x0+5, y0, x0-5,y0, x0, y0-15 + amplitude*p2, 255, 205, 0, 255); +// filledTrigonRGBA( main, x0+15 + amplitude*p1, y0, x0,y0+5, x0, y0-5, 255, 205, 0, 255); +// filledTrigonRGBA( main, x0-15 + amplitude*p3, y0, x0,y0+5, x0, y0-5, 255, 205, 0, 255); + +// filledTrigonRGBA( main, x0+10, y0-10, x0+5,y0, x0, y0-5, 255, 205, 0, 255); +// filledTrigonRGBA( main, x0-10, y0-10, x0-5,y0, x0, y0-5, 255, 205, 0, 255); +// filledTrigonRGBA( main, x0+10, y0+10, x0+5,y0, x0, y0+5, 255, 205, 0, 255); +// filledTrigonRGBA( main, x0-10, y0+10, x0-5,y0, x0, y0+5, 255, 205, 0, 255); + +// filledCircleRGBA( main, x0,y0, 7, 255, 255, 0, 255 ); +// filledCircleRGBA( main, x0,y0, 6, 255, 245, 0, 255 ); +// filledCircleRGBA( main, x0,y0, 5, 255, 225, 0, 255 ); +// filledCircleRGBA( main, x0,y0, 4, 255, 205, 0, 255 ); +//} + +/** Little star drawn in the background. + * + */ +void +Canvas::drawStar(int x, int y, float brightness) +{ + glEnable(GL_BLEND); + glBegin(GL_POINTS); + glColor4f(1.0f, 1.0f, 1.0f,brightness); + glVertex2d(x,y); + glEnd(); + glDisable(GL_BLEND); + //pixelRGBA( main, x, y, brightness + rand() % 64, brightness + rand() % 64, brightness + rand() % 64, 255 ); + +} + +void +Canvas::drawSonar(Coordinate coord, int size, double percentage, int r, int g, int b, bool circle) +{ + int x = coord.getXMapped(); + int y = (coord.getYMapped()-Settings::getScreenHeight())*(-1); + glEnable(GL_BLEND); + glColor4f (1.0f, 1.0f, 1.0f, 1.0f); + int radius = (int)( size * sin( percentage * M_PI ) ); + double y1=y+radius; + double x1=x; + glBegin(GL_LINE_STRIP); + for(double angle=0.0f;angle<=(2.0f*3.14159);angle+=0.01f) + { + glLineWidth(3); + double x2=x+(radius*(float)sin((double)angle)); + double y2=y+(radius*(float)cos((double)angle)); + glVertex2d(x1,y1); + y1=y2; + x1=x2; + } + glEnd(); + glDisable(GL_BLEND); + //filledCircleRGBA( main, x, y, (int)( size * sin( percentage * M_PI ) ), r, g, b, (int)( ( 255 - 255 * percentage ) * 0.05 ) ); + + //if( circle ) + // aacircleRGBA( main, x, y, (int)( size * sin( percentage * M_PI ) ), r, g, b, 255 - (int)( 255 * percentage ) ); + +} + +void +Canvas::drawPlayerStat(int size, int index, int previousValue, int currentValue, int r, int g, int b) +{ + int w = Settings::getScreenWidth(); + int h = Settings::getScreenHeight(); + + glBegin(GL_LINE_STRIP); + glLineWidth(5); + glEnable(GL_BLEND); + glColor4f (r, g, b, index * 2); + glVertex2d(w - size + index - 1,h - previousValue); + glVertex2d( w - size + index,h - currentValue); + glEnd(); + //aalineRGBA( main, w - size + index - 1, h - previousValue, w - size + index, h - currentValue, r, g, b, index * 2 ); +} + +void +Canvas::drawMouseSelection(Coordinate &c1, Coordinate &c2) +{ +// int y1 = (c1.getYMapped()-Settings::getScreenHeight())*(-1); +// int y2 = (c2.getYMapped()-Settings::getScreenHeight())*(-1); +// if(y1 < 0) +// y1 = 0; +// if(y2 < 0) +// y2 = 0; +// if(y2 > Settings::getScreenHeight()) +// y2 = Settings::getScreenHeight(); +// if(y1 > Settings::getScreenHeight()) +// y1 = Settings::getScreenHeight(); +// c1.setYMapped(y1); +// c2.setYMapped(y2); + glEnable(GL_BLEND); + glBegin(GL_LINE_LOOP); + glColor4f(1,1,1, 1); + glVertex2d(c2.getXMapped(), (c2.getYMapped()-Settings::getScreenHeight())*(-1)); + glVertex2d(c1.getXMapped(), (c2.getYMapped()-Settings::getScreenHeight())*(-1)); + glVertex2d(c1.getXMapped(), (c1.getYMapped()-Settings::getScreenHeight())*(-1)); + glVertex2d(c2.getXMapped(), (c1.getYMapped()-Settings::getScreenHeight())*(-1)); + glEnd(); + glDisable(GL_BLEND); + //rectangleColor( main, c1.getXMapped(), c1.getYMapped(), c2.getXMapped(), c2.getYMapped(), 0xfee19080 ); +} + +void +Canvas::drawCursor(int x, int y) +{ + y = (y-Settings::getScreenHeight())*(-1); + glEnable(GL_BLEND); + glColor4f (1.0, 1.0, 1.0, 1.0); + double radius = 6; + double y1=y+radius; + double x1=x; + glBegin(GL_LINE_STRIP); + for(double angle=0.0f;angle<=(2.0f*3.14159);angle+=0.01f) + { + glLineWidth(3); + double x2=x+(radius*(float)sin((double)angle)); + double y2=y+(radius*(float)cos((double)angle)); + glVertex2d(x1,y1); + y1=y2; + x1=x2; + } + glEnd(); + glDisable(GL_BLEND); + //aacircleRGBA( main, x,y, 4, 255, 255, 255, 255 ); +} + +void +Canvas::glEnable2d() +{ + int vPort[4]; + glGetIntegerv(GL_VIEWPORT, vPort); + + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + + glOrtho(0, vPort[2], 0, vPort[3], -1, 1); + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + glDisable(GL_DEPTH_TEST); +} + +void +Canvas::glDisable2d() +{ + glEnable(GL_DEPTH_TEST); + + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); +} + +void +Canvas::initScreen() +{ + if (!openglGraphics) + openglGraphics = new gcn::OpenGLGraphics(); + + if (!font) + font = new Font("font.ttf", 18); + + SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 5 ); + SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 5 ); + SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 5 ); + SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 16 ); + SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); + + + long flags = SDL_SWSURFACE | SDL_HWSURFACE | SDL_OPENGL; + if (Settings::getFullscreen()) + flags |= SDL_FULLSCREEN; + + main = SDL_SetVideoMode( Settings::getScreenWidth(), Settings::getScreenHeight(), 0, flags); + + openglGraphics->setTargetPlane(Settings::getScreenWidth(), Settings::getScreenHeight()); +} + +void +Canvas::shutdown() +{ + delete openglGraphics; + SDL_FreeSurface(main); + main = NULL; +} + +void +Canvas::updateScreen() +{ + + glFlush(); + glFinish(); + SDL_GL_SwapBuffers(); +} + +gcn::OpenGLGraphics * +Canvas::getOpenGLGraphics() +{ + return openglGraphics; +} Deleted: branches/qonk-opengl-simple/src/canvas.h =================================================================== --- branches/qonk-opengl/src/canvas.h 2007-10-09 08:31:27 UTC (rev 129) +++ branches/qonk-opengl-simple/src/canvas.h 2007-10-12 08:50:05 UTC (rev 132) @@ -1,89 +0,0 @@ -// Copyright 2007 by Robert Schuster <rob...@fs...> - -// Basic drawing and converting operations for Qonk - -// If not explicitly told otherwise coordinate values are -// in game units. - -#ifndef CANVAS_H -#define CANVAS_H - -#include <SDL/SDL.h> - -#include "guichan/guichan/sdl.hpp" -#include "guichan/guichan/opengl.hpp" - -class Coordinate; -class Font; - -class Canvas -{ - public: - static void alphaBlend( SDL_Surface* surface, Uint8 alpha ); - - static void drawSelector( Coordinate&, Sint16 offset, - Sint16 width, Sint16 height, - Uint8 R, Uint8 G, Uint8 B ); - - static void drawNearestPlanetSelector(Coordinate&, int); - - static void drawPlanet(Coordinate&, int size, Uint32 color); - - static void drawPlanetMapped(int x, int y, int size, Uint32 color); - - static void drawResidentShip(Coordinate& shipLocation, Coordinate& planetLocation, - int color); - - static void drawFlyingShip(Coordinate&, double direction, int color); - - static void drawSelection(Coordinate&); - - static void drawOrbit(Coordinate&, double rotationDistance, int color); - - static void drawBuildProgress(Coordinate&, int, double); - - static void drawText(int, int, const char *, int, int, int, int a=255); - - static int getFontHeight(); - - static void drawBox(int x, int y, int w, int h, int r, int g, int b); - - static void drawRadar(); - - static void drawSun(); - - static void drawStar(int x, int y, int brightness); - - static void drawSonar(Coordinate coord, int size, double percentage, int r, int g, int b, bool circle); - - static void drawPlayerStat(int size, int index, int previousValue, int currentValue, int r, int g, int b); - - static void drawMouseSelection(Coordinate &c1, Coordinate &c2); - - static void drawCursor(int, int); - - static void updateScreen(); - - static void glEnable2d(); - - static void glDisable2d(); - - static void initScreen(); - - static void shutdown(); - - static gcn::OpenGLGraphics *getOpenGLGraphics(); - - private: - - static gcn::OpenGLGraphics *openglGraphics; - - static SDL_Surface* main; - - static SDL_Surface* opengl; - - static Font *font; - -}; - -#endif /* CANVAS_H */ Copied: branches/qonk-opengl-simple/src/canvas.h (from rev 130, branches/qonk-opengl/src/canvas.h) =================================================================== --- branches/qonk-opengl-simple/src/canvas.h (rev 0) +++ branches/qonk-opengl-simple/src/canvas.h 2007-10-12 08:50:05 UTC (rev 132) @@ -0,0 +1,89 @@ +// Copyright 2007 by Robert Schuster <rob...@fs...> + +// Basic drawing and converting operations for Qonk + +// If not explicitly told otherwise coordinate values are +// in game units. + +#ifndef CANVAS_H +#define CANVAS_H + +#include <SDL/SDL.h> + +#include "guichan/guichan/sdl.hpp" +#include "guichan/guichan/opengl.hpp" + +class Coordinate; +class Font; + +class Canvas +{ + public: + static void alphaBlend( SDL_Surface* surface, Uint8 alpha ); + + static void drawSelector( Coordinate&, Sint16 offset, + Sint16 width, Sint16 height, + Uint8 R, Uint8 G, Uint8 B ); + + static void drawNearestPlanetSelector(Coordinate&, int); + + static void drawPlanet(Coordinate&, int size, Uint32 color); + + static void drawPlanetMapped(int x, int y, int size, Uint32 color); + + static void drawResidentShip(Coordinate& shipLocation, Coordinate& planetLocation, + int color); + + static void drawFlyingShip(Coordinate&, double direction, int color); + + static void drawSelection(Coordinate&); + + static void drawOrbit(Coordinate&, double rotationDistance, int color); + + static void drawBuildProgress(Coordinate&, int, double); + + static void drawText(int, int, const char *, int, int, int, int a=255); + + static int getFontHeight(); + + static void drawBox(int x, int y, int w, int h, int r, int g, int b); + + static void drawRadar(); + + static void drawSun(); + + static void drawStar(int x, int y, float brightness); + + static void drawSonar(Coordinate coord, int size, double percentage, int r, int g, int b, bool circle); + + static void drawPlayerStat(int size, int index, int previousValue, int currentValue, int r, int g, int b); + + static void drawMouseSelection(Coordinate &c1, Coordinate &c2); + + static void drawCursor(int, int); + + static void updateScreen(); + + static void glEnable2d(); + + static void glDisable2d(); + + static void initScreen(); + + static void shutdown(); + + static gcn::OpenGLGraphics *getOpenGLGraphics(); + + private: + + static gcn::OpenGLGraphics *openglGraphics; + + static SDL_Surface* main; + + static SDL_Surface* opengl; + + static Font *font; + +}; + +#endif /* CANVAS_H */ Deleted: branches/qonk-opengl-simple/src/game.cpp =================================================================== --- branches/qonk-opengl/src/game.cpp 2007-10-09 08:31:27 UTC (rev 129) +++ branches/qonk-opengl-simple/src/game.cpp 2007-10-12 08:50:05 UTC (rev 132) @@ -1,377 +0,0 @@ -#include "game.h" -#include "gameoptions.h" - -#include "timer.h" -#include "planets.h" -#include "players.h" -#include "universe.h" -#include "messages.h" -#include "timer.h" -#include "settings.h" -#include "canvas.h" -#include "selection.h" - -#include "extensions.h" - -using namespace std; - -Game::Game(GameOptions &go) - : gameOptions(go), nextNumberOfPlanets(0), nextNumberOfComputerPlayers(0), timer(new Timer()), - players(0), universe(0), messages(0), selection(0) -{ - int numberOfPlanets = gameOptions.getPlanets(); - int numberOfComputerPlayers = gameOptions.getPlayers(); - - state = PLAYING; - quit = false; - timer->start(); - - // Initialize selection - x = Settings::getScreenWidth()/2; - y = Settings::getScreenHeight()/2; - xp = xn = yp = yn = 0; - - universe = new Universe( numberOfPlanets ); - - players = new Players( universe ); - universe->actionQueue->scheduleAction( 1000, new UpdatePlayersStatsAction( players) ); - - humanPlayer = new HumanPlayer( universe, 0xffffff, 1); - humanPlayer->setVisible(true); - universe->claim(0, humanPlayer, 1, 3); - players->push_back(humanPlayer); - - bool vis = gameOptions.getEnemyVisibility(); - - int hueCounter = rand() % 360; - for (int i=0;i<numberOfComputerPlayers;i++) - { - Player *newPlayer = new ComputerPlayer( universe, HSVtoRGB( hueCounter, 0.9, 0.9 ), 2); - newPlayer->setVisible(vis); - universe->claim(0, newPlayer, 1, 3); - hueCounter = ( hueCounter + 360 / numberOfComputerPlayers ) % 360; - players->push_back(newPlayer); - } - - NeutralPlayer *neutral = new NeutralPlayer(universe, 0x808080); - neutral->setVisible(vis); - universe->claimRemaining(0, neutral, 3, 2); - players->push_back(neutral); - - messages = new Messages(); - selection = new Selection(); -} - -Game::~Game() -{ - delete players; - delete universe; - delete messages; - delete selection; - delete timer; -} - -bool -Game::run(bool menuVisible) -{ - if (quit) - return false; - - // TODO: Find a way to live without the next line. - setPaused(menuVisible); - - if (timer->isPaused()) - return true; - - moveCursor(xp - xn, yp - yn); - - Uint32 time = getTime(); - // update the universe - universe->update(time); - - // let players update their states - players->update(this); - - if( state == PLAYING ) - { - if(checkLost()) { - setEnemyVisibility(true); - state = LOST; - MSGlost(this); - } - - if( checkWin()) { - nextNumberOfPlanets = gameOptions.getPlanets() + 1; - nextNumberOfComputerPlayers = gameOptions.getPlayers() + 1; - - if( nextNumberOfPlanets == 11 ) - { - int d = nextNumberOfPlanets - nextNumberOfComputerPlayers; - if( d != 1 ) - nextNumberOfPlanets = 10; - } - - MSGwon(this, nextNumberOfPlanets, nextNumberOfComputerPlayers); - state = WON; - } - } - - return true; -} - -void -Game::handle(GameAction gameAction, int value) -{ - if (timer->isPaused()) - return; - - switch (gameAction) - { - case GA_NEXT_ROUND: - if (!value) return; - if(state==WON) - { - quit = true; - } - gameOptions.setPlanets(nextNumberOfPlanets); - gameOptions.setPlayers(nextNumberOfComputerPlayers); - - break; - case GA_RESTART_ROUND: - if (!value) return; - quit = true; - break; - case GA_SELECT_ALL: - if (value) - selectAllPlanets(); - break; - case GA_TOGGLE_ENEMY_VISIBILITY: - if (value) - { - gameOptions.setEnemyVisibility(!gameOptions.getEnemyVisibility()); - setEnemyVisibility(gameOptions.getEnemyVisibility()); - } - break; - case GA_SELECTION: - if (value) - startSelection(x, y); - else - endSelection(x, y); - break; - case GA_SELECT_NEAREST_PLANET: - if (value) - selectNearestPlanet(x, y); - break; - case GA_MOVE_TO_NEAREST_PLANET: - if (value) - moveToNearestPlanet(x, y); - break; - case GA_FLEET_STRENGTH_UP: - if (value) - fleetStrengthUp(); - break; - case GA_FLEET_STRENGTH_DOWN: - if (value) - fleetStrengthDown(); - break; - case GA_SET_FLEET_STRENGTH_SINGLE: - if (value) - setFleetStrength(1); - break; - case GA_CURSOR_UP: - yn = value; - break; - case GA_CURSOR_DOWN: - yp = value; - break; - case GA_CURSOR_LEFT: - xn = value; - break; - case GA_CURSOR_RIGHT: - xp = value; - break; - default: - if (value - && gameAction >= GA_SET_FLEET_STRENGTH_10 - && gameAction <= GA_SET_FLEET_STRENGTH_100) - { - setFleetStrength(10 * (1 + gameAction - GA_SET_FLEET_STRENGTH_10)); - } - } -} - -void -Game::moveCursor(int xrel, int yrel) -{ - x += xrel; - y += yrel; - - x = max(0, min(x, Settings::getScreenWidth())); - y = max(0, min(y, Settings::getScreenHeight())); - - if (selection->isSelecting()) - selection->update(x, y); - else - universe->highlightNearestPlanet(x, y); -} - -bool -Game::checkWin() -{ - bool allPlayersDead = true; - for( Players::iterator i = players->begin(); i != players->end(); i++ ) { - if( (*i)->getTeam() == 2 ) - - if( ((ComputerPlayer*)(*i))->getPoints() > 0 ) - allPlayersDead = false; - } - - return allPlayersDead; -} - -bool -Game::checkLost() -{ - return humanPlayer->getPoints() == 0; -} - -void -Game::fleetStrengthUp() -{ - int str = humanPlayer->getFleetStrength(); - if (str == 1) - str = 10; - else if (str == 100) - str = 1; - else - str += 10; - - setFleetStrength(str); -} - -void -Game::fleetStrengthDown() -{ - int str = humanPlayer->getFleetStrength(); - if (str == 1) - str = 100; - else if (str == 10) - str = 1; - else - str -= 10; - - setFleetStrength(str); -} - -void -Game::setFleetStrength(int str) -{ - humanPlayer->setFleetStrength(str); - - stringstream s; - if (str == 1) - s << "Single ship mode"; - else - { - s << "Fleet strength " << str << "%"; - } - - messages->setFleetStrengthMessage( Message(getTime(), s.str(), 0x808080) ); -} - -void -Game::setPaused(bool p) -{ - if (p ^ timer->isPaused()) - timer->pause(); - -} - -void -Game::setEnemyVisibility(bool visible) -{ - int humanTeam = humanPlayer->getTeam(); - - for( Players::iterator i = players->begin(); i != players->end(); i++ ) - { - Player *p = *i; - if (p->getTeam() != humanTeam) - p->setVisible(visible); - } - - stringstream s; - s << "Made enemies " << (visible ? "visible" : "invisible"); - - messages->addMessage(timer->getTime(), Message(getTime(), s.str(), 20000, 0x808080)); -} - -void -Game::selectAllPlanets() -{ - humanPlayer->selectAllPlanets(); -} - -void -Game::selectNearestPlanet(int x, int y) -{ - humanPlayer->selectNearestPlanet(x, y); -} - -void -Game::moveToNearestPlanet(int x, int y) -{ - humanPlayer->moveToNearestPlanet(getTime(), x, y); -} - -void -Game::startSelection(int x, int y) -{ - selection->start(x, y); -} - -void -Game::updateSelection(int x, int y) -{ - selection->update(x, y); -} - -void -Game::endSelection(int x, int y) -{ - selection->end(); - - if (selection->isEmpty()) - humanPlayer->selectPlanetAt(x, y); - else - universe->planets->sourceSelect(selection, humanPlayer); -} - -void -Game::addMessage(int offset, Message msg) -{ - messages->addMessage( timer->getTime() + offset, msg); -} - -Uint32 -Game::getTime() const -{ - return timer->getTime(); -} - -void -Game::render() -{ - Uint32 time = getTime(); - - universe->renderBackground(time); - players->render(); - - humanPlayer->render(); - selection->render(); - - universe->renderForeground(time); - - messages->render(time); - - Canvas::drawCursor(x, y); -} Copied: branches/qonk-opengl-simple/src/game.cpp (from rev 130, branches/qonk-opengl/src/game.cpp) =================================================================== --- branches/qonk-opengl-simple/src/game.cpp (rev 0) +++ branches/qonk-opengl-simple/src/game.cpp 2007-10-12 08:50:05 UTC (rev 132) @@ -0,0 +1,379 @@ +#include "game.h" +#include "gameoptions.h" + +#include "timer.h" +#include "planets.h" +#include "players.h" +#include "universe.h" +#include "messages.h" +#include "timer.h" +#include "settings.h" +#include "canvas.h" +#include "selection.h" + +#include "extensions.h" + +using namespace std; + +Game::Game(GameOptions &go) + : gameOptions(go), nextNumberOfPlanets(0), nextNumberOfComputerPlayers(0), timer(new Timer()), + players(0), universe(0), messages(0), selection(0) +{ + int numberOfPlanets = gameOptions.getPlanets(); + int numberOfComputerPlayers = gameOptions.getPlayers(); + + state = PLAYING; + quit = false; + timer->start(); + + // Initialize selection + x = Settings::getScreenWidth()/2; + y = Settings::getScreenHeight()/2; + xp = xn = yp = yn = 0; + + universe = new Universe( numberOfPlanets ); + + players = new Players( universe ); + universe->actionQueue->scheduleAction( 1000, new UpdatePlayersStatsAction( players) ); + + humanPlayer = new HumanPlayer( universe, 0xffffff, 1); + humanPlayer->setVisible(true); + universe->claim(0, humanPlayer, 1, 3); + players->push_back(humanPlayer); + + bool vis = gameOptions.getEnemyVisibility(); + + int hueCounter = rand() % 360; + for (int i=0;i<numberOfComputerPlayers;i++) + { + Player *newPlayer = new ComputerPlayer( universe, HSVtoRGB( hueCounter, 0.9, 0.9 ), 2); + newPlayer->setVisible(vis); + universe->claim(0, newPlayer, 1, 3); + hueCounter = ( hueCounter + 360 / numberOfComputerPlayers ) % 360; + players->push_back(newPlayer); + } + + NeutralPlayer *neutral = new NeutralPlayer(universe, 0x808080); + neutral->setVisible(vis); + universe->claimRemaining(0, neutral, 3, 2); + players->push_back(neutral); + + messages = new Messages(); + selection = new Selection(); +} + +Game::~Game() +{ + delete players; + delete universe; + delete messages; + delete selection; + delete timer; +} + +bool +Game::run(bool menuVisible) +{ + if (quit) + return false; + + // TODO: Find a way to live without the next line. + setPaused(menuVisible); + + if (timer->isPaused()) + return true; + + moveCursor(xp - xn, yp - yn); + + Uint32 time = getTime(); + // update the universe + universe->update(time); + + // let players update their states + players->update(this); + + if( state == PLAYING ) + { + if(checkLost()) { + setEnemyVisibility(true); + state = LOST; + MSGlost(this); + } + + if( checkWin()) { + nextNumberOfPlanets = gameOptions.getPlanets() + 1; + nextNumberOfComputerPlayers = gameOptions.getPlayers() + 1; + + if( nextNumberOfPlanets == 11 ) + { + int d = nextNumberOfPlanets - nextNumberOfComputerPlayers; + if( d != 1 ) + nextNumberOfPlanets = 10; + } + + MSGwon(this, nextNumberOfPlanets, nextNumberOfComputerPlayers); + state = WON; + } + } + + return true; +} + +void +Game::handle(GameAction gameAction, int value) +{ + if (timer->isPaused()) + return; + + switch (gameAction) + { + case GA_NEXT_ROUND: + if (!value) return; + if(state==WON) + { + quit = true; + } + gameOptions.setPlanets(nextNumberOfPlanets); + gameOptions.setPlayers(nextNumberOfComputerPlayers); + + break; + case GA_RESTART_ROUND: + if (!value) return; + quit = true; + break; + case GA_SELECT_ALL: + if (value) + selectAllPlanets(); + break; + case GA_TOGGLE_ENEMY_VISIBILITY: + if (value) + { + gameOptions.setEnemyVisibility(!gameOptions.getEnemyVisibility()); + setEnemyVisibility(gameOptions.getEnemyVisibility()); + } + break; + case GA_SELECTION: + if (value) + startSelection(x, y); + else + endSelection(x, y); + break; + case GA_SELECT_NEAREST_PLANET: + if (value) + selectNearestPlanet(x, y); + break; + case GA_MOVE_TO_NEAREST_PLANET: + if (value) + moveToNearestPlanet(x, y); + break; + case GA_FLEET_STRENGTH_UP: + if (value) + fleetStrengthUp(); + break; + case GA_FLEET_STRENGTH_DOWN: + if (value) + fleetStrengthDown(); + break; + case GA_SET_FLEET_STRENGTH_SINGLE: + if (value) + setFleetStrength(1); + break; + case GA_CURSOR_UP: + yn = value; + break; + case GA_CURSOR_DOWN: + yp = value; + break; + case GA_CURSOR_LEFT: + xn = value; + break; + case GA_CURSOR_RIGHT: + xp = value; + break; + default: + if (value + && gameAction >= GA_SET_FLEET_STRENGTH_10 + && gameAction <= GA_SET_FLEET_STRENGTH_100) + { + setFleetStrength(10 * (1 + gameAction - GA_SET_FLEET_STRENGTH_10)); + } + } +} + +void +Game::moveCursor(int xrel, int yrel) +{ + x += xrel; + y += yrel; + + x = max(0, min(x, Settings::getScreenWidth())); + y = max(0, min(y, Settings::getScreenHeight())); + + if (selection->isSelecting()) + selection->update(x, y); + else + universe->highlightNearestPlanet(x, y); +} + +bool +Game::checkWin() +{ + bool allPlayersDead = true; + for( Players::iterator i = players->begin(); i != players->end(); i++ ) { + if( (*i)->getTeam() == 2 ) + + if( ((ComputerPlayer*)(*i))->getPoints() > 0 ) + allPlayersDead = false; + } + + return allPlayersDead; +} + +bool +Game::checkLost() +{ + return humanPlayer->getPoints() == 0; +} + +void +Game::fleetStrengthUp() +{ + int str = humanPlayer->getFleetStrength(); + if (str == 1) + str = 10; + else if (str == 100) + str = 1; + else + str += 10; + + setFleetStrength(str); +} + +void +Game::fleetStrengthDown() +{ + int str = humanPlayer->getFleetStrength(); + if (str == 1) + str = 100; + else if (str == 10) + str = 1; + else + str -= 10; + + setFleetStrength(str); +} + +void +Game::setFleetStrength(int str) +{ + humanPlayer->setFleetStrength(str); + + stringstream s; + if (str == 1) + s << "Single ship mode"; + else + { + s << "Fleet strength " << str << "%"; + } + + messages->setFleetStrengthMessage( Message(getTime(), s.str(), 0x808080) ); +} + +void +Game::setPaused(bool p) +{ + if (p ^ timer->isPaused()) + timer->pause(); + +} + +void +Game::setEnemyVisibility(bool visible) +{ + int humanTeam = humanPlayer->getTeam(); + + for( Players::iterator i = players->begin(); i != players->end(); i++ ) + { + Player *p = *i; + if (p->getTeam() != humanTeam) + p->setVisible(visible); + } + + stringstream s; + s << "Made enemies " << (visible ? "visible" : "invisible"); + + messages->addMessage(timer->getTime(), Message(getTime(), s.str(), 20000, 0x808080)); +} + +void +Game::selectAllPlanets() +{ + humanPlayer->selectAllPlanets(); +} + +void +Game::selectNearestPlanet(int x, int y) +{ + humanPlayer->selectNearestPlanet(x, y); +} + +void +Game::moveToNearestPlanet(int x, int y) +{ + humanPlayer->moveToNearestPlanet(getTime(), x, y); +} + +void +Game::startSelection(int x, int y) +{ + selection->start(x, y); +} + +void +Game::updateSelection(int x, int y) +{ + selection->update(x, y); +} + +void +Game::endSelection(int x, int y) +{ + selection->end(); + + if (selection->isEmpty()) + humanPlayer->selectPlanetAt(x, y); + else + universe->planets->sourceSelect(selection, humanPlayer); +} + +void +Game::addMessage(int offset, Message msg) +{ + messages->addMessage( timer->getTime() + offset, msg); +} + +Uint32 +Game::getTime() const +{ + return timer->getTime(); +} + +void +Game::render() +{ + Uint32 time = getTime(); + + + messages->render(time); + + universe->renderBackground(time); + players->render(); + + humanPlayer->render(); + + universe->renderForeground(time); + + selection->render(); + + Canvas::drawCursor(x, y); +} Deleted: branches/qonk-opengl-simple/src/main.cpp =================================================================== --- branches/qonk-opengl/src/main.cpp 2007-10-09 08:31:27 UTC (rev 129) +++ branches/qonk-opengl-simple/src/main.cpp 2007-10-12 08:50:05 UTC (rev 132) @@ -1,288 +0,0 @@ -// Copyright 2005 by Anthony Liekens an...@li... - -#ifdef HAVE_CONFIG_H -# include "config.h" -#else -#define VERSION no-version -#endif - -#include <sstream> -#include <string> - -#include "sdl_driver.h" -#include "settings.h" - -#include "canvas.h" - -#include "game.h" -#include "main.h" - -#include "menumanager.h" -#include "videooptions.h" -#include "gameoptions.h" - - -using namespace std; - -Main::Main() - : game(0), running(true), lastTicks(0), fpsCounter(0), fps(0) -{ - driver = new SDLDriver(*this); - menuManager = new MenuManager(*this); -} - -Main::~Main() -{ - delete menuManager; - delete driver; -} - -void -Main::startSinglePlayerGame(int planets, int players) -{ - GameOptions &gameOptions = menuManager->getGameOptions(); - - if( planets <= 1 ) - { - cerr << "Resetting to least of 2 planets" << endl; - planets = 2; - } - - if( players > planets - 1 ) - { - cerr << "Resetting computer players to maximum of " << planets - 1 << endl; - players = planets - 1; - } - - if( players < 1 ) - { - cerr << "Resetting computer players to at least 1" << endl; - players = 1; - } - - gameOptions.setPlanets(planets); - gameOptions.setPlayers(players); - - startSinglePlayerGame(gameOptions); -} - -void -Main::startSinglePlayerGame(GameOptions &gameOptions) -{ - if (game) - { - delete game; - game = 0; - } - - menuManager->hide(); - - game = new Game(gameOptions); - game->setPaused(false); -} - -void -Main::quit() -{ - running = false; -} - -void -Main::showMenu() -{ - if (menuManager->isVisible()) - return; - - menuManager->show(); - - // Just in case there is a game, pause it. - if (game) - game->setPaused(true); - -} - -void -Main::applyVideoOptions(VideoOptions &videoOptions) -{ - // Causes the game to pause which is nice when the CRT/TFT is resyncing. - showMenu(); - - Settings::setFullscreen(videoOptions.getFullscreen()); - Settings::setScreenSize(videoOptions.getScreenWidth(), videoOptions.getScreenHeight()); - - Canvas::initScreen(); - - menuManager->resize(); -} - -void -Main::handle(GameAction gameAction, int value) -{ - switch (gameAction) - { - case GA_SENSE_CANCEL: - if (!value) - menuManager->senseFinished(false); - break; - case GA_SENSE_COMPLETE: - if (!value) - menuManager->senseFinished(true); - break; - case GA_TOGGLE_FULLSCREEN: - if (value) return; - { - VideoOptions &vo = menuManager->getVideoOptions(); - vo.toggleFullscreen(); - applyVideoOptions(vo); - } - break; - case GA_LEAVE: - // It is important to act on keyrelease since this is the same - // for what guichan reacts. By doing so it is predictable that - // after handling GA_LEAVE (which may make the menusystem visible) - // guichan's logic is called. - if (value) - return; - - // Main does not care about making the menu system invisible. This is done - // from inside the menu system. - if (!menuManager->isVisible()) - menuManager->show(); - - break; - case GA_SCREENSHOT: - if (value) - return; - - SDL_SaveBMP( SDL_GetVideoSurface(), "screenshot.bmp" ); - break; - default: - // Let the game instance handle the rest - if (game) - game->handle(gameAction, value); - break; - } -} - -void -Main::renderFPS() -{ - stringstream s; - - fpsCounter++; - - s << fps; - - Canvas::drawText( Settings::getScreenWidth() - 50, Settings::getScreenHeight() - 50, s.str().c_str(), 0x80, 0x80, 0x80 ); - - if( SDL_GetTicks() - lastTicks >= 1000 ) { - lastTicks = SDL_GetTicks(); - fps = fpsCounter; - fpsCounter = 0; - } - -} - -void -Main::run() -{ - bool b; - - // Main loop: loop forever. - while (running) { - //Canvas::drawBo... [truncated message content] |