C語言游戲模型飛機(jī)編程實(shí)現(xiàn)_第1頁
C語言游戲模型飛機(jī)編程實(shí)現(xiàn)_第2頁
C語言游戲模型飛機(jī)編程實(shí)現(xiàn)_第3頁
C語言游戲模型飛機(jī)編程實(shí)現(xiàn)_第4頁
C語言游戲模型飛機(jī)編程實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

C語言游戲模型(飛機(jī))編程實(shí)現(xiàn)

用C語言編寫一個(gè)有關(guān)飛機(jī)的小游戲,首先要解決游戲中主要元素:飛機(jī)模型的屏幕繪

圖。是繪二維平面圖還是繪三維立體圖?下面用三維立體圖繪制它,如下圖所示:

圖1、飛機(jī)模型圖

圖2、飛機(jī)模型圖

上面兩幅圖是在VC6中用OpenGL函數(shù)繪制的屏幕三維飛機(jī)模型,它的表面數(shù)據(jù)用雙二

次Nurbs曲面生成。

一、光(光照)

在屏幕上繪制的三維圖形,要用光照亮它同而產(chǎn)生明暗變化,才能使繪制的圖形更能真

實(shí)地再現(xiàn)要生成的物體。在OpenGL函數(shù)里有專門用于光照的函數(shù),只要調(diào)用它們就能還原

一個(gè)真實(shí)的模似三維世界,

二、Nurbs曲面

生成曲面的一種算法,這里主要用的是雙二次曲面。程序中飛機(jī)機(jī)身的設(shè)計(jì)基本上是一

個(gè)圓柱體。用7個(gè)頂點(diǎn)表示的一個(gè)正方形利用NURBS二次圓弧構(gòu)成一個(gè)整圓,描繪圓柱體

的外形數(shù)據(jù)。

下面是一個(gè)雙二次NURBS曲面和曲線的算法源程序:

/include"gl'gl.h”

Sincludc"math,h”

B樣條基函數(shù)計(jì)算部分*

〃計(jì)算所有非零B樣條基函數(shù)并返回其值

〃i為參數(shù)u所在的節(jié)點(diǎn)區(qū)間下標(biāo)

voidBasisFunction(inti,intp,floatu,floatU[],floatN[])

