Mercurial > hg > Members > koba > t_dandy
diff sgoex.c @ 0:435ac1cdb64e
create task dandy directry.
author | koba <koba@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 11 Dec 2010 21:25:28 +0900 |
parents | |
children | 00c3272a801f |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sgoex.c Sat Dec 11 21:25:28 2010 +0900 @@ -0,0 +1,409 @@ +/* + スプライト管理関数 +*/ + +//#include<libps.h> +#include <stdio.h> +#include <SDL.h> +#include "SDL_image.h" +#include "SDL_opengl.h" +#include "texture.h" +#include "object.h" +#include "tree_controll.h" +#include "sgoex.h" +#include "trace.h" +#include "syokika.h" +#include "LoadSprite.h" + + +#define OT_LENGTH 1 /* オーダリングテーブル */ +#define MAXOBJ 320 /*スプライト表示上限 */ + +#define TRUE 1 +#define FALSE 0 + + +//static u_short tpage; +//static SDL_Rect rect; + +//static int nActiveBuff; /*ばふぁ */ +// int i; /* Multi-purpose */ +//static int pageno; + +//static int padd; + +static const int sgo_tpx[12] = +{ 0, 64, 128, 192, 256, 320, 0, 64, 128, 192, 256, 320 }; +static const int sgo_tpy[12] = { 0, 0, 0, 0, 0, 0, 256, 256, 256, 256, 256, 256 }; + +/* sgo.h 独自の変数形 */ +SpriteTable sptable[DEFOBJ]; +// static SpriteView spview[MAXOBJ]; + +#define IMAGE_ADJUSTMENT (0) + +/** + * 一つの画像をpageno(page number)で区切るtexture_page_offsetで + * pagenoに対応した領域のx,yを用意しておく。PlayStationではpageno + * で区切る必要があったのだろうが、PS2では全く意味はなさない。 + */ +static const struct texture_page_offset { + int x; + int y; +} texpage_offset[] = { + {0, 0}, {128 + IMAGE_ADJUSTMENT, 0}, {256 + IMAGE_ADJUSTMENT, 0}, {384 + IMAGE_ADJUSTMENT, 0}}; + +/*------------------------------------------------------------- + 関数プロトタイプ + ---------------------------------------------------------------*/ + +void DefSpriteEx(int number, short middlex, short middley) +{ + sptable[number].mx = middlex; + sptable[number].my = middley; +} + + +void SDL_GL_Enter2DMode() +{ + // SDL_Surface *sc = SDL_GetVideoSurface(); + + /* Note, there may be other things you need to change, + depending on how you have your OpenGL state set up. + */ + glPushAttrib(GL_ENABLE_BIT); + glDisable(GL_DEPTH_TEST); + glDisable(GL_CULL_FACE); + glEnable(GL_TEXTURE_2D); + + /* This allows alpha blending of 2D textures with the scene */ + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + glViewport(0, 0, screen->w, screen->h); + + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + + glOrtho(0.0, (GLdouble)screen->w, (GLdouble)screen->h, 0.0, 0.0, 1.0); + + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + + // glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); +} + + +void SDL_GL_Leave2DMode() +{ + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); + + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + + glPopAttrib(); +} + + +static int power_of_two(int input) +{ + int value = 1; + + while ( value < input ) { + value <<= 1; + } + return value; +} + + +void DefSprite(int number, const char *name, float w, float h, int color, OBJECT *obj) +{ + SURFACE *surfaces; + surfaces = search_node(obj, name); + if(surfaces == NULL) + { + fprintf(stderr, "can't get node\n"); + printf("%s", name); + SDL_Quit(); + exit(1); + } + sptable[number].w = w; + sptable[number].h = h; + sptable[number].color = (color & 32); + sptable[number].mx = w / 2; + sptable[number].my = h / 2; + sptable[number].tex_w = power_of_two(sptable[number].w); + sptable[number].tex_h = power_of_two(sptable[number].h); + texMinX[number] = 0.0f; + texMinY[number] = 0.0f; + texMaxX[number] = (GLfloat)sptable[number].w / sptable[number].tex_w; + texMaxY[number] = (GLfloat)sptable[number].h / sptable[number].tex_h; + printf("texMaxX = %f, w = %d, tex_w = %d\n", + texMaxX[number], sptable[number].w, sptable[number].tex_w); + sptable[number].texture = surfaces->texture; +} + +void PutSprite(int zorder, short x, short y, int number) +{ + glBindTexture(GL_TEXTURE_2D, (GLuint)sptable[number].texture); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glBegin(GL_QUADS); + glTexCoord2f(texMinX[number],texMinY[number]); glVertex2i((GLuint)x, (GLuint)y ); + glTexCoord2f(texMinX[number],texMaxY[number]); glVertex2i((GLuint)x, (GLuint)(y+sptable[number].tex_h) ); + glTexCoord2f(texMaxX[number],texMaxY[number]); glVertex2i((GLuint)(x+sptable[number].tex_w), (GLuint)(y+sptable[number].tex_h)); + glTexCoord2f(texMaxX[number],texMinY[number]); glVertex2i((GLuint)(x+sptable[number].tex_w), (GLuint)y); + glEnd(); + glDisable(GL_BLEND); +} + +void PutSpriteEx(int number, int x, int y, float scalex, float scaley, float angle) +{ + SpriteTable *m = &sptable[number]; + x -= m->w; + y -= m->h; + + SDL_GL_Enter2DMode(); + glEnable(GL_TEXTURE_2D); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glBindTexture(GL_TEXTURE_2D, (GLuint)sptable[number].texture); + glTranslatef(x + m->w/2, y + m->h/2, 0.0); + glRotatef(angle, 0.0, 0.0, 1.0); + glScalef(scalex, scaley, 1.0); + glBegin(GL_TRIANGLE_STRIP); + { + glTexCoord2f(texMinX[number], texMinY[number]); glVertex2i(-m->w/2, -m->h/2); + glTexCoord2f(texMaxX[number], texMinY[number]); glVertex2i( m->w/2, -m->h/2); + glTexCoord2f(texMinX[number], texMaxY[number]); glVertex2i(-m->w/2, m->h/2); + glTexCoord2f(texMaxX[number], texMaxY[number]); glVertex2i( m->w/2, m->h/2); + } + glEnd(); + glDisable(GL_TEXTURE_2D); + glDisable(GL_BLEND); + SDL_GL_Leave2DMode(); + // SDL_GL_SwapBuffers(); +} + + + +struct SGO_PAD pad[2]; + +#ifdef ENABLE_TRACEMODE +extern int runmode; +#endif //ENABLE_TRACEMODE + +/* コントローラ状態の読み込み */ +void Pad(SDL_Joystick *joy) +{ + Sint16 axis; + + SDL_JoystickUpdate(); + + if(SDL_JoystickGetButton(joy,PS2_CROSS)==SDL_PRESSED) + pad[0].k0++; + else + pad[0].k0=0; + + if(SDL_JoystickGetButton(joy,PS2_CIRCLE)==SDL_PRESSED) + pad[0].k1++; + else + pad[0].k1=0; + + if(SDL_JoystickGetButton(joy,PS2_SQUARE)==SDL_PRESSED) + pad[0].k3++; + else + pad[0].k3=0; + + if(SDL_JoystickGetButton(joy,PS2_TRIANGLE)==SDL_PRESSED) + pad[0].k4++; + else + pad[0].k4=0; + + if(SDL_JoystickGetButton(joy,PS2_L1)==SDL_PRESSED) + pad[0].l1++; + else + pad[0].l1=0; + + if(SDL_JoystickGetButton(joy,PS2_R1)==SDL_PRESSED) + pad[0].r1++; + else + pad[0].r1=0; + + if(SDL_JoystickGetButton(joy,PS2_L2)==SDL_PRESSED) + pad[0].l2++; + else + pad[0].l2=0; + + if(SDL_JoystickGetButton(joy,PS2_R2)==SDL_PRESSED) + pad[0].r2++; + else + pad[0].r2=0; + + if(SDL_JoystickGetButton(joy,PS2_START)==SDL_PRESSED) + pad[0].st++; + else + pad[0].st=0; + + if(SDL_JoystickGetButton(joy,PS2_SELECT)==SDL_PRESSED) + pad[0].se++; + else + pad[0].se=0; + + if(SDL_JoystickGetButton(joy,PS2_L3)==SDL_PRESSED) + pad[0].l3++; + else + pad[0].l3=0; + + if(SDL_JoystickGetButton(joy,PS2_R3)==SDL_PRESSED) + pad[0].r3++; + else + pad[0].r3=0; + //x + axis=SDL_JoystickGetAxis(joy,0); + if(axis>=3200){ + pad[0].left=0; + pad[0].right++; + } + else if(axis<=-3200){ + pad[0].right=0; + pad[0].left++; + } + else { + pad[0].right=0; + pad[0].left=0; + } + //y + axis=SDL_JoystickGetAxis(joy,1); + if(axis>=3200){ + pad[0].up=0; + pad[0].down++; + } + else if(axis<=-3200){ + pad[0].down=0; + pad[0].up++; + } + else { + pad[0].down=0; + pad[0].up=0; + } + + if ((pad[0].l1 != 0) && (pad[0].r1 != 0) && + (pad[0].l2 != 0) && (pad[0].r2 != 0) && + (pad[0].st != 0) && (pad[0].se != 0)) { + pad[0].quit = 1; + } else { + pad[0].quit = 0; + } + +} + + +void keybord() +{ + SDL_PumpEvents(); + Uint8 *keys = SDL_GetKeyState(NULL); + + if (keys[SDLK_UP]) { + pad[0].up++; + } else { + pad[0].up = 0; + } + if (keys[SDLK_DOWN]) { + pad[0].down++; + } else { + pad[0].down = 0; + } + + if (keys[SDLK_RIGHT]) { + pad[0].right++; + } else { + pad[0].right = 0; + } + + if (keys[SDLK_LEFT]) { + pad[0].left++; + } else { + pad[0].left = 0; + } + + if (keys[SDLK_a]) { + pad[0].k0++; + } else { + pad[0].k0 = 0; + } + + if (keys[SDLK_z]) { + pad[0].k1++; + } else { + pad[0].k1 = 0; + } + + if (keys[SDLK_s]) { + pad[0].k3++; + } else { + pad[0].k3 = 0; + } + + if (keys[SDLK_x]) { + pad[0].k4++; + } else { + pad[0].k4 = 0; + } + + if (keys[SDLK_r]) { + pad[0].r2++; + } else { + pad[0].r2 = 0; + } + + if (keys[SDLK_e]) { + pad[0].r1++; + } else { + pad[0].r1 = 0; + } + + if (keys[SDLK_w]) { + pad[0].l1++; + } else { + pad[0].l1 = 0; + } + + if (keys[SDLK_q]) { + pad[0].l2++; + } else { + pad[0].l2 = 0; + } + + // START ボタンは Return が似合う気がする + //if(keys[SDLK_1]) + if (keys[SDLK_RETURN]) { + pad[0].st++; + } else { + pad[0].st = 0; + } + + if (keys[SDLK_2]) { + pad[0].se++; + } else { + pad[0].se = 0; + } + + if (keys[SDLK_ESCAPE]) { + SDL_Quit(); + exit(1); + //pad[0].st = 1; + //pad[0].se = 1; + } + + if (keys[SDLK_0]) { + pad[0].quit = 1; + } else { + pad[0].quit = 0; + } +} +