#include <windows.h>
#include <math.h>
#include <fstream.h>
#include <stdio.h>
#include <stdarg.h>
#include <gl\gl.h>
#include <gl\glu.h>
#include "mmsystem.h"
#include "GLFrame.h"
#include "linear.h"
#include "quaternions.h"
#include "graph.h"
#include "ASEloader.h"
#include "particles.h"
#pragma comment( lib, "opengl32.lib" )
#pragma comment( lib, "glu32.lib" )
#pragma comment( lib, "glaux.lib" )
#pragma comment( lib, "ijl11.lib" )
#pragma comment( lib, "winmm.lib" )
#ifndef CDS_FULLSCREEN
#define CDS_FULLSCREEN 4
#endif
GL_Window* g_window;
Keys* g_keys;
// 字体
GLuint base;
GLYPHMETRICSFLOAT gmf[256];
int frames=0;
float time=0;
float fps;
#define PI 3.141592639
float rot=0;
// ASE模型
CModels ring;
CModels glamdring;
CModels finger;
CModels soldier;
CModels land;
GLint ring_DisplayList=0;
GLint glamdring_DisplayList=0;
GLint finger_DisplayList=0;
GLint soldier_DisplayList=0;
GLint land_DisplayList=0;
// 纹理
CTexture Textures;
#define FIRE_ANIMATION_WIDTH 256
#define FIRE_ANIMATION_HEIGHT 128
// 定义纹理名称
#define FIRE_TEXTURE 0
#define FIRE_FRONT_TEXTURE 1
#define FLAME_TEXTURE 2
#define GOLD_TEXTURE 3
#define TEXT_TEXTURE 4
#define TEXTGLOW_TEXTURE 5
#define GLAMDRING_TEXTURE 6
#define SILVER_TEXTURE 7
#define TITLE_TEXTURE 8
#define SOLDIER_TEXTURE 9
#define LAND_TEXTURE 10
// 粒子数组
#define FIRE_AMOUNT 100
particle fire_back[FIRE_AMOUNT];
particle fire_front[FIRE_AMOUNT];
#define SOLDIER_AMOUNT 1000
particle soldiers[SOLDIER_AMOUNT];
// 控制动画播放的变量
float ANIMC_time=0;
float ANIMC_firesize=0;
float ANIMC_spin1=1;
float ANIMC_spin2=1;
float ANIMC_text=0;
float ANIMC_glow=0;
float ANIMC_RingPos=-1;
int ANIMC_DisplayRing=0;
int ANIMC_DisplayGlamdring=1;
float ANIMC_titlefade=0;
int ANIMC_showtitle=0;
float ANIMC_blastscale=0;
float ANIMC_fall=0;
float ANIMC_land=1;
// 建立字体
GLvoid BuildFont(GLvoid)
{
HFONT font;
base = glGenLists(256);
font = CreateFont( -12, // 字体高度
0, // 字体宽度
0, // 字体的旋转角度
0, // 字体底线的旋转角度
FW_BOLD, // 字体的重量
FALSE, // 是否使用斜体
FALSE, // 是否使用下划线
FALSE, // 是否使用删除线
ANSI_CHARSET, // 设置字符集
OUT_TT_PRECIS, // 输出精度
CLIP_DEFAULT_PRECIS, // 裁剪精度
ANTIALIASED_QUALITY, // 输出质量
FF_DONTCARE|DEFAULT_PITCH, // Family And Pitch
"Arial"); // 字体名称
SelectObject(g_window->hDC, font);
wglUseFontOutlines( g_window->hDC,
0,
255,
base,
10.0f,
0.01f,
WGL_FONT_POLYGONS,
gmf);
}
GLvoid KillFont(GLvoid)
{
glDeleteLists(base, 256);
}
GLvoid glPrint(const char *fmt, ...)
{
float length=0;
char text[256];
va_list ap;
if (fmt == NULL)
return;
va_start(ap, fmt);
vsprintf(text, fmt, ap);
va_end(ap);
for (unsigned int loop=0;loop<(strlen(text));loop++)
{
length+=gmf[text[loop]].gmfCellIncX;
}
glPushMatrix();
glTranslatef(-length/2,0.0f,0.0f);
glPushAttrib(GL_LIST_BIT);
glListBase(base);
glCallLists(strlen(text), GL_UNSIGNED_BYTE, text);
glPopAttrib();
glPopMatrix();
}
// 初始化
BOOL Initialize (GL_Window* window, Keys* keys)
{
g_window = window;
g_keys = keys;
ScreenW=g_window->init.width;
ScreenH=g_window->init.height;
BuildFont();
//载入ASE模型,并创建显示列表
ring.Load("Models\\ring.ase");
glamdring.Load("Models\\glamdring.ase");
finger.Load("Models\\finger.ase");
soldier.Load("Models\\soldier.ase");
land.Load("Models\\land.ase");
ring_DisplayList=glGenLists(1);
glNewList(ring_DisplayList,GL_COMPILE);
ring.Display();
glEndList();
glamdring_DisplayList=glGenLists(1);
glNewList(glamdring_DisplayList,GL_COMPILE);
glamdring.Display();
glEndList();
finger_DisplayList=glGenLists(1);
glNewList(finger_DisplayList,GL_COMPILE);
finger.Display();
glEndList();
soldier_DisplayList=glGenLists(1);
glNewList(soldier_DisplayList,GL_COMPILE);
soldier.Display();
glEndList();
land_DisplayList=glGenLists(1);
glNewList(land_DisplayList,GL_COMPILE);
land.Display();
glEndList();
//载入纹理
Textures.Init(11);
Textures.Load("textures\\blank.jpg",FIRE_TEXTURE,0);
Textures.Load("textures\\blank.jpg",FIRE_FRONT_TEXTURE,0);
Textures.Load("textures\\flame.jpg",FLAME_TEXTURE,0);
Textures.Load("textures\\gold.jpg",GOLD_TEXTURE,0);
Textures.Load("textures\\onering.jpg",TEXT_TEXTURE,0);
Textures.Load("textures\\blank640.jpg",TEXTGLOW_TEXTURE,0);
Textures.Load("textures\\glamdring_tex.jpg",GLAMDRING_TEXTURE,0);
Textures.Load("textures\\silver.jpg",SILVER_TEXTURE,0);
Textures.Load("textures\\title.jpg",TITLE_TEXTURE,0);
Textures.Load("textures\\soldier.jpg",SOLDIER_TEXTURE,0);
Textures.Load("textures\\mountain.jpg",LAND_TEXTURE,0);
// 初始化士兵属性
for(int i=0;i<SOLDIER_AMOUNT;i++)
{
float r=random(3,150,0);
float theta=random(0,2*3.1415926539,0);
soldiers[i].pos.set(r*cos(theta),0,r*sin(theta));
soldiers[i].size=10;
soldiers[i].r=r;
soldiers[i].theta=theta;
soldiers[i].time=1;
}
// OpenGL初始化设置
glEnable(GL_DEPTH_TEST);
glEnable(GL_COLOR_MATERIAL);
// glEnable(GL_CULL_FACE);
// glCullFace(GL_BACK);
glClearColor (0.0f, 0.0f, 0.0f, 0.5f);
glClearDepth (1.0f);
glDepthFunc (GL_LEQUAL);
glEnable (GL_DEPTH_TEST);
GLfloat spec[]={1.0f,1.0f,1.0f,1.0f};
glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
glMateriali(GL_FRONT, GL_SHININESS, 100);
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
glEnable(GL_TEXTURE_2D);
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
PlaySound("BGM.wav",NULL,SND_ASYNC);
return TRUE;
}
// 卸载工作
void Deinitialize (void)
{
KillFont();
glDeleteLists(ring_DisplayList,1);
glDeleteLists(glamdring_DisplayList,1);
glDeleteLists(finger_DisplayList,1);
glDeleteLists(soldier_DisplayList,1);
glDeleteLists(land_DisplayList,1);
Textures.UnLoad();
}
// 绘制火焰
void DrawFire(particle* fires)
{
for(int i=0;i<FIRE_AMOUNT;i++)
{
glPushMatrix();
fires[i].Display();
glPopMatrix();
}
}
// 移动火焰
void MoveFire(particle *fires,float time)
{
for(int i=0;i<FIRE_AMOUNT;i++)
{
fires[i].Move(time);
if(fires[i].time<=0&&ANIMC_firesize>0)
{
fires[i].pos.set(random(0,FIRE_ANIMATION_WIDTH,0),FIRE_ANIMATION_HEIGHT+10,0);
fires[i].dir.set(random(0,10,1),random(-5,-50,0),0);
fires[i].time=random(0.1,ANIMC_firesize,0);
fires[i].size=random(25,50,0);
fires[i].roll=random(0,360,1);
}
}
}
// 动画播放时间序列
void AnimationSequence(float timet)
{
if(ANIMC_time>=155) TerminateApplication (g_window);
if(ANIMC_time>130)
{
ANIMC_showtitle=1;
ANIMC_titlefade+=0.1*timet;
if(ANIMC_titlefade>=1) ANIMC_titlefade=1;
}
if(ANIMC_time>=110)
{
ANIMC_RingPos+=0.05*timet;
}
else if(ANIMC_time>=34)
{
ANIMC_DisplayGlamdring=0;
ANIMC_DisplayRing=1;
ANIMC_RingPos+=0.05*timet;
if(ANIMC_RingPos>=0) ANIMC_RingPos=0;
}
if(ANIMC_time>=96)
{
ANIMC_spin1=1;
}
if(ANIMC_time>=84)
{
// ANIMC_glow+=0.1*timet;
// if(ANIMC_glow>=0.5)
ANIMC_glow=0.5;
}
else if(ANIMC_time>=72)
{
ANIMC_spin1=0;
ANIMC_text+=0.1*timet;
if(ANIMC_text>=1) ANIMC_text=1;
}
if(ANIMC_time>=124)
{
ANIMC_firesize-=0.2*timet;
没有合适的资源?快使用搜索试试~ 我知道了~
收起资源包目录
17章.rar (43个子文件)
第17章
LOTR
Lotr.cpp 11KB
AseLoader.cpp 17KB
Ijl.h 47KB
Ijl11.dll 176KB
DrawScenes.cpp 18KB
LOTR.opt 53KB
Ijl11.lib 5KB
GLFrame.h 1KB
LOTR.dsw 516B
LOTR.exe 292KB
Graph.cpp 3KB
Bgm.wav 1.26MB
LOTR.ncb 145KB
Particles.h 896B
Textures
Blank.jpg 5KB
OneRing.jpg 17KB
Glamdring_Tex.jpg 17KB
Silver.jpg 10KB
Blank640.jpg 5KB
Flame.jpg 3KB
Gold.jpg 9KB
Mountain.jpg 43KB
Soldier.jpg 1KB
Title.jpg 15KB
Debug
vc60.pdb 108KB
LOTR.exe 292KB
Graph.obj 21KB
Lotr.obj 26KB
LOTR.pdb 569KB
DrawScenes.obj 78KB
AseLoader.obj 49KB
LOTR.dsp 4KB
Linear.h 4KB
List.h 1KB
AseLoader.h 3KB
Graph.h 3KB
LOTR.plg 13KB
Models
Land.ase 1.47MB
Glamdring.ase 2.2MB
Ring.ase 1.79MB
Soldier.ase 43KB
Finger.ase 269KB
Quaternions.h 10KB
共 43 条
- 1
资源推荐
资源预览
资源评论
2015-03-26 上传
144 浏览量
2011-06-09 上传
2021-10-11 上传
5星 · 资源好评率100%
135 浏览量
132 浏览量
129 浏览量
151 浏览量
5星 · 资源好评率100%
5星 · 资源好评率100%
176 浏览量
5星 · 资源好评率100%
2011-04-20 上传
5星 · 资源好评率100%
2008-09-26 上传
192 浏览量
2014-05-29 上传
5星 · 资源好评率100%
141 浏览量
154 浏览量
2012-09-11 上传
157 浏览量
108 浏览量
5星 · 资源好评率100%
5星 · 资源好评率100%
150 浏览量
111 浏览量
5星 · 资源好评率100%
184 浏览量
资源评论
licl19870605
- 粉丝: 59
- 资源: 69
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功