(

intj,di,dp,k;

floattul,tur,left,right;

floattmpN[50][50];

for(k=0;k<=p;k++)

(

dp=0:

for(di=i+p-k;di>=i-k:di--)

(

if(u>=U[di]&&u<U[di+l])

tmpN[di][0]=l;

else

tmpN[di][0]=0;

dp+=l;

for(j=l;j<dp;j++)

(

tul=U[di4j]-U[di];

tur=U[di^j+l]-U[di+l];

if(tul!=d)

left=(u-U[di])/tul;

else

left=0;

if(tur!=d)

right=(U[di+j+l]-u)/tur;

else

right=0;

tmpN[di][j]=left*tmpN[di][j-l]+right*tmpN[di+l][j~l];

)

N[i-k]=tmpN[i-k][p];

}

)

〃*-*-*-*-*_*_*_*-*-*_*-*T-*Bezier曲線曲面部分*

voidBcrnsteinFunc(inin,doubleu,floatB[])

{

doubleul;

intj,k;

B[0]=1.0;

ul=l.0-u;

for(j=l;j<=n;j++)

(

floatsaved=0.0;

for(k=0;k<j;k++)

(

floattemp=B[k];

B[k]=float(saved+ul*temp);

saved=float(u*temp):

}

B[j]=saved:

)

)

〃獲取P次Bezier曲線上的1ines個(gè)點(diǎn)的值

voidBczicrPoint(intp,floatpx[],floatpy[],floatpz[],intlines,floattmp[][3])

(

floatBC[20];

inti,j;

for(j=0;j<=lines;j++)

(

doublet=j/(float)lines:

BernsteinFunc(p,t.BC):

tmp[j][0]=tmp[j][l]=tmp[j][2]=0;

for(i=0:i<p+l:i++)

(

tmp[j][0]+=BC[i]*px[i];

tmp[j][l]+=BC[i]*py[i]:

[2]+=BC[i]*pz[i];

)

〃獲取P次行理Bezier曲線上的1incs個(gè)點(diǎn)的值

voidNBezierPoint(intp,flDatpx[],floatpy[],floatpz[],floatpw[],intlines,floattmp[][4])

floatx,y,z,w,BC[20]:

inti,j;

for(j=0:j<=lines;j++)

(

doublet=j/(float)lines:

BernsteinFunc(p,t.BC);

x=y=z=w=0;

for(i=0;i<p+l;i++)

(

x+=BC[i]*px[i]*pw[i];

y+=BC[i]*py[i]*pw[i];

z+=BC[i]*pz[i]*pw[i];

w+-=BC[i]*pw[i];

)

tmp[j][0]=x/w;

tmp[j][l]=y/w:

tmp[j][2]=z/w;

tmp[j][3]=w;

}

)

〃繪制P次的Bezier曲線

voidBczier(intp,floatpx[],floatpy[],floatpz[],intlines)

(

floatpt[100][3];

intj;

BezierPoint(p,px,py,pz,lines,pt):

for(j=l:j<=lines;j++)

(

glBegin(GL_LINES);

glVertex3f(pt[j-l][0],[1],pt[j-1][2]);

glVertex3f(pt[j][0],pt[j][1],pt[j][2]);

glEnd();

}

}

//----------------------------------------------------------------------------

〃繪制p次的有理BezieWlIl線

voidNBezier(intp,floatpx[Lfloatpy[],floatpz[],floatw[],intlines)

floatpt[100][4];

intj:

NBezierPoint(p,px,py,pz,w,lines,pt);

for(j=l:j<=lines;j++)

(

glBegin(GLLINES);

glVertex3f(pt[j-1][0],pt[j-l][1],pt[j-l][2]);

glVertex3f(pt[j][0],pt[j][1],pt[j][2]);

glEnd();

}

)

//---------------------------------------------------------------------------------------------

〃計(jì)算雙p次Bezier曲面上所有的點(diǎn)并保存在Pt口□口中

〃11和\,分別為曲面(u,v)方向上的網(wǎng)格數(shù)

voidBezierFacePoint(intp,intu,intv,floatpx[][4],floatpy[][4],floatpz[][4],float

pt[161][161][3])

(

floaturxfll][161],ury[l1][161],urz[ll][161];

floattx[ll],ty[ll],ts[ll],tmp[161][3];

inti,j,k;

for(j=0;j<p+l;j++)

I

for(i=0;i<p+l;i+4)

(

tx[l]=px[l][JJ;

ty[i]=py[i]L];

tz[i]=pz[i][J;

}

BezierPoint(p,tx,ty,tz,v,tmp);

for(k=0;k<=v;k++)

(

urx[j][k]=tmp[k][0];

ury[j][k]=tmp[k][1];

urz[j][k]=tmp[k][2];

}

)

for(i=0;i<=v;i++)

(

for(k=0;k<p+l;k+4)

(

lx[k]=urx[k][i];

ty[k]=ury[k][i];

tz[k]=urz[k][i];

BezierPoint(p,tx,ty,tz,u,tmp);

for(j=0:j<=u;j++)

(

pt[i][j][0]=tmp[j][0];

pt[i][j][l]=tmp[j][l];

pt[i][j][2]=tmp[j]⑵;

|

)

)

〃計(jì)算雙P次有理Bezier曲面上所有的點(diǎn)并保存在Pl口口口中

〃11和、,分別為曲面(u,v)方向上的網(wǎng)格數(shù)

voidNuBezierFacePoint(intp,intu,intv,floatpx[][4],floatpy[][4],floatpz[][4],float

w[][4],floatpt[161][161][3])

(

floaturx[11][161],ur/[l[161],urw[l1][161];

floattx[ll],ty[11],tw[ll],tmp[161][4];

inti,j,k;

for(j=0;j<p+l;j++)

(

for(i=0;i<p+l;i+-f)

(

tx[i]=px[i][-];

ty[i]=py[i][J;

tz[i]=pz[i][;];

lw[i]=w⑴[j];

}

NBezierPoint(p,tx,ty,tz,tw,v,tmp);

for(k=0;k<=v;k++)

(

urx[j][k]=tmp[k][0];

ury[j][k]=tmp[k][1];

urz[j][k]=tmp[k][2];

urw[j][k]=tmp[k][3];

)

}

for(i=0;i<=v;i++)

(

for(k=0;k<p+l;k+^)

tx[k]=urx[k][i]:

ty[k]=ury[k][i]:

tz[k]=urz[k][i];

tw[k]=urw[k][i]:

}

NBezierPoint(p,tx,ty,tz,tw,u,tmp);

for(j=0;j<=u;j++)

(

pt[i][j][O]=tmp[j][0];

pt[i][j][l]=tmp[j][1]:

Pt[i][j][2]=tmp[j][2];

}

)

)

B樣條曲線曲面部分_*

〃計(jì)算曲線上的點(diǎn)(U所對(duì)應(yīng)的所有點(diǎn))保存在Poi口中

//n=m-p-l

//p為曲線的次數(shù)

voidBSplinePoint(intn,intp,floatU[],floatP[],floatPoi[])

(

floatN[100],tmp;

inti,j;

for(i=p+l;i<=n;i++)

(

BasisFunction(i,p,U[i],U,N);

tmp=0;

for(j=i;j>=i-p;j—)

tmp+=N[j]*P[j];

Poi[i-p]=tmp;

)

)

〃計(jì)算次樣條曲線上的所有控制多邊形保存在CP口中

/幾為節(jié)點(diǎn)矢量U口的最大下標(biāo)

voidB2SplineControlPoint(intm,floatU[],floatP[],floatCP[])

{

intn,k,tm,i,cp,p;

floatPoi[100];

P=2;

n=m-p-l;

BSplinePoint(n,p,U,P,Poi);

cp=(n-p)*2+p;

for(i=0;i<2:i++)

CP[i]=P[i];

CP[cp]=P[n];

tm=2;

for(i=2;i<cp-l:i+=2)

I

k=(int)i/2:

CP[i]=Poi[k];

CP[i+l]=P[tm];

tm++:

}

)

〃繪制次B樣條曲線

//m為節(jié)點(diǎn)矢量U口的最大下標(biāo)

voidBSpline2L(intm,floatU[],floatpx[],floatpy[],floatpz[])

|

floatpcx[100],pcy[100],pcz[100],drx[3],dry[3],drz[3];

inti,j,tmcp;

B2SplineControlPoint(n,U,px,pcx);

B2SplineControlPoint(n,U,py,pcy);

B2SplineControlPoint(n,U,pz,pcz);

tmcp=m-5;

for(i=0;i<=tmcp;i++)

I

for(j=i*2;j<i*2+3;j++)

(

drx[j-i*2]=pcx[j];

dry[j-i*2]=pcy[j];

drz[j-i*2]=pcz[j];

}

Bezier(2,drx,dry,drz,20);

}

)

〃計(jì)算雙二次(x2)B樣條曲面所有控制多邊形頂點(diǎn),并保存在pl□□口中

//mu,mv分別為節(jié)點(diǎn)矢量U[],V[]的最大下標(biāo)值

voidBS2FaceConlrolPoint(inimu,I'loatU[],intmv,floatV[],floatpx[],floatpy[],float

pz[],floatpt[100][100][3])

(

inti,j,k,dp;

floattmx[50],tmy[50],tmz[50];

floattmpx[50][100],tiipy[50][100],tmpz[50][100];

floatuvx[100][100],u/y[100][100],uvz[100][100];

for(i=0:i<mv-2:i++)

dp=i*(mu-2);

for(j=dp;j<mu-2+dp;j++)

(

tmx[j-dp]=px[j];

tray[j-dp]=py[j]:

tmz[j-dp]=pz[j];

}

B2SplineControlPoint(mu,U,tmx,tmpx[i]):

B2SplineControlPoint(mu,U,tmy,tmpy[i]):

B2SplincControlPoint(mu,U,tmz,tmpz[i]);

)

for(i=0;i<2*mu-7;i++)

(

for(j=0;j<mv2;j")

(

tmx[j]=tmpx[j][i];

tmy[j]=tmpy[j][i];

tmz[j]=tmpz[j][i];

}

B2SplineControlPoint(mv,V,tmx,uvx[i]):

B2SplineControlPoint(mv,V,tmy,uvy[iJ);

B2SplineControlPoint(mv,V,tmz,uvz[i]):

for(k=0;k<2*mv-7;k++)

(

Pt[i][k][0]=uvx[i][k];

pt[i][k][l]=uvy[i][k];

pt[i][k][2]=uvz[i][k];

}

}

}

〃設(shè)置網(wǎng)格數(shù)

voidSctGridCount(intdt,inttu,inttmk[])

(

inti,tm;

tm=tu%dt;

for(i=0;i<dt-l:i++)

tmkLi]=(tu-tm)/dt;

tmk[dt-l]=tmk[O]+tm;

)

//計(jì)算雙二次(2x2次)B樣條曲面上所有的點(diǎn)并保存在bs口口口中

//nu,mv分別為節(jié)點(diǎn)矢量U[],V□的最大下標(biāo)

//uk,vk分別為B樣條曲面(u,v)方向上的網(wǎng)格數(shù)

//P為曲面的次數(shù)

voidBSplineFace2P(intnu,floatU[],intuk,intmv,floatV[],intvk,

floatpx[]ffloatpy[],floatpz[],floatbs[161][161][3])

{

intudk[20],vdk[20],i.j,k,1,hu,sv,du,dv,p=2;

floattp[100][100][3],td[161][161][3];

floattmx[4][4],tmy[4][4],tmz[4][4];

du=nu-2*p;

dv=mv-2*p;

SctGridCount(du,uk,udk);

SetGridCount(dv,vk,vdk);

BS2FaceControlPoint(nu,U,mv,V,px,py,pz,tp);

for(i=0;i<dv;i++)

I

for(k=0;k<du;kii)

(

for(j=i*p;j<p+l+i*p;j++)

(

for(1=k*p;l<p+1+k*p;1++)

(

tm>:[j-i*p][l-k*p]=tp[l][j][0]:

tmy[J-i*p][l-k*p]=tp[l][j][1];

tmZ[--i*p][l-k*p]=tp[l][j][2]:

)

)

BezierFacePoint(p,udkLk],vdk[i],tmx,tmy,tmz,id);

for(sv=i*vdk[0];sv<=vdk[i]+i*vdk[0];sv++)

(

for(hu=k*udk[0];hu<=udk[k]+k*udk[0];hu++)

(

bs[sv][hu][0]=td[sv-i*vdk[0J][hu-k*udk[0]][0];

bs[sv][hu][l]=td[sv-i*vdk[O]][hu-k*udk[0]][1];

bs[sv][hu][2]=td[sv-i*vdk[0]][hu-k*udk[0]][2];

)

)

}

)

)

