home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ring.yamanashi.ac.jp/pub/pc/freem/action/
/
action.zip
/
spout11.zip
/
SDL
/
piece.c
< prev
next >
Wrap
C/C++ Source or Header
|
2002-10-12
|
5KB
|
279 lines
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <sys\stat.h>
#include <fcntl.h>
#include <math.h>
#include "SDL.h"
#include "piece.h"
#include "font.h"
SDL_Surface *video, *layer;
SDL_Rect layerRect;
unsigned char *vBuffer = NULL;
void pceLCDDispStop()
{
}
void pceLCDDispStart()
{
}
void initSDL() {
SDL_PixelFormat *pfrm;
if(SDL_Init(SDL_INIT_VIDEO) < 0) {
fprintf(stderr, "Couldn't initialize SDL: %s\n",SDL_GetError());
exit(1);
}
atexit(SDL_Quit);
video = SDL_SetVideoMode(SDL_WIDTH, SDL_HEIGHT, 8, SDL_DOUBLEBUF | SDL_HWSURFACE | SDL_HWPALETTE);
if(video == NULL) {
fprintf(stderr, "Couldn't set video mode: %s\n", SDL_GetError());
exit(1);
}
pfrm = video->format;
layer = SDL_CreateRGBSurface(SDL_SWSURFACE, SDL_WIDTH, SDL_HEIGHT, 8, pfrm->Rmask, pfrm->Gmask, pfrm->Bmask, pfrm->Amask);
if(layer == NULL) {
fprintf(stderr, "Couldn't create surface: %s\n", SDL_GetError());
exit(1);
}
layerRect.x = 0;
layerRect.y = 0;
layerRect.w = SDL_WIDTH;
layerRect.h = SDL_HEIGHT;
{
static SDL_Color pltTbl[4] = {
{255, 255, 255},
{170, 170, 170},
{85, 85, 85},
{0, 0, 0}
};
SDL_SetColors(video, pltTbl, 0, 4);
SDL_SetColors(layer, pltTbl, 0, 4);
}
}
void pceLCDTrans() {
int x, y;
unsigned char *vbi, *bi;
bi = layer->pixels;
for(y = 0; y < SDL_HEIGHT; y ++) {
vbi = vBuffer + (y / ZOOM) * 128;
for(x = 0; x < SDL_WIDTH; x ++) {
*bi ++ = *(vbi + x / ZOOM);
}
bi += layer->pitch - SDL_WIDTH;
}
SDL_BlitSurface(layer, NULL, video, &layerRect);
SDL_Flip(video);
}
unsigned char *keys;
int pcePadGet() {
static int pad = 0;
int i = 0, op = pad & 0x00ff;
int k[] = {
SDLK_UP, SDLK_DOWN, SDLK_LEFT, SDLK_RIGHT,
SDLK_KP8, SDLK_KP2, SDLK_KP4, SDLK_KP6,
SDLK_x, SDLK_z, SDLK_SPACE, SDLK_RETURN,
SDLK_ESCAPE, SDLK_LSHIFT, SDLK_RSHIFT
};
int p[] = {
PAD_UP, PAD_DN, PAD_LF, PAD_RI,
PAD_UP, PAD_DN, PAD_LF, PAD_RI,
PAD_A, PAD_B, PAD_A, PAD_B,
PAD_C, PAD_D, PAD_D,
-1
};
pad = 0;
do {
if(keys[k[i]] == SDL_PRESSED) {
pad |= p[i];
}
i ++;
} while(p[i] >= 0);
pad |= (pad & (~op)) << 8;
return pad;
}
int interval = 0;
void pceAppSetProcPeriod(int period) {
interval = period;
}
int exec = 1;
void pceAppReqExit(int c) {
exec = 0;
}
unsigned char *pceLCDSetBuffer(unsigned char *pbuff)
{
if(pbuff) {
vBuffer = pbuff;
}
return vBuffer;
}
int font_posX = 0, font_posY = 0, font_width = 4, font_height = 6;
unsigned char font_fgcolor = 3, font_bgcolor = 0, font_bgclear = 0;
const char *font_adr = FONT6;
void pceFontSetType(int type)
{
const int width[] = {5, 8, 4};
const int height[] = {10, 16, 6};
const char* adr[] ={FONT6, FONT16, FONT6};
type &= 3;
font_width = width[type];
font_height = height[type];
font_adr = adr[type];
}
void pceFontSetTxColor(int color)
{
font_fgcolor = (unsigned char)color;
}
void pceFontSetBkColor(int color)
{
if(color >= 0) {
font_bgcolor = (unsigned char)color;
font_bgclear = 0;
} else {
font_bgclear = 1;
}
}
void pceFontSetPos(int x, int y)
{
font_posX = x;
font_posY = y;
}
int pceFontPrintf(const char *fmt, ...)
{
unsigned char *adr = vBuffer + font_posX + font_posY * 128;
unsigned char *pC;
char c[1024];
va_list argp;
va_start(argp, fmt);
vsprintf(c, fmt, argp);
va_end(argp);
pC = c;
while(*pC) {
int i, x, y;
const unsigned char *sAdr;
if(*pC >= 0x20 && *pC < 0x80) {
i = *pC - 0x20;
} else {
i = 0;
}
sAdr = font_adr + (i & 15) + (i >> 4) * 16 * 16;
for(y = 0; y < font_height; y ++) {
unsigned char c = *sAdr;
for(x = 0; x < font_width; x ++) {
if(c & 0x80) {
*adr = font_fgcolor;
} else if(font_bgclear == 0) {
*adr = font_bgcolor;
}
adr ++;
c <<= 1;
}
adr += 128 - font_width;
sAdr += 16;
}
adr -= 128 * font_height - font_width;
pC ++;
}
}
int pceFileOpen(FILEACC *pfa, const char *fname, int mode)
{
if(mode == FOMD_RD) {
*pfa = open(fname, O_RDONLY | O_BINARY);
} else if(mode == FOMD_WR) {
*pfa = open(fname, O_CREAT | O_RDWR | O_BINARY | O_TRUNC, S_IREAD | S_IWRITE);
}
if(*pfa >= 0) {
return 0;
} else {
return 1;
}
}
int pceFileReadSct(FILEACC *pfa, void *ptr, int sct, int len)
{
return read(*pfa, ptr, len);
}
int pceFileWriteSct(FILEACC *pfa, const void *ptr, int sct, int len)
{
return write(*pfa, ptr, len);
}
int pceFileClose(FILEACC *pfa)
{
close(*pfa);
return 0;
}
int main(int argc, char *argv[])
{
SDL_Event event;
long nextTick, wait;
int cnt = 0;
initSDL();
pceAppInit();
SDL_WM_SetCaption("spout", NULL);
nextTick = SDL_GetTicks() + interval;
while(exec) {
SDL_PollEvent(&event);
keys = SDL_GetKeyState(NULL);
wait = nextTick - SDL_GetTicks();
if(wait > 0) {
SDL_Delay(wait);
}
pceAppProc(cnt);
// SDL_Flip(video);
nextTick += interval;
cnt ++;
if((keys[SDLK_ESCAPE] == SDL_PRESSED && (keys[SDLK_LSHIFT] == SDL_PRESSED || keys[SDLK_RSHIFT] == SDL_PRESSED)) || event.type == SDL_QUIT) {
exec = 0;
}
}
pceAppExit();
}