rss· 投稿· 设为首页· 加入收藏· 繁體版
当前位置: 火魔网 » 程序开发 » ObjC

扫雷OpenGL Objective-C版

打包文件:
学习Objective C,练习一下。
以下  MineField.h
//  扫雷_ObjC //  Created by G.M. on 09-11-20.
//  Copyright 2009 __MyCompanyName__. All rights reserved. //#import <Foundation/Foundation.h>
#import <Cocoa/Cocoa.h> typedef struct{
GLenum MineExist; //地雷是否存在
GLenum Flag; //旗标
GLenum Explored; //是否被探索过
GLuint MinesSurrounding;//周围雷的个数
}mineunit; typedef struct{
unsigned int x;
unsigned int y;
GLenum ShouldDraw;
}blockindex;//雷块坐标 typedef struct{
unsigned int Count;
blockindex *data;
}queue;//处理队列,为了能放射状打开区域 @interface MineField : NSObject {
unsigned int blocksize,dx,dy,sx,sy;
unsigned int BoardX,BoardY;
unsigned int NumberOfMines;
unsigned int BlocksExplored; GLfloat dd; GLfloat mine_specular[4];
GLfloat mine_shineness[1];
GLfloat white_light[4];
GLfloat lmodel_ambient[4]; GLfloat* light_position;
GLfloat* new_light_position; GLuint MINEBLOCK; //地雷区块材质
GLuint MINE; //地雷材质
GLuint FLAG; //旗标材质
GLuint BLANK; //点开的空白材质
GLuint NUMBER[8]; //1~8数字 GLuint QUAD;//方块的显示列表
mineunit** MineArray;//存储整个雷区的信息
queue BlocksQueue; @property GLuint MINEBLOCK,MINE,FLAG,BLANK;
-(void)Init_BX:(unsigned int) BX BY:(unsigned int) BY NOM:(unsigned int) NOM;
-(void) Initialize;//初始化
-(void) Refresh;//刷新缓存
-(void) DrawABlock_TexName:(GLuint) texName X:(int) x Y:(int) y LIGHT:(GLenum )LIGHT;//画一个块
-(GLenum) CheckBlock_X:(int) x Y:(int )y; //点击一个区块调用此例程,检查该块并处理
-(void) CheckBlocksSurrounding_X:(int)x Y:(int)y;//检查周围的区块,为CheckBlock服务
-(void) DrawAPattern_TexName:(GLuint)texName X:(int) x Y:(int) y;//画标志如数字和旗标,带透明度信息,无光照
-(void) DrawHighlight_X:(int) x Y:(int) y;//鼠标移到某个块上后高亮
-(void) DrawBlankEffects_X:(int) x Y:(int) y ALPHA:(GLfloat) alpha;//淡出打开,点开一块区域时的特效
-(void) ReDraw:(GLenum) GameStopped;//重画整个窗口
-(void) SetLightPosition: (GLfloat*) l; //设置光源位置
-(void) ShowAllMines;//显示所有雷
-(void)SetTextureParameter;
-(unsigned int)dx;
-(unsigned int)dy;
-(unsigned int)blocksize;
-(unsigned int)BoardX;
-(unsigned int)BoardY;
-(unsigned int)NumberOfMines;
-(unsigned int)BlocksExplored;
-(GLfloat*)light_position;
-(GLfloat*)new_light_position;
-(mineunit**)MineArray;
@end以下MineField.m //  MineField.m
//  扫雷_ObjC //  Created by G.M. on 09-11-20.
//  Copyright 2009 __MyCompanyName__. All rights reserved.
// #import "MineField.h" #import <GLUT/glut.h>
#import <stdio.h>
#import "imagedata.h" @implementation MineField @synthesize MINE,MINEBLOCK,BLANK,FLAG; -(void)Init_BX:(unsigned int) BX BY:(unsigned int) BY NOM:(unsigned int) NOM BoardX=BX;BoardY=BY;NumberOfMines=NOM;
blocksize=16;dx=1;dy=1;sx=1;sy=1;
dd=0.5/(float)BoardY; -(void)dealloc int i;
free(light_position);
free(new_light_position);
for (i=0; i<BoardY; i++) {
free(*(MineArray+i)); free(MineArray);
free(BlocksQueue.data);
[super dealloc]; -(void) Initialize//初始化 int i,j,x,y;
mine_specular[0]=1.0;
mine_specular[1]=1.0;
mine_specular[2]=1.0;
mine_specular[3]=1.0;
mine_shineness[0]=18.0;
white_light[0]=1.0;
white_light[1]=1.0;
white_light[2]=1.0;
white_light[3]=1.0;
lmodel_ambient[0]=0.4;
lmodel_ambient[1]=0.4;
lmodel_ambient[2]=1.0;
lmodel_ambient[3]=1.0;
light_position=(GLfloat*)malloc(4*sizeof(GLfloat));
new_light_position=(GLfloat*)malloc(4*sizeof(GLfloat));
new_light_position[0]=light_position[0]=0.0;
new_light_position[1]=light_position[1]=0.5;
new_light_position[2]=light_position[2]=0.9;
new_light_position[3]=light_position[3]=1.0;
glShadeModel(GL_SMOOTH);
glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR);
glMaterialfv(GL_FRONT, GL_SPECULAR, mine_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mine_shineness); glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glLightfv(GL_LIGHT0, GL_DIFFUSE, white_light);
glLightfv(GL_LIGHT0, GL_SPECULAR, mine_specular);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 0.2);
glLightf(GL_LIGHT0,GL_LINEAR_ATTENUATION,0.9);
glLightf(GL_LIGHT0,GL_QUADRATIC_ATTENUATION,0.9); glEnable(GL_LIGHT0); glGenTextures(1, &MINE);
glBindTexture(GL_TEXTURE_2D, MINE);
[self SetTextureParameter];
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, mine_image);    glGenTextures(1, &MINEBLOCK);
glBindTexture(GL_TEXTURE_2D, MINEBLOCK);
[self SetTextureParameter];
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 16, 16, 0, GL_RGB, GL_UNSIGNED_BYTE, mineblock_image); glGenTextures(1, &FLAG);
glBindTexture(GL_TEXTURE_2D, FLAG);
[self SetTextureParameter];
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, flag_image); for (i=0; i<768; i++) {
blank_image[i]=255; glGenTextures(1, &BLANK);
glBindTexture(GL_TEXTURE_2D, BLANK);
[self SetTextureParameter];
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 16, 16, 0, GL_RGB, GL_UNSIGNED_BYTE, blank_image);
glGenTextures(8, NUMBER); glBindTexture(GL_TEXTURE_2D, NUMBER[0]);
[self SetTextureParameter];
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, n1_image); glBindTexture(GL_TEXTURE_2D, NUMBER[1]);
[self SetTextureParameter];
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, n2_image); glBindTexture(GL_TEXTURE_2D, NUMBER[2]);
[self SetTextureParameter];
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, n3_image); glBindTexture(GL_TEXTURE_2D, NUMBER[3]);
[self SetTextureParameter];
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, n4_image); glBindTexture(GL_TEXTURE_2D, NUMBER[4]);
[self SetTextureParameter];
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, n5_image); glBindTexture(GL_TEXTURE_2D, NUMBER[5]);
[self SetTextureParameter];
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, n6_image); glBindTexture(GL_TEXTURE_2D, NUMBER[6]);
[self SetTextureParameter];
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, n7_image); glBindTexture(GL_TEXTURE_2D, NUMBER[7]);
[self SetTextureParameter];
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, n8_image);
glEnable(GL_TEXTURE_2D); //创建显示列表
QUAD=glGenLists(1);
glNewList(QUAD, GL_COMPILE);
glBegin(GL_QUADS);
glNormal3f(0, 0, 1);
glTexCoord2f(0.0, 0.0);
glVertex3f(0,0,0); glNormal3f(0, 0, 1);
glTexCoord2f(0.0, 1.0);
glVertex3f(0,dd,0); glNormal3f(0, 0, 1);
glTexCoord2f(1.0, 1.0);
glVertex3f(dd,dd,0); glNormal3f(0, 0, 1);
glTexCoord2f(1.0, 0.0);
glVertex3f(dd,0,0);
glEnd();
glEndList();
////init data////
MineArray=malloc(BoardX*sizeof(mineunit*));
for (i=0; i<BoardX; i++) {
*(MineArray+i)=malloc(BoardY*sizeof(mineunit)); for (i=0; i<BoardX; i++)for(j=0;j<BoardY;j++) MineArray[i][j].MineExist=GL_FALSE;
MineArray[i][j].Flag=GL_FALSE;
MineArray[i][j].Explored=GL_FALSE; srand(time(NULL));
i=0;
while(i<NumberOfMines){
x=(float)abs(rand())/RAND_MAX*BoardX;
y=(float)abs(rand())/RAND_MAX*BoardY;
if(MineArray[x][y].MineExist==GL_FALSE){
MineArray[x][y].MineExist=GL_TRUE;
i++; }
for(i=0;i<BoardX;i++)
for(j=0;j<BoardY;j++) MineArray[i][j].MinesSurrounding=0;
if (i>0&&j>0)
if(MineArray[i-1][j-1].MineExist==GL_TRUE)
MineArray[i][j].MinesSurrounding++;
if (i>0)
if(MineArray[i-1][j].MineExist==GL_TRUE)
MineArray[i][j].MinesSurrounding++;
if(i>0&&j<BoardY-1)
if(MineArray[i-1][j+1].MineExist==GL_TRUE)
MineArray[i][j].MinesSurrounding++;
if (j<BoardY-1)
if(MineArray[i][j+1].MineExist==GL_TRUE)
MineArray[i][j].MinesSurrounding++;
if (j>0)
if(MineArray[i][j-1].MineExist==GL_TRUE)
MineArray[i][j].MinesSurrounding++;
if(i<BoardX-1&&j<BoardY-1)
if(MineArray[i+1][j+1].MineExist==GL_TRUE)
MineArray[i][j].MinesSurrounding++;
if(i<BoardX-1)
if(MineArray[i+1][j].MineExist==GL_TRUE)
MineArray[i][j].MinesSurrounding++;
if(i<BoardX-1&&j>0)
if(MineArray[i+1][j-1].MineExist==GL_TRUE)
MineArray[i][j].MinesSurrounding++; BlocksQueue.Count=0;
BlocksQueue.data=malloc(BoardX*BoardY*sizeof(blockindex));
BlocksExplored=0; } -(void) Refresh//刷新缓存 glutSwapBuffers(); -(void) DrawABlock_TexName:(GLuint) texName X:(int) x Y:(int) y LIGHT:(GLenum )LIGHT//画一个块 unsigned int tx,ty;
float bx,by;
//we draw a block with OpenGL lighting so it looks similar to that in vista
if(LIGHT==GL_TRUE)glEnable(GL_LIGHTING);
tx=x*(dx+blocksize)+sx;ty=y*(dy+blocksize)+sy;
glViewport(tx+50, ty+50 , blocksize, blocksize);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
bx=x*dd;by=y*dd;
glOrtho(bx, bx+dd, by, by+dd, -1, 1);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texName);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(bx, by, 0);
glCallList(QUAD);
glLoadIdentity();
glDisable(GL_LIGHTING); -(GLenum) CheckBlock_X:(int) x Y:(int )y; //点击一个区块调用此例程,检查该块并处理 unsigned int PreviousCount,t1,t2,i,j;
if(MineArray[x][y].MineExist==GL_TRUE)return GL_FALSE;
else {
if (MineArray[x][y].Explored==GL_FALSE) {
MineArray[x][y].Explored=GL_TRUE;
BlocksExplored++; [self DrawABlock_TexName:BLANK X: x Y: y LIGHT: GL_TRUE];
if (MineArray[x][y].MinesSurrounding!=0) {
[self DrawAPattern_TexName:NUMBER[MineArray[x][y].MinesSurrounding-1] X: x Y: y]; else{ BlocksQueue.Count=0;
PreviousCount=1;
[self CheckBlocksSurrounding_X:x Y:y];
new_light_position[0]=(float)x/BoardX*0.5;
new_light_position[1]=(float)y/BoardY*0.5;
new_light_position[2]=light_position[2];
while(PreviousCount<BlocksQueue.Count){
t1=PreviousCount;t2=BlocksQueue.Count;PreviousCount=BlocksQueue.Count+1;
if(t1<50){
for(j=1;j<4;j++){
for (i=t1; i<=t2; i++) {
[self DrawBlankEffects_X:BlocksQueue.data[i].x Y:BlocksQueue.data[i].y ALPHA:j*0.25];
if(MineArray[BlocksQueue.data[i].x][BlocksQueue.data[i].y].MinesSurrounding!=0){
[self DrawAPattern_TexName:NUMBER[MineArray[BlocksQueue.data[i].x][BlocksQueue.data[i].y].MinesSurrounding-1]
X:BlocksQueue.data[i].x
Y:BlocksQueue.data[i].y]; usleep((int)((1-t1/50.0)*70000));
[self Refresh]; }
for (i=t1; i<=t2; i++) {
[self DrawABlock_TexName:BLANK X:BlocksQueue.data[i].x Y:BlocksQueue.data[i].y LIGHT:GL_TRUE];
if(MineArray[BlocksQueue.data[i].x][BlocksQueue.data[i].y].MinesSurrounding!=0){
[self DrawAPattern_TexName:NUMBER[MineArray[BlocksQueue.data[i].x][BlocksQueue.data[i].y].MinesSurrounding-1]
X:BlocksQueue.data[i].x
Y:BlocksQueue.data[i].y]; }
[self Refresh];
for(i=t1;i<=t2;i++)
if(MineArray[BlocksQueue.data[i].x][BlocksQueue.data[i].y].MinesSurrounding==0)
[self CheckBlocksSurrounding_X:BlocksQueue.data[i].x Y:BlocksQueue.data[i].y];       
usleep(1000); } return GL_TRUE;
} -(void) CheckBlocksSurrounding_X:(int)x Y:(int)y//检查周围的区块,为CheckBlock服务 if(x>0&&y>0)
if(MineArray[x-1][y-1].Explored==GL_FALSE){
BlocksQueue.data[++BlocksQueue.Count].x=x-1;
BlocksQueue.data[BlocksQueue.Count].y=y-1;
MineArray[x-1][y-1].Explored=GL_TRUE;
BlocksExplored++; if(x>0)
if(MineArray[x-1][y].Explored==GL_FALSE){
BlocksQueue.data[++BlocksQueue.Count].x=x-1;
BlocksQueue.data[BlocksQueue.Count].y=y;
MineArray[x-1][y].Explored=GL_TRUE;
BlocksExplored++; if(x>0&&y<BoardY-1)
if(MineArray[x-1][y+1].Explored==GL_FALSE){
BlocksQueue.data[++BlocksQueue.Count].x=x-1;
BlocksQueue.data[BlocksQueue.Count].y=y+1;
MineArray[x-1][y+1].Explored=GL_TRUE;
BlocksExplored++; if(y<BoardY-1)
if(MineArray[x][y+1].Explored==GL_FALSE){
BlocksQueue.data[++BlocksQueue.Count].x=x;
BlocksQueue.data[BlocksQueue.Count].y=y+1;
MineArray[x][y+1].Explored=GL_TRUE;
BlocksExplored++; if(y>0)
if(MineArray[x][y-1].Explored==GL_FALSE){
BlocksQueue.data[++BlocksQueue.Count].x=x;
BlocksQueue.data[BlocksQueue.Count].y=y-1;
MineArray[x][y-1].Explored=GL_TRUE;
BlocksExplored++; if(x<BoardX-1&&y<BoardY-1)
if(MineArray[x+1][y+1].Explored==GL_FALSE){
BlocksQueue.data[++BlocksQueue.Count].x=x+1;
BlocksQueue.data[BlocksQueue.Count].y=y+1;
MineArray[x+1][y+1].Explored=GL_TRUE;
BlocksExplored++; if(x<BoardX-1)
if(MineArray[x+1][y].Explored==GL_FALSE){
BlocksQueue.data[++BlocksQueue.Count].x=x+1;
BlocksQueue.data[BlocksQueue.Count].y=y;
MineArray[x+1][y].Explored=GL_TRUE;
BlocksExplored++; if(x<BoardX-1&&y>0)
if(MineArray[x+1][y-1].Explored==GL_FALSE){
BlocksQueue.data[++BlocksQueue.Count].x=x+1;
BlocksQueue.data[BlocksQueue.Count].y=y-1;
MineArray[x+1][y-1].Explored=GL_TRUE;
BlocksExplored++; } -(void) DrawAPattern_TexName:(GLuint)texName X:(int) x Y:(int) y//画标志如数字和旗标,带透明度信息,无光照 glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
[self DrawABlock_TexName:texName X:x Y:y LIGHT:GL_FALSE];
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
[self DrawABlock_TexName:texName X:x Y:y LIGHT:GL_FALSE];
glDisable(GL_BLEND);
} -(void) DrawHighlight_X:(int) x Y:(int) y//鼠标移到某个块上后高亮 int tx,ty;
tx=x*(dx+blocksize)+sx;ty=y*(dy+blocksize)+sy;
glViewport(tx+50, ty+50 , blocksize, blocksize);
//now we highlight the selected block with OpenGL lighting
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, 1, 0, 1, -10, 10);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glDisable(GL_LIGHTING);
glDisable(GL_TEXTURE_2D);
glColor4f(1.0, 1.0, 1.0, 0.6);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
glRectf(0, 0, 1, 1);
glDisable(GL_BLEND); -(void) DrawBlankEffects_X:(int) x Y:(int) y ALPHA:(GLfloat) alpha;//淡出打开,点开一块区域时的特效 glEnable(GL_BLEND);
glBlendColor(alpha, alpha, alpha, alpha);
glBlendFunc(GL_CONSTANT_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA);
[self DrawABlock_TexName:BLANK X:x Y:y LIGHT:GL_TRUE]; 
glDisable(GL_BLEND); -(void) ReDraw:(GLenum) GameStopped//重画整个窗口 int i,j;
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
for(i=0;i<BoardX;i++)
for(j=0;j<BoardY;j++) if(MineArray[i][j].Explored==GL_TRUE){
[self DrawABlock_TexName:BLANK X:i Y:j LIGHT:GL_TRUE];
if(MineArray[i][j].MinesSurrounding!=0)
[self DrawAPattern_TexName:NUMBER[MineArray[i][j].MinesSurrounding-1] X:i Y:j]; }
else if (GameStopped&&MineArray[i][j].MineExist==GL_TRUE){
[self DrawABlock_TexName:BLANK X:i Y:j LIGHT:GL_TRUE];
[self DrawAPattern_TexName:MINE X: i Y: j]; else{
[self DrawABlock_TexName:MINEBLOCK X:i Y:j LIGHT:GL_TRUE];
if(MineArray[i][j].Flag==GL_TRUE)
[self DrawAPattern_TexName:FLAG X: i Y: j]; } }   
-(void) SetLightPosition:(GLfloat*)l //设置光源位置 if(l!=light_position) light_position[0]=l[0];
light_position[1]=l[1];
light_position[2]=l[2]; glLightfv(GL_LIGHT0, GL_POSITION, light_position);
} -(void) ShowAllMines//显示所有雷 int i,j;
for (i=0; i<BoardX; i++)
for(j=0;j<BoardY;j++)
if(MineArray[i][j].MineExist==GL_TRUE){
[self DrawABlock_TexName:BLANK X: i Y:j LIGHT: GL_TRUE];
[self DrawAPattern_TexName:MINE X: i Y:j];
} [self Refresh];
} -(void)SetTextureParameter glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); -(unsigned int)dx return dx; -(unsigned int)dy return dy; -(unsigned int)blocksize return blocksize; -(unsigned int)BoardX return BoardX; -(unsigned int)BoardY return BoardY; -(unsigned int)NumberOfMines return NumberOfMines; -(unsigned int)BlocksExplored return BlocksExplored; -(mineunit **)MineArray return MineArray; -(GLfloat*)light_position return light_position; -(GLfloat*)new_light_position return new_light_position; @end以下main.m
#import <Foundation/Foundation.h>
#import <GLUT/GLUT.h>
#import <math.h>
#import <time.h>
#import "MineField.h" GLuint BoardSizeX,BoardSizeY; int BlockSelectedIndex[2]={-1,-1};
int CurrentIndex[2]={-1,-1}; GLenum BlockSelected=GL_FALSE;
GLenum GameStarted=GL_FALSE;
GLenum GameStopped=GL_FALSE; MineField* MF; GLfloat light_position[4]={0.0,0.5,0.9,1.0}; void UpdateScreen(int t); void passiveMotion(int x,int y){
int i,j;
if(!GameStopped){
glutTimerFunc(50, NULL, 0);
if(!(x-1<50|y-1<50|x>50+BoardSizeX-1|y>50+BoardSizeY-1)){
i=(x-50-MF.dx)/(MF.blocksize+1);j=MF.BoardY-1-(y-50-MF.dy)/(MF.blocksize+1);
CurrentIndex[0]=i;CurrentIndex[1]=j;
if(MF.MineArray[i][j].Explored==GL_FALSE)
[MF DrawHighlight_X:i Y:j]; else CurrentIndex[0]=-1; }
void mouseDown(int button,int state,int x,int y){
int i,j;
if(!GameStopped){
if(!(x-1<50|y-1<50|x>BoardSizeX+50-1|y>BoardSizeY+50-1)){
i=(x-50-MF.dx)/(MF.blocksize+1);j=MF.BoardY-1-(y-50-MF.dy)/(MF.blocksize+1);
if(button==GLUT_RIGHT_BUTTON&&state==GLUT_DOWN){
if (MF.MineArray[i][j].Explored==GL_FALSE)
if (MF.MineArray[i][j].Flag==GL_FALSE&&MF.MineArray[i][j].Explored==GL_FALSE){
MF.MineArray[i][j].Flag=GL_TRUE;
[MF DrawAPattern_TexName:MF.FLAG X:i Y:j]; else {
MF.MineArray[i][j].Flag=GL_FALSE;
[MF DrawABlock_TexName:MF.MINEBLOCK X:i Y:j LIGHT:GL_TRUE];
[MF DrawHighlight_X:i Y:j]; else if(button==GLUT_LEFT_BUTTON&&state==GLUT_DOWN){
//there is a flag
if(MF.MineArray[i][j].Flag==GL_FALSE&&MF.MineArray[i][j].Explored==GL_FALSE){
[MF DrawABlock_TexName:MF.BLANK X:i Y:j LIGHT:GL_TRUE];
BlockSelectedIndex[0]=i;BlockSelectedIndex[1]=j;
BlockSelected=GL_TRUE; else BlockSelected=GL_FALSE; if(button==GLUT_LEFT_BUTTON&&state==GLUT_UP){
if(BlockSelected==GL_TRUE&&BlockSelectedIndex[0]==i&&BlockSelectedIndex[1]==j){
if([MF CheckBlock_X:i Y:j]==GL_FALSE){
GameStopped=GL_TRUE;
[MF ShowAllMines]; else if (MF.BoardX*MF.BoardY-MF.BlocksExplored==MF.NumberOfMines) {
GameStopped=GL_TRUE;
printf("win\n"); }
else if (BlockSelected==GL_TRUE&&MF.MineArray[BlockSelectedIndex[0]][BlockSelectedIndex[1]].Explored==GL_FALSE){
[MF DrawABlock_TexName:MF.MINEBLOCK X: BlockSelectedIndex[0] Y: BlockSelectedIndex[1] LIGHT: GL_TRUE]; void idle(){
glutIdleFunc(NULL);
glutTimerFunc(50, UpdateScreen, 0);
//usleep(70000); void UpdateScreen(int t){
int k,c;
GLfloat ldx,ldy; if(fabs(MF.light_position[0]-MF.new_light_position[0])>1e-3||fabs(MF.light_position[1]-MF.new_light_position[1])>1e-3)
c=10;
else c=1;
if(c>1)printf("a");
ldx=(MF.new_light_position[0]-MF.light_position[0])/c;ldy=(MF.new_light_position[1]-MF.light_position[1])/c;
for(k=0;k<c;k++){
[MF ReDraw:GameStopped];
if(CurrentIndex[0]>-1&&MF.MineArray[CurrentIndex[0]][CurrentIndex[1]].Explored==GL_FALSE&&!GameStopped)
[MF DrawHighlight_X:CurrentIndex[0] Y: CurrentIndex[1]];
if(c>1){
MF.light_position[0]+=ldx;MF.light_position[1]+=ldy;
[MF SetLightPosition:MF.light_position]; [MF Refresh];
usleep(1000); glutIdleFunc(idle); void display(){
if (!GameStarted) {
[MF ReDraw:GameStopped];
[MF Refresh];
GameStarted=GL_TRUE; }
void initOpenGL(){
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
BoardSizeX=(1+MF.blocksize)*MF.BoardX+1;BoardSizeY=(1+MF.blocksize)*MF.BoardY+1;
glutInitWindowSize(BoardSizeX+100,BoardSizeY+100);
glutInitWindowPosition(0, 0);
glutCreateWindow("Mine Sweeper");
glViewport(50, 50, BoardSizeX, BoardSizeY); int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
MF=[[MineField alloc] init];
glutInit(&argc, (char **)argv);
[MF Init_BX:30 BY:30 NOM:130];
initOpenGL();
[MF Initialize]; glutDisplayFunc(display);
glutPassiveMotionFunc(passiveMotion);
glutMouseFunc(mouseDown);
glutIdleFunc(idle);
glutMainLoop();
[MF dealloc];
[pool drain];
return 0;
顶一下
(0)
踩一下
(0)