Nurbs樣條曲線曲而部分

〃計(jì)算\urbs曲線上的點(diǎn)(u所對(duì)應(yīng)的所有點(diǎn))保存在Poi口中

//n=m-p-l

//p為曲線的次數(shù)

voidNurbsPoint(intn,intp,floatU[],floatP[],floatW[],floatPoi[])

floatN[100],tmp,tmw:

inti,j;

for(i=p+l;i<=n:i++)

(

BasisFunction(i,p,U,N);

tmp=0;tmw=0:

for(j=i;j>=i-p;j-)

(

tmp+=N[j]*P[j]*W[j];

tmw+=N[j]*W[j];

}

Poi[i-p]tmp/tmw:

)

)

〃計(jì)算次Nurbs曲線上的所有控制多邊形保存在CP口中

//m為節(jié)點(diǎn)矢量U口的最大下標(biāo)

voidNurbs2ControlPoint(intm,floatU[],floatP[],floatVl],floatCP[])

(

intn,k,tm,i,cp,p;

floatPoi[100];

P=2:

n=m-p-l;

NurbsPoint(n,p,U,P,W,Poi):

cp=(n-p)*2+p;

for(i=0;i<2:i++)

CPfi]=P⑴;

CP[cp]=P[n];

tm=2;

for(i=2;i<cp-l;i+=2)

(

k=(inl)i/2;

CP[i]=Poi[k];

CP[i+l]=P[tm];

tm++;

)

)

〃繪制次Nurbs樣條曲線

//m為節(jié)點(diǎn)矢量U口的最大下標(biāo)

voidNurbs2L(intm,floatU[],floatpx[],floatpy[],floatpz[],floatW[])

floatpcx[100],pcy[100],pcz[100],drx[3],dry[3],drz[3];

floatpew[100],drw[3];

inti,j,tmep;

Nurbs2ControlPoint(m,U,px,W,pcx):

Nurbs2ControlPoint(m,U,py,W,pey);

Nurbs2ControlPoint(m,U,pz,W,pez);

B2SplinoControlPoint(n,U,W,pew):

tmcp=nr5;

for(i=0;i<=tmcp;i++)

(

for(j=i*2;j<i*2+3;j++)

(

drx[j-i*2]=pcx[j];

dry[j-i*2]=pcy[j];

drz[j-i*2]=pcz[j];

drw[ji*2]=pcw[j];

)

NBezier⑵drx,dry,drz,drw,20);

}

)

〃計(jì)算雙二次(x2)Nurbs樣條曲面所有控制多邊形頂點(diǎn),并保存在pt□□口中

〃mu,mv分別為節(jié)點(diǎn)矢量U[],V口的最大卜標(biāo)值

voidNurbs2FControlPoint(intmu,floatU口,intmv,floatV[],floatpx[],floatpy[],float

pz[],floatW[],floatpt[100][1001[4])

{

inti,j,k,dp;

floattmx[50],tmy[50],tmz[50],tmw[50];

floattmpx[50][100],tnpy[50][100],tmpz[50][100],tmpw[50][100];

floatuvx[100][100],u/y[100J[100],uvz[100][100],uvw[100][100J;

for(i=0:i<mv-2:i++)

(

dp=i*(mu-2);

for(j=dp;j<mu-2+dp;j++)

(

tmx[j-dp]=px[j];

tmy[j-dp]=py[j];

tmz[j-dp]=pz[j];

tmw[j-dp]=W[j];

)

Nurbs2ControlPoint(mu,U,tmx,tmw,tmpx[i]);

Nurbs2ControlPoint(mu,(J,tmy,tmw,tmpy[i]):

Nurbs2ControlPoint(mu,U,tmz,Imw,tmpz[i]);

B2SplineControlPoint(mu,U,tmw,tmpw[i]);

)

for(i=0;i<2*mu-7;i++)

(

for(j=0;j<mv-2;j^+)

(

tmx[j]=tmpx[j][i];

tmy[j]=tmpy[j][i]:

tmz[j]=tmpz[j][i];

tmw[j]=tmpw[j][i];

}

Nurbs2ControlPoint(mv,V,tmx,tmw,uvx[i]);

Nurbs2ControlPoint(mv,V,tmy,tmw,uvy[i]);

Nurbs2ControlPoint(mv,V,tmz,tmw,uvz[i]);

B2SplineControlPoint(mv,V,tmw,uvw[i]);

for(k=0;k<2*mv-7;k++)

(

pt[i][k][O]=uvx[i][k];

pt[i][k][l]=uvy[i][k];

pt[i][k][2]=uvz[i][k];

pt[i][k][3]=uvw[i][k];

}

)

)

〃計(jì)算雙一次(2x2次)Nurbs樣條曲面上所有的點(diǎn)并保存在bs口□口中

〃nu,mv分別為節(jié)點(diǎn)矢量U[],V口的最大下標(biāo)

//uk,vk分別為B樣條曲面(u,v)方向上的網(wǎng)格數(shù)

//p為曲面的次數(shù)

voidNurbsFace(intnu,floatU[],intuk,intmv,floatV[],intvk,

floatpx[],floatpy[],floatpz[],floatw[],floatbs[161][161][3])

(

intudk[20],vdk[20],i:j,k,1,hu,sv,du,dv,p=2;

floattp[100][100][4],td[161][161][3];

floattmx[4][4],tmy[4][4],tmz[4][4]?tmw[4][4];

du=nu-2*p;

dv=mv-2*p;

SetGridCount(du,uk,udk):

SctGridCount(dv,vk,vdk);

Nurbs2FControlPoint(nu,U,mv,V,px,py,pz,w,tp);

for(i=0;i<dv;i++)

for(k=0;k<du;k++)

for(j=i*p;j<p+l+i*p;j++)

(

for(l=k*p:Kp+l+k*p;1++)

(

tmx[j-i*p][l-k*p]=tp[l][j][0];

tmy[j-i*p][l-k*p]=tp[l][j][l];

tmz[j-i*p][l-k*p]=tp[l][j][2]:

tmw[j-i*p][l-k*p]=tp[l][j][3]:

)

)

NuBczierFacePoint(p,udk[k],vdk[i],tmx,tmy,tn?,tmw,td);

for(sv=i*vdk[0]:sv<=vdk[i]+i*vdk[0];sv++)

(

for(hu=k*udk[0];hu<=udk[k]+k*udk[0];hu-H-)

{

bs[sv][hu][0]=td[svi*vdk[0]][huk*udk[O]][0];

bs[sv][hu][l]=td[sv-i*vdk[O]][hu-k*udk[O]][1];

bs[$v][hu][2]=td[sv-i*vdk[0]][hu-k*udk[0]][2];

)

)

}

)

)

〃*_*-*-*_*-*-*-*-*-*-*-*r-*-*繪制曲面部分

〃計(jì)算多邊形的外法線返回值1硒口

voidgetN(floatx[3],floaty[3],floatzL3],floattmN[3])

{

floatpl,p2,p3,ql,q2,q3:

pl=x[l]-x[0];

p2=y[l]-y[0]:

p3=z[l]-z[0];

ql=x[2]-x[l];

q2=y|;2]-y[l];

q3=z[2]-z[l];

tmN[0]=p2*q3-q2*p3;

tmN[1]=q1*p3-p1*q3;

tmN[2]=pl*q2-p2*q1:

)

〃顯示B樣條曲面

〃fill取值為或

voidShowSurfacedntu,intv,floatbs[161][161][3],intfill)

inti,j;

floatx[3],y[3],z[3],tmn[3];

for(i=0;i<=v:i++)

(

for(j=0;j<=u:j++)

(

if(fill!=0)

(

x[0]=bs[i][j][0];

x[l]=bs[i+l][j][0];

x[2]=bs[i+l][j+l][0];

y[0]=bs[i][j][1];

y[l]=bs[i+l][j][1];

y[2]-bs[iH][jil][l]:

z[0]=bs[i][j][2];

z[l]=bs[i+l][j][2]:

z[2]=bs[i+l][j+l][2];

getN(x,y,z,tmn);

glEnabletGL_NOK\(ALlZE);

glBegin(CLQUADS);

glNormalSf(tran[0],tmn[l],tmn[2]);

glBegin(GLLINES);

if(j<u)

(

glVeriex3f(bs⑴[j][0],bs[i][j][1],bs[i][j][2]):

glVertex3f(bs[i][j+1][0],bs[i][j+l][l],bs[i][j+1][2]):

)

if(i<v)

(

glVertex3f(bs[i+l][j+1][0],bs[i+l][j+l][l],bs[i+l][j+1][2]);

glVertex3f(bs[i+l][j][0],bs[i+l][j][l],bs[i+l][j][2]):

)

glEndO;

glDisable(GL_NORMALIZE);

)

else

g1Begin(GL_LINES):

glVertex3f(bs[i][j][0],bs[i][j][1],bs[i][j][2]):

glVertex3f(bs[i][j+1][0],bs[i][j+l][1],bs[i][j+1][2]):

)

if(i<v)

|

glVertex3f(bs[i][j][0],bs[i][j][1],bs[i][j][2]);

glVertex3f(bs[i+l][j][0],bs[i+l][j][1],bs[i+l][j][2]);

glEndO:

)

}

)

)

三、飛機(jī)小游戲編寫

圖3、游戲效果圖

戰(zhàn)機(jī)小游戲簡(jiǎn)單編寫了:主戰(zhàn)機(jī)的上、下、左、右移動(dòng)和開炮射擊(按空格鍵);音樂

的播放(.wav)。編寫了物體碰撞算法:擊落敵機(jī)、主戰(zhàn)機(jī)和敵機(jī)的碰撞。

Sincludc"stdafx.h"

*include"Nurbs_2p\Nurbs.h"

HWNDhwnd;

HDChdc;

HGLRChrc:

intmWidth=480;

intmileight=600;

char*mWindow€lassNamc=,,makcwindowc1ass^;

char*mWindowName="戰(zhàn)機(jī)";

intmKeystate;

typedefstructGAMEDATA

{

floatx,y;

intf_s;

}FeiJi,ZiDan:

FeijiM_FJ,DIJ_bf[50];

ZiDanGZD_bf[100];

intdj_statc;

intdzindex;

unsignedinttrx;

〃飛機(jī)機(jī)身頭部數(shù)據(jù)

floathx[]=

{

-360,-360,-360,-360,-360,-360,-360,

-360,-360,-360,-360,-360,-360,-360,

-250,-250,-250,-250,-250,-250,-250,

-200,-200,-200,-200,-200,-200,-200,

-100,-100,-100,-100,-100,-100,-100,

-50,-50,-50,-50,-50,-50,-50,

0,0,0,0,0,0,0

);

floathy[]=

0,0,0,0,0,0,0,

0,20,20,0,-20.-20,0,

0,50,50,0,-50,-50,0,

0,60,60,0,-60,-60,0,

0,110,110,0,-60,-60,0,

0,110,110,0,-60,-60,0,

0,100,100,0,-60,-60,0

};

floathz[]=

{

0,0,0,0,0,0,0,

-20,-20,20,20,20,-20,-20,

50,-50,50,50,50,-50,50,

-60,-60,60,60,60,-60,-60,

-60,-60,60,60,60,-60,-60,

60,60,60,60,60,60,60,

-60,-60,60,60,60,-60,-60

);

floatHU[]={0,0,0,0.25,0.5,0.5,0.75,1,1,1);

〃飛機(jī)機(jī)身尾部數(shù)據(jù)

floatlx[]=

{

0,0,0,0,0,0,0,

150,150,150,150,150,150,150,

200,200,200,200,200,200,200,

250,250,250,250,250,250,250,

300,300,300,300,300,300,300,

350,350,350,350,350,350,350,

400,400,400,400,400,400,400

};

floatly[]=

(

0,100,100,0,-60,-60,0,

0,80,80,0,-60,-60,0,

0,80,80,0,-60,-60,0,

0,70,70.0,-60,-60,0,

0,60,60,0,-60,-60,0,

0,60,60,0,-60,-60,0,

0,40,40,0,-40,-40,0

);

floatlz[]=

-60,-60,60,60,60,-60,-60,

-60,-60,60,60,60,-60,-60,

-60,-60,60,60,60,-60,-60,

-60,-60,60,60,60,-60,-60,

-60,-60,60,60,60,-60,-60,

-60,-60,60,60,60,-60,-60,

-40,-40,40,40,40,-40,-40

):

floatLU[]={0,0,0,0.25,0.5,0.5,0.75,1,1,1);

floatw[]=

{

1,0.5,0.5,1,0.5,0.5,1.

1,0.5,0.5,1,0.5,0.5,1,

1,0.5,0.5,1,0.5,0.5,1,

1,0.5,0.5,1,0.5,0.5,1,

1,0.5,0.5,1,0.5,0.5,1.

1,0.5,0.5,1,0.5,0.5,1,

1,0.5,0.5,1,0.5,0.5,1

);

〃前機(jī)翼數(shù)據(jù)

floatrx[]=

(

25,-50,-50,100,100,25,

40,-30,-30,110,110,40,

55,-10,-10,120,120,55,

60,10,10,120,120,60,

80,30,30,130,130,80,

95,95,95,95,95,95

};

floatry[]=

(

10,10,-10,-10,10,10,

10,10,-10,-10,10,10,

10,10,-10,-10,10,10,

10,10,-10,-10,10,10,

10,10,-10,-10,10,10,

0,0,0,0,0,0

);

floatrz[]=

60,60,60,60,60,60,

120,120,120,120,120,120,

180,180,180,180,180,180,

240,240,240,240,240,240,

310,310,310,310,310,310,

310,310,310,310,310,310

);

floatrxl[]=

(

25,100,100,-50,-50,25,

40,110,110,-30,-30,40,

55,120,120,-10,-10,55,

60,120,120,10,10,60,

80,130,130,30,30,80,

95,95,95,95,95,95

);

floatrzl[]=

{

^60,-60,-60,-60,-60,-60,

120,120,120,120,120,120,

-180,-180,-180,-180,-180,-180,

-240,-240,-240,-240,-240,-240,

-310,-310,-310,-310,-310,-310,

-310,-310,-310,-310,-310,-310

};

floatRU[]={0,0,0,0.25,0.50,0.75,1,1,1);

//后機(jī)翼數(shù)據(jù)

floatex[]=

{

275,200,200,350,350,275,

290,220,220,360,360,290,

305,240,240,370,370,305,

320,260,260,380,380,320,

335,280,280,390,390,335,

350,350,350,350,350,350

);

floatey[]=

(

10,10,-10,-10,10,10,

10,10,-10,-10,10,10,

10,10,-10,-10,10,10,

10,10,-10,-10,10,10,

10,10,-10,-10,10,10,

0,0,0,0,0,0

);

floatez[]=

{

60,60,60,50,50,60,

90,90,90,90,90,90,

120,120,120,120,120,120,

150,150,150,150,150,150,

180,180,180,180,180,180,

190,190,190,190,190,190

};

floatcxl[]=

{

275,350,350,200,200,275,

290,360,360,220,220,290,

305,370,370,240,240,305,

320,380,380,260,260,320,

335,390,390,280,280,335,

350,350,350,350,350,350

);

floatezl[]=

{

-60,-50,-50,-60,-60,-60,

-90,-90,-90,-90,-90,-90,

-120,-120,-120,-120,-120,-120,

-150,-150,-150,-150,-150,-150,

-180,-180,-180,-180,-180,-180,

-190,-190,-190,-190,-190,-190

);

floatEU[]=(0,0,0,0.25,0.50,0.75,1,1,1);

〃后上機(jī)翼數(shù)據(jù)

floattx[]=

|

265,120,120,350,350,265,

280,150,150,360,360,280>

295,180,180,370,370,295,

310,210,210,380,380,310,

325,240,240,390,390,325,

340,340,340,340,340,340

);

floatty[]=

60,60,60,50,50,60,

85,85,85,85,85,85,

110,110,110J10,110,110,

135,135,135,135,135,135,

160,160,160,160,160,160,

170,170,170,170,170,170

);

floattz[]=

{

-10,-10,10,10,-10,-10,

-10,-10,10,10,-10,-10,

-10,-10,10,10,-10,-10,

-10,-10,10,10,-10,-10,

-10,-10,10,10,-10,-10,

0,0,0,0,0,0

);

floatTU[]={0,0,0,0.25,0.50,0.75,1,1,1);

floatbst[161][161][3];

floatbstl[161][161][3];

floatbst2[161][161][3];

floatbst3[161][161][3];

floatbst4[161][161][3];

floatbst5[161][161][3];

floatbst6[161][161][3];

LRESULTWINAPIWndProc(HWND,UINT,WPARAM,LEARAM);

BOOLsetpixelformat(HDChdc);

voidini【viewport(intwidth,intheight);

voiddrawscreen();

voidmessage1oop();

voidlightmO

|

GLfloatlamb[4]=(O.5f,0.5f,0.5f,l.Of};

GI.rioatldif[4]={0.35f,0.35f,0.35f,l.Of};

GLfloatlspe[4]=(0.55f,0.55f,0.55f,1.Of};

GLfloat]pos[4]={350.Of,500.Of,1000.Of,1.Of);

GLfloatmamb[4]=(0.3f0.3f,0.3f,l.Of};

GLfloatmdif[4]={0.3f,0.3f,0.3f,l.Of};

GLfloatmspe[4]=(O.75f,0.75f,0.75f,1.Of};

GLfloatmemi[4]={0.Of.0.Of,0.Of,l.Of};

GLfloatmshininess=128.Of;

glLightfv(GL_LIGHTl,GL_AMBIENT,lamb);

glIJghtfv(GIJ.IGUTl,GL_DIFFUSE,Idif);

glLightfv(GL_LIGHTl,GL.SPECULAR,Ispe);

glLightfv(GL_LIGHTl,GL_POSITION,Ipos);

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,mamb);

glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,mdif);

glMateria1fv(GL_FRONT_AND_BACK,GL_SPECULAR,mspe):

glMaterialfv(GLFRONTANDBACK,GLEMISSION,memi):

g1Materia1f(GL_FRONT_AND_BACK,GL_SHININESS,mshinincss);

)

intpresskey(inivk)

(

if(mKeystate==vk)

return1;

return0;

)

voidcircle(floatx,floaty,floatr)

(

inti;

floatp;

glBegin(GL_TR1/\NGLE_FAN);

for(i=0;i<370;i+=10)

(

p=(float)(i*3.1415926)/180;

glVertex3f((float)cos(p)*r+x,(float)sin(p)*r+y,0.Of);

}

glEndO;

)

voiddrawso1idsphere(floatx,floaty,floatr)

{

glPushMatrixO:

glTranslatcf(x,y,-100);

glRotatef(-30,1.0,0.0.0.0);

glRotatef(90,0.0,1.0,0.0);

auxSolidSphere(r);

glPopMatrix();

)

unsignedintgettexture24b(char*bitn)

{

FILE*fp:

fp=fopen(bitn,"rb");

if(fp==NULL)return0;

iniw,h,i,k;

fseek(fp,18,SEEK_SET);

fread(&w,4,1,fp);

fread(&h,4,1,fp);

unsignedchar*t,ti;

k=(w)*3;

while(k%4)k++;

t=newunsignedchar[k*hj;

fseek(fp,54,SEEK_SET);

fread(t,k*h,1,fp);

fclose(fp);

for(i=0;i<k*h;i+=3)

(

t[i]=t[i+2];

t[i+2]=ti;

)

unsignedinttr;

glGenTextures(l,&tr);

glBindTexture(GL_TEXTURE_2D,tr);

gluBuild2DMipmaps(GL_TEXTURE_2D,4,w,h,GL_RGB,GL_UNSIGNED_BYTE,t);

delete[]t;

returntr;

)

intWIN.APINinVain(HINSTANCEhinstance,HINSTANCEIprevinstance,LI^TRIpcmdline,intn

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論