麦芽コーヒー工房(紀文)
ROのLisa鯖で豆乳をつくってる戦闘BSのひとりごと。 友だちいません!! 友達募集中
11 « 12345678910111213141516171819202122232425262728293031» 01
CGのプログラムソース
ここに花火のソースおいときます。

偉大なる増子先輩へ!!
#include
#include
#include
#include
#include
#include

#define MAX 6
#define HANI 2

// マウスの視点変化用変数
int mouseL = 0, mouseR = 0;
static GLfloat mouse_rol_x, mouse_rol_y;
static GLfloat mouse_bgn_x, mouse_bgn_y;
static int mouse_x, mouse_y;

// キーで視点変化用変数
static GLfloat move_x = 0.0, move_y = 0.0, zoom = 1.0;
static int star_mine = 0;
static int syaku[MAX] = {0, 0, 0, 0, 0, 0};

// 花火の構成データ
static int flag_rate = 200;
static int flag[400];
static GLfloat position[MAX][3];
static int frame[MAX];
static GLfloat color[MAX][2][3];

// ライト用データ
static int light_flag[MAX] = {0, 0, 0, 0, 0, 0};
static double light_data = 0.1;

// 星の位置
int star_x[100], star_y[100], star_z[100];

// 家の位置
int house_x[50], house_z[50];
int bldg_x[5], bldg_z[5];

// 材質関係
GLfloat m_diffuse[]= {0.8, 0.8, 0.8, 1.0};
GLfloat m_nomat[] = {0.0, 0.0, 0.0, 1.0 }; // 反射無し
GLfloat m_earth[] = {0.75, 0.5, 0.25, 1.0}; // 地面
GLfloat m_white[] = { 1.0, 1.0, 1.0, 1.0 }; // 白
GLfloat m_grey[] = { 0.25, 0.25, 0.25, 1.0 }; // 灰色
GLfloat m_black[] = { 0.0, 0.0, 0.0, 1.0 }; // 黒
GLfloat m_red[] = { 1.0, 0.0, 0.0, 1.0 }; // 赤
GLfloat m_yellow[] = {0.5, 0.5, 0.0, 1.0}; // 黄
GLfloat m_green[] = { 0.0, 1.0, 0.0, 1.0 }; // 緑
GLfloat m_cyan[] = {0.0, 1.0, 1.0, 1.0}; //水色
GLfloat m_blue[] = { 0.0, 0.0, 1.0, 1.0 }; // 青
GLfloat m_mazenda[] = {0.5, 0.0, 0.5, 1.0}; // 紫
GLfloat m_cloud[] = {0.25, 0.25, 0.25, 0.5}; // 雲
GLfloat m_specular[] = { 0.0, 0.0, 0.0, 1.0 };
GLfloat m_ambient[]= {0.25, 0.25, 0.25, 1.0};
GLfloat m_shin_min[] = {0.0};
GLfloat m_shin_middle[] = {50.0};
GLfloat m_shin_max[] = {100.0};
GLfloat m_emission[]= {0.0, 0.0, 0.0, 1.0};
GLfloat m_color_index[]= {0, 1, 1};

// ライト関係
GLfloat l_position[] = { 0.0, 10.0, 0.0, 1.0 };
GLfloat l_max[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat l_min[] = { 0.1, 0.1, 0.1, 1.0 };
GLfloat l_diffuse[] = { 0.1, 0.1, 0.1, 1.0 };
GLfloat l_specular[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat l_ambient[] = { 0.25, 0.25, 0.25, 1.0 };
GLfloat spot_direction[] = { 0.0, -1.0, 0.0 };
GLfloat spot_exponent[] = { 0.0 };
GLfloat spot_cutoff[] = { 100.0 };
GLfloat constant_attenuation[] = { 1.0 };
GLfloat linear_attenuation[] = { 1.0 };
GLfloat quadratic_attenuation[] = { 1.0 };

// 初期化
void init(void){

int i;

for(i = 0 ; i < MAX ; i++){
flag[i] = 0;
change_color(i);
}

for(i = 0 ; i < 100 ; i++){
star_x[i] = (i % 2 == 0) ? (rand() % 70) : -((rand() % 70));
star_y[i] = (rand() % 5) + 40;
star_z[i] = (i % 3 == 0) ? (rand() % 70) : -((rand() % 70));
}

for(i = 0 ; i < 50 ; i++){
house_x[i] = (rand() % 30) + 15;
house_z[i] = (rand() % 30) + 15;
}
for(i = 0 ; i < 5 ; i++){
bldg_x[i] = (rand() % 30) + 15;
bldg_z[i] = (rand() % 30) + 15;
}

glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_SMOOTH); // スムーズな色付け

glEnable(GL_DEPTH_TEST); // ライトを見えないところまで照らす

}

// 空
int sky(void){

int i;
static float time = 0.0;

// LIGHT2設定
glLightfv(GL_LIGHT2, GL_DIFFUSE, l_max); // 拡散光
glLightfv(GL_LIGHT2, GL_SPECULAR, l_max); // 鏡面光
glLightfv(GL_LIGHT2, GL_AMBIENT, l_max); // 環境光
glLightfv(GL_LIGHT2, GL_POSITION, l_position); // ライト位置

glEnable(GL_LIGHTING);
glEnable(GL_LIGHT2);

// 星の材質設定
glMaterialfv(GL_FRONT, GL_DIFFUSE, m_white); // 材質の拡散光の色
glMaterialfv(GL_FRONT, GL_SPECULAR, m_white); // 材質の鏡面光の色
glMaterialfv(GL_FRONT, GL_AMBIENT, m_white); // 材質の環境光の色
glMaterialfv(GL_FRONT, GL_SHININESS, m_shin_max); // 鏡面の指数
glMaterialfv(GL_FRONT, GL_EMISSION, m_white); // 材質の放射光の色

// 星
for(i = 0 ; i < 100 ; i++){
glPushMatrix();
{
glTranslatef(star_x[i], star_y[i], star_z[i]);
glutSolidSphere(0.1, 5, 5);
}
glPopMatrix();
}

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

// 月の材質設定
glMaterialfv(GL_FRONT, GL_DIFFUSE, m_yellow); // 材質の拡散光の色
glMaterialfv(GL_FRONT, GL_SPECULAR, m_yellow); // 材質の鏡面光の色
glMaterialfv(GL_FRONT, GL_AMBIENT, m_ambient); // 材質の環境光の色
glMaterialfv(GL_FRONT, GL_SHININESS, m_shin_middle); // 鏡面の指数
glMaterialfv(GL_FRONT, GL_EMISSION, m_yellow); // 材質の放射光の色

// 月
glPushMatrix();
{
glTranslatef(30, 30, 30);
glutSolidSphere(1, 12, 24);
}
glPopMatrix();

// 雲の材質設定
glMaterialfv(GL_FRONT, GL_DIFFUSE, m_cloud); // 材質の拡散光の色
glMaterialfv(GL_FRONT, GL_SPECULAR, m_cloud); // 材質の鏡面光の色
glMaterialfv(GL_FRONT, GL_AMBIENT, m_cloud); // 材質の環境光の色
glMaterialfv(GL_FRONT, GL_SHININESS, m_shin_middle); // 鏡面の指数
glMaterialfv(GL_FRONT, GL_EMISSION, m_cloud); // 材質の放射光の色

// 雲0
glPushMatrix();
{
glRotatef(time, 0, 1, 0);
glTranslatef(25, 25, 25);
glScalef(2.0, 1.0, 1.0);
glutSolidSphere(2, 4, 15);
}
glPopMatrix();

// 雲1
glPushMatrix();
{
glRotatef(time * 2, 0, 1, 0);
glTranslatef(20, 25, -25);
glScalef(3.0, 2.0, 1.0);
glutSolidSphere(2, 10, 15);
}
glPopMatrix();

// 雲2
glPushMatrix();
{
glRotatef(time, 0, 1, 0);
glTranslatef(23, 25, 25);
glScalef(2.0, 1.0, 1.0);
glutSolidSphere(2, 4, 15);
}
glPopMatrix();

// 雲3
glPushMatrix();
{
glRotatef(time * 3, 0, 1, 0);
glTranslatef(-10, 25, -10);
glScalef(2.0, 1.0, 1.0);
glutSolidSphere(2, 4, 15);
}
glPopMatrix();

glDisable(GL_BLEND);
glDisable(GL_LIGHTING);
glDisable(GL_LIGHT2);

time += 0.01;
return 0;

}

// 民家
int drawhouse(int i){

glScalef(0.2, 0.2, 0.2);

// 屋根
if(i == 0){
glMaterialfv(GL_FRONT, GL_DIFFUSE, m_red); // 材質の拡散光の色
glMaterialfv(GL_FRONT, GL_SPECULAR, m_nomat); // 材質の鏡面光の色
glMaterialfv(GL_FRONT, GL_AMBIENT, m_ambient); // 材質の環境光の色
glMaterialfv(GL_FRONT, GL_SHININESS, m_shin_middle); // 鏡面の指数
glMaterialfv(GL_FRONT, GL_EMISSION, m_nomat); // 材質の放射光の色
}
else if(i == 1){
glMaterialfv(GL_FRONT, GL_DIFFUSE, m_yellow); // 材質の拡散光の色
glMaterialfv(GL_FRONT, GL_SPECULAR, m_nomat); // 材質の鏡面光の色
glMaterialfv(GL_FRONT, GL_AMBIENT, m_ambient); // 材質の環境光の色
glMaterialfv(GL_FRONT, GL_SHININESS, m_shin_middle); // 鏡面の指数
glMaterialfv(GL_FRONT, GL_EMISSION, m_nomat); // 材質の放射光の色
}
else if(i == 2){
glMaterialfv(GL_FRONT, GL_DIFFUSE, m_green); // 材質の拡散光の色
glMaterialfv(GL_FRONT, GL_SPECULAR, m_nomat); // 材質の鏡面光の色
glMaterialfv(GL_FRONT, GL_AMBIENT, m_ambient); // 材質の環境光の色
glMaterialfv(GL_FRONT, GL_SHININESS, m_shin_middle); // 鏡面の指数
glMaterialfv(GL_FRONT, GL_EMISSION, m_nomat); // 材質の放射光の色
}
else if(i == 3){
glMaterialfv(GL_FRONT, GL_DIFFUSE, m_cyan); // 材質の拡散光の色
glMaterialfv(GL_FRONT, GL_SPECULAR, m_nomat); // 材質の鏡面光の色
glMaterialfv(GL_FRONT, GL_AMBIENT, m_ambient); // 材質の環境光の色
glMaterialfv(GL_FRONT, GL_SHININESS, m_shin_middle); // 鏡面の指数
glMaterialfv(GL_FRONT, GL_EMISSION, m_nomat); // 材質の放射光の色
}
else if(i == 4){
glMaterialfv(GL_FRONT, GL_DIFFUSE, m_blue); // 材質の拡散光の色
glMaterialfv(GL_FRONT, GL_SPECULAR, m_nomat); // 材質の鏡面光の色
glMaterialfv(GL_FRONT, GL_AMBIENT, m_ambient); // 材質の環境光の色
glMaterialfv(GL_FRONT, GL_SHININESS, m_shin_middle); // 鏡面の指数
glMaterialfv(GL_FRONT, GL_EMISSION, m_nomat); // 材質の放射光の色
}
else if(i == 5){
glMaterialfv(GL_FRONT, GL_DIFFUSE, m_mazenda); // 材質の拡散光の色
glMaterialfv(GL_FRONT, GL_SPECULAR, m_nomat); // 材質の鏡面光の色
glMaterialfv(GL_FRONT, GL_AMBIENT, m_ambient); // 材質の環境光の色
glMaterialfv(GL_FRONT, GL_SHININESS, m_shin_middle); // 鏡面の指数
glMaterialfv(GL_FRONT, GL_EMISSION, m_nomat); // 材質の放射光の色
}
else{
glMaterialfv(GL_FRONT, GL_DIFFUSE, m_black); // 材質の拡散光の色
glMaterialfv(GL_FRONT, GL_SPECULAR, m_nomat); // 材質の鏡面光の色
glMaterialfv(GL_FRONT, GL_AMBIENT, m_ambient); // 材質の環境光の色
glMaterialfv(GL_FRONT, GL_SHININESS, m_shin_middle); // 鏡面の指数
glMaterialfv(GL_FRONT, GL_EMISSION, m_nomat); // 材質の放射光の色
}

glBegin(GL_POLYGON);
glNormal3f(1.0/sqrt(2), 1.0/sqrt(2), 0);
glVertex3f(0.0, 3.0, 1.5);
glVertex3f(1.0, 2.0, 1.5);
glVertex3f(1.0, 2.0, -1.5);
glVertex3f(0.0, 3.0, -1.5);
glEnd();

glBegin(GL_POLYGON);
glNormal3f(-1.0/sqrt(2), 1.0/sqrt(2), 0);
glVertex3f(0.0, 3.0, 1.5);
glVertex3f(-1.0, 2.0, 1.5);
glVertex3f(-1.0, 2.0, -1.5);
glVertex3f(0.0, 3.0, -1.5);
glEnd();

// 壁
glMaterialfv(GL_FRONT, GL_DIFFUSE, m_grey); // 材質の拡散光の色
glMaterialfv(GL_FRONT, GL_SPECULAR, m_nomat); // 材質の鏡面光の色
glMaterialfv(GL_FRONT, GL_AMBIENT, m_ambient); // 材質の環境光の色
glMaterialfv(GL_FRONT, GL_SHININESS, m_shin_middle); // 鏡面の指数
glMaterialfv(GL_FRONT, GL_EMISSION, m_grey); // 材質の放射光の色

glBegin(GL_POLYGON);
glNormal3f(0.0, 0.0, 1.0);
glVertex3f(0.0, 3.0, 1.5);
glVertex3f(1.0, 2.0, 1.5);
glVertex3f(1.0, 0.0, 1.5);
glVertex3f(-1.0, 0.0, 1.5);
glVertex3f(-1.0, 2.0, 1.5);
glEnd();

glBegin(GL_POLYGON);
glNormal3f(0.0, 0.0, -1.0);
glVertex3f(0.0, 3.0, -1.5);
glVertex3f(1.0, 2.0, -1.5);
glVertex3f(1.0, 0.0, -1.5);
glVertex3f(-1.0, 0.0, -1.5);
glVertex3f(-1.0, 2.0, -1.5);
glEnd();

glBegin(GL_POLYGON);
glNormal3f(1.0, 0.0, 0.0);
glVertex3f(1.0, 2.0, 1.5);
glVertex3f(1.0, 2.0, -1.5);
glVertex3f(1.0, 0.0, -1.5);
glVertex3f(1.0, 0.0, 1.5);
glEnd();

glBegin(GL_POLYGON);
glNormal3f(-1.0, 0.0, 0.0);
glVertex3f(-1.0, 2.0, 1.5);
glVertex3f(-1.0, 2.0, -1.5);
glVertex3f(-1.0, 0.0, -1.5);
glVertex3f(-1.0, 0.0, 1.5);
glEnd();

glBegin(GL_POLYGON);
glNormal3f(0.0, 1.0, 0.0);
glVertex3f(1.0, 0.0, 1.5);
glVertex3f(1.0, 0.0, -1.5);
glVertex3f(-1.0, 0.0, -1.5);
glVertex3f(-1.0, 0.0, 1.5);
glEnd();

}

int drawbldg(int i){

// 壁
glMaterialfv(GL_FRONT, GL_DIFFUSE, m_grey); // 材質の拡散光
glMaterialfv(GL_FRONT, GL_SPECULAR, m_grey); // 材質の鏡面光
glMaterialfv(GL_FRONT, GL_AMBIENT, m_ambient); // 材質の環境光
glMaterialfv(GL_FRONT, GL_SHININESS, m_shin_middle); // 鏡面の指数
glMaterialfv(GL_FRONT, GL_EMISSION, m_nomat); // 材質の放射光

glPushMatrix();

glTranslatef(0.0, 1.0, 0.0);
if(i == 0) glScalef(3.0, 2.0, 0.25);
else if(i == 1) glScalef(0.5, 3.0, 0.5);
else glScalef(0.25, 2.0, 0.25);

glutSolidCube(2.0);

glPopMatrix();

if(i > 2){
glTranslatef(0, 2.6, 0);
glutSolidSphere(0.5, 10, 10);
}

}

// 背景描画
void background(void){

float x, y, th, th_rad;
int i;
float PI = 3.1415926;

GLfloat l_change[] = {light_data, light_data, light_data, 1.0}; // ライトの明るさ変数

glPushMatrix();
sky();
glPopMatrix();

// LIGHT1 設定
glLightfv(GL_LIGHT1, GL_DIFFUSE, l_change); // 拡散光
glLightfv(GL_LIGHT1, GL_SPECULAR, l_change); // 鏡面光
glLightfv(GL_LIGHT1, GL_AMBIENT, l_change); // 環境光
glLightfv(GL_LIGHT1, GL_POSITION, l_position); // ライト位置

glEnable(GL_LIGHTING);
glEnable(GL_LIGHT1);

// 地面の材質
glMaterialfv(GL_FRONT, GL_DIFFUSE, m_earth); // 材質の拡散光の色
glMaterialfv(GL_FRONT, GL_SPECULAR, m_earth); // 材質の鏡面光の色
glMaterialfv(GL_FRONT, GL_AMBIENT, m_ambient); // 材質の環境光の色
glMaterialfv(GL_FRONT, GL_SHININESS, m_shin_middle); // 鏡面の指数
glMaterialfv(GL_FRONT, GL_EMISSION, m_nomat); // 材質の放射光の色

// 地面
glTranslatef(0.0, -5.0, 0.0);
glBegin(GL_QUADS);
glNormal3f(0.0, 1.0, 0.0);
glVertex3f(50, 0, 50);
glVertex3f(50, 0, -50);
glVertex3f(-50, 0, -50);
glVertex3f(-50, 0, 50);
glEnd();

// 山の材質
glMaterialfv(GL_FRONT, GL_DIFFUSE, m_green); // 材質の拡散光の色
glMaterialfv(GL_FRONT, GL_SPECULAR, m_green); // 材質の鏡面光の色
glMaterialfv(GL_FRONT, GL_AMBIENT, m_ambient); // 材質の環境光の色
glMaterialfv(GL_FRONT, GL_SHININESS, m_shin_min); // 鏡面の指数
glMaterialfv(GL_FRONT, GL_EMISSION, m_nomat); // 材質の放射光の色

// 山1
glPushMatrix();
glTranslatef(40.0, 0.0, -40.0);
glRotatef(-90, 1, 0, 0);
glutSolidCone(20, 10, 20, 10);
glPopMatrix();

// 山2
glPushMatrix();
glTranslatef(30.0, 0.0, -40.0);
glRotatef(-90, 1, 0, 0);
glutSolidCone(20, 10, 20, 10);
glPopMatrix();

// 山3
glPushMatrix();
glTranslatef(25.0, 0.0, -25.0);
glRotatef(-90, 1, 0, 0);
glutSolidCone(20, 5, 10, 10);
glPopMatrix();

// 山4
glPushMatrix();
glTranslatef(1.0, 0.0, -40.0);
glRotatef(-90, 1, 0, 0);
glutSolidCone(20, 10, 10, 10);
glPopMatrix();

glPushMatrix();

// 湖の材質
glMaterialfv(GL_FRONT, GL_DIFFUSE, m_cyan); // 材質の拡散光の色
glMaterialfv(GL_FRONT, GL_SPECULAR, m_cyan); // 材質の鏡面光の色
glMaterialfv(GL_FRONT, GL_AMBIENT, m_ambient); // 材質の環境光の色
glMaterialfv(GL_FRONT, GL_SHININESS, m_shin_max); // 鏡面の指数
glMaterialfv(GL_FRONT, GL_EMISSION, m_nomat); // 材質の放射光の色

glTranslatef(5.0, 0.1, -5.0);

// 湖
glBegin(GL_POLYGON);
glNormal3f(0.0, 1.0, 0.0);
for (th = 0.0 ; th <= 360.0 ; th = th + 10.0){
th_rad = th / 180.0 * PI;
x = 20 * cos(th_rad);
y = 15 * sin(th_rad);
glVertex3f(y, 0.0, x);
}
glEnd();

glPopMatrix();

// ビル
glPushMatrix();
glTranslatef(-13.0, 0.0, -13.0);
drawbldg(3);
glPopMatrix();
glPushMatrix();
glTranslatef(-12.0, 0.0, -14.0);
drawbldg(2);
glPopMatrix();
glPushMatrix();
glTranslatef(-14.0, 0.0, -14.0);
drawbldg(1);
glPopMatrix();
glPushMatrix();
glTranslatef(-14.0, 0.0, -14.0);
drawbldg(1);
glPopMatrix();

glPushMatrix();
for(i = 0 ; i < 5 ; i++){
glPushMatrix();
glTranslatef(bldg_x[i], 0.0, bldg_z[i]);
glRotatef(i * 2, 0, 1, 0);
drawbldg(i % 3);
glPopMatrix();
}
glTranslatef(-30, 0, 0);
for(i = 0 ; i < 5 ; i++){
glPushMatrix();
glTranslatef(bldg_x[i], 0.0, bldg_z[i]);
glRotatef(i * 2, 0, 1, 0);
drawbldg(i % 4);
glPopMatrix();
}
glTranslatef(-30, 0, 0);
for(i = 0 ; i < 5 ; i++){
glPushMatrix();
glTranslatef(bldg_x[i], 0.0, bldg_z[i]);
glRotatef(i * 2, 0, 1, 0);
drawbldg(i % 5);
glPopMatrix();
}
glTranslatef(0, 0, -30);
for(i = 0 ; i < 5 ; i++){
glPushMatrix();
glTranslatef(bldg_x[i], 0.0, bldg_z[i]);
glRotatef(i * 2, 0, 1, 0);
drawbldg(i % 6);
glPopMatrix();
}
glPopMatrix();

// 家
glPushMatrix();
for(i = 0 ; i < 50 ; i++){
glPushMatrix();
glTranslatef(house_x[i], 0.0, house_z[i]);
glRotatef(i * 2, 0, 1, 0);
drawhouse(i % 8);
glPopMatrix();
}
glTranslatef(-30, 0, 0);
for(i = 0 ; i < 50 ; i++){
glPushMatrix();
glTranslatef(house_x[i], 0.0, house_z[i]);
glRotatef(i * 2, 0, 1, 0);
drawhouse(i % 9);
glPopMatrix();
}
glTranslatef(-30, 0, 0);
for(i = 0 ; i < 50 ; i++){
glPushMatrix();
glTranslatef(house_x[i], 0.0, house_z[i]);
glRotatef(i * 2, 0, 1, 0);
drawhouse(i % 10);
glPopMatrix();
}
glTranslatef(0, 0, -30);
for(i = 0 ; i < 50 ; i++){
glPushMatrix();
glTranslatef(house_x[i], 0.0, house_z[i]);
glRotatef(i * 2, 0, 1, 0);
drawhouse(i % 11);
glPopMatrix();
}
glTranslatef(0, 0, -30);
for(i = 0 ; i < 50 ; i++){
glPushMatrix();
glTranslatef(house_x[i], 0.0, house_z[i]);
glRotatef(i * 2, 0, 1, 0);
drawhouse(i % 12);
glPopMatrix();
}
glPopMatrix();

glDisable(GL_LIGHTING);
glDisable(GL_LIGHT1);

}

// 花火の色をランダムに変える
int change_color(int i){

int j;

for(j = 0 ; j < 3 ; j++){
color[i][0][j] = (GLfloat)(rand() % 3) * 0.5;
color[i][1][j] = (GLfloat)(rand() % 3) * 0.5;
}

// 1色目が暗かった場合は白
if(color[i][0][0] < 0.5 && color[i][0][1] < 0.5 && color[i][0][2] < 0.5){
color[i][0][0] = 1.0;
color[i][0][1] = 1.0;
color[i][0][2] = 0.0;
}

// 2色目が暗かった場合は白
if(color[i][1][0] < 0.5 && color[i][1][1] < 0.5 && color[i][1][2] < 0.5){
color[i][1][0] = 0.0;
color[i][1][1] = 1.0;
color[i][1][2] = 1.0;
}

return 0;

}

// 打ち上げ位置の決定 -3 < x < 3, -3 < z < 3
void change_position(int i){

// x座標
position[i][0]=(GLfloat)(rand() % (HANI * 2 * 10 + 1) - (HANI * 10)) / 10;

// y座標は無し

// z座標
position[i][2]=(GLfloat)(rand() % (HANI * 2 * 10 + 1) - (HANI * 10)) / 10;

printf("パターン %d\n", i);
printf(" 打ち上げ点 x : %f y : %f z : %f\n", position[i][0], position[i][1], position[i][2]);

}

// 花火の線
void line(GLfloat start, GLfloat end, int density){

int zrol, yrol;

for(yrol = 0 ; yrol <= 180 ; yrol = yrol + (360 / density)){
glPushMatrix();
glRotatef((GLfloat)yrol, 0.0, 1.0, 0.0);
for(zrol = 0 ; zrol < 360 ; zrol = zrol + (360 / density)){
glPushMatrix();
glRotatef((GLfloat)zrol, 0.0, 0.0, 1.0);
glBegin(GL_LINES);
glLineWidth(30.0);
glVertex3f(start, 0.0, 0.0);
glVertex3f(end, 0.0, 0.0);
glEnd();
glPopMatrix();
}
glPopMatrix();
}

}

// 花火のランダム点
int dot_rand(int radius, int density, int scal){

int n = 0;
double x, y, z;

while(n < density){
x = (double)((rand() % (radius * 2)) - radius) / (double)scal;
y = (double)((rand() % (radius * 2)) - radius) / (double)scal;
z = (double)((rand() % (radius * 2)) - radius) / (double)scal;
if(sqrt(pow(x, 2) + pow(y, 2) + pow(z, 2)) <= (double)radius / (double)scal){
glBegin(GL_POINTS);
glVertex3f(x, y, z);
glEnd();
n++;
}
}

return 0;

}

// 花火の点
int dot(GLfloat radius, int density){

int rol_z, rol_y;

for(rol_y = 0 ; rol_y <= 180 ; rol_y = rol_y + (360 / density)){
glPushMatrix();
glRotatef((GLfloat)rol_y, 0.0, 1.0, 0.0);
for(rol_z = 0 ; rol_z <= 360 ; rol_z = rol_z + (360 / density)){
glPushMatrix();
glRotatef((GLfloat)rol_z, 0.0, 0.0, 1.0);
glBegin(GL_POINTS);
glVertex3f(radius, 0.0, 0.0);
glEnd();
glPopMatrix();
}
glPopMatrix();
}
return 0;

}

// 花火の球
void sphere(GLfloat radius, int density){

int rol_z, rol_y;

for(rol_y = 0 ; rol_y <= 180 ; rol_y = rol_y + (360 / density)){
glPushMatrix();
glRotatef((GLfloat)rol_y, 0.0, 1.0, 0.0);
for(rol_z = 0 ; rol_z <= 360 ; rol_z = rol_z + (360 / density)){
glPushMatrix();
glRotatef((GLfloat)rol_z, 0.0, 0.0, 1.0);
glTranslatef(radius, 0.0, 0.0);
glutSolidSphere(0.01, 7, 7);
glPopMatrix();
}
glPopMatrix();
}

}

//花火パターン0
void hanabi0(void){

float alpha1, alpha2, y_s, y_e, l_s, l_e, l_m;

y_s = frame[0] * 0.02;
y_e = frame[0] * 0.03;

alpha1 = (GLfloat)(1 - (frame[0] - 106) * 0.015);
alpha2 = (GLfloat)(1 - (frame[0] - 106) * 0.003);

l_s = frame[0] * 0.001;
l_e = frame[0] * 0.005;
l_m = 2 * (l_s + l_e) / 3;

glEnable( GL_BLEND );
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );

if(y_e >= 3.2 && alpha1 > 0.0){
if(light_flag[0] == 0){
light_data = 1.0;
light_flag[0] = 1;
}
glPushMatrix();
glTranslatef(0.0, 5.0, 0.0);
glColor4f(color[0][0][0], color[0][0][1], color[0][0][2], alpha1);
line(l_s, l_e, 13);
glPopMatrix();
}

else if(y_e >= 3.2 && alpha1 < 0.2 && alpha2 > 0.0){
if(light_flag[0] == 0){
light_data = 1.0;
light_flag[0] = 1;
}
glPushMatrix();
glTranslatef(0.0, 5.0 - (GLfloat)(frame[0] - 183) * 0.002, 0.0);
glColor4f(color[0][1][0], color[0][1][1], color[0][1][2], alpha2);
dot(l_s, 7);
dot(l_e, 13);
dot(l_m, 13);
dot_rand((int)(l_m * 1000), 50, 1000);
glPopMatrix();
}

glDisable( GL_BLEND );

if(alpha1 < 0.0 && alpha2 < 0.0){
flag[0] = 0;
frame[0] = 0;
change_color(0);
change_position(0);
light_flag[0] = 0;
syaku[0] = 0;
}

}

// 花火パターン1
void hanabi1(void){

float y_s, y_e, l_s1, l_e1, l_s2, l_e2, alpha;

y_s = frame[1] * 0.03;
y_e = frame[1] * 0.04;

// 外側の円
l_s1 = frame[1] * 0.003;
l_e1 = frame[1] * 0.006;

// 内側の円
l_s2 = frame[1] * 0.002;
l_e2 = frame[1] * 0.006;

alpha = (GLfloat)(1 - (frame[1] - 49) * 0.01);

glEnable( GL_BLEND );
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );

if(y_e > 2.0 && alpha > 0.0){
if(light_flag[1] == 0){
light_data = 1.0;
light_flag[1] = 1;
}
glPushMatrix();
glTranslatef(0.0, 4.3, 0.0);
glColor4f(color[1][0][0], color[1][0][1], color[1][0][2], alpha);
line(l_s1, l_e1, 7);
glColor4f(color[1][1][0], color[1][1][1], color[1][1][2], alpha);
line(l_s2, l_e2, 10);
glColor3f(color[1][0][0], color[1][0][1], color[1][0][2]);
dot_rand((int)(l_e1 * 100), (int)(l_e1 * 10), 100);
glPopMatrix();
}

glDisable(GL_BLEND);

if(alpha < 0){
flag[1] = 0;
frame[1] = 0;
change_color(1);
change_position(1);
light_flag[1] = 0;
syaku[1] = 0;
}

}

// 花火パターン2
void hanabi2(void){

float y_s, y_e, l_s1, l_e1, l_s2, l_e2, alpha;

y_s = frame[2] * 0.03;
y_e = frame[2] * 0.04;
l_s1 = 0.1;
l_e1 = (frame[2] - 3) * 0.001;

if(frame[2] > 5){
l_s1 = frame[2] * 0.001;
l_e1 = frame[2] * 0.003;
}

l_s2 = frame[2] * 0.0005;
l_e2 = frame[2] * 0.004;

alpha = (GLfloat)1 - (frame[2] - 74) * 0.01;

glEnable( GL_BLEND );
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );

if(y_e > 3.3 && alpha > 0.0){
if(light_flag[2] == 0){
light_data = 1.0;
light_flag[2] = 1;
}
glPushMatrix();
glTranslatef(0.0, 3.3, 0.0);
glColor4f(color[2][0][0], color[2][0][1], color[2][0][2], alpha);
line(l_s1, l_e1, 7);
glColor4f(color[2][1][0], color[2][1][1], color[2][1][2], alpha);
line(l_s2, l_e2, 10);
glColor4f(color[2][0][0], color[2][0][1], color[2][0][2], alpha);
sphere(l_e2, 20);
sphere((l_e2+l_s2) / 2.0, 10);
glPopMatrix();
}

glDisable(GL_BLEND);

if(alpha < 0.0){
flag[2] = 0;
frame[2] = 0;
change_color(2);
change_position(2);
light_flag[2] = 0;
syaku[2] = 0;
}

}

// 花火パターン3
void hanabi3(void){

float y_s, y_e, l_s1, l_e1, d_s, d_m, d_mm, d_e, alpha1,alpha2;

y_s = frame[3] * 0.03;
y_e = frame[3] * 0.04;

l_s1 = (frame[3] - 99 ) * 0.0001;
l_e1 = (frame[3] - 99 ) * 0.002;

alpha1 = (GLfloat)(1 - (frame[3] - 110) * 0.01);
alpha2 = (GLfloat)(1 - (frame[3] - 210) * 0.01);

d_s = (frame[3]-99) * 0.001;
d_e = (frame[3]-99) * 0.005;
d_m = l_e1;
d_mm = 2.5 * (d_s + d_e) / 5;

glEnable( GL_BLEND );
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );

if(y_s > 4.5 && alpha1 > 0.0){
if(light_flag[3] == 0){
light_data = 1.0;
light_flag[3] = 1;
}
glPushMatrix();
glTranslatef(0.0, 4.5, 0.0);
glColor4f(color[3][0][0], color[3][0][1], color[3][0][2], alpha1);
line(l_s1, l_e1, 10);
glColor4f(color[3][1][0], color[3][1][1], color[3][1][2], alpha2);
dot(l_e1, 20);
glPopMatrix();
}

else if(y_s > 4.5 && alpha1 < 0.5 && alpha2 > 0.0){
if(light_flag[3] == 0){
light_data = 1.0;
light_flag[3] = 1;
}
glPushMatrix();
glTranslatef(0.0, 4.5 - (frame[3] - 210) * 0.0025, 0.0);
glColor4f(color[3][1][0], color[3][1][1], color[3][1][2],alpha2);
dot(d_m,20);
glColor4f(color[3][0][0], color[3][0][1], color[3][0][2], alpha2);
dot(d_s, 13);
dot(d_mm, 13);
dot(d_e, 15);
glPopMatrix();
}

glDisable(GL_BLEND);

if(alpha1 < 0.0 && alpha2 < 0.0){
flag[3] = 0;
frame[3] = 0;
change_color(3);
change_position(3);
light_flag[3] = 0;
syaku[3] = 0;
}

}

// 花火パターン4
void hanabi4(void){

float y_s, y_e, l_s1, l_e1, l_s2, l_e2, alpha1,alpha2;

y_s = frame[4] * 0.03;
y_e = frame[4] * 0.04;
l_s1 = (frame[4] - 99 ) * 0.0001;
l_e1 = (frame[4] - 99 ) * 0.003;

alpha2 = (GLfloat)(1 - (frame[4] - 110) * 0.01);
alpha1 = (GLfloat)(1 - (frame[4] - 210) * 0.01);

l_s2 = (frame[4] - 99) * 0.001;
l_e2 = (frame[4] - 99) * 0.005;

glEnable( GL_BLEND );
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );

if(y_s > 4.3){
if(light_flag[4] == 0){
light_data = 1.0;
light_flag[4] = 1;
}
glPushMatrix();
glTranslatef(0.0, 4.3, 0.0);
glColor4f(color[4][0][0], color[4][0][1], color[4][0][2], alpha1);
line(l_s1, l_e1, 17);
sphere(l_e2, 13);
glColor4f(color[4][1][0], color[4][1][1], color[4][1][2], alpha2);
line(l_s2, l_e2, 13);
dot(l_e1, 17);
glPopMatrix();
}

glDisable(GL_BLEND);

if(alpha1 < 0.0 && alpha2 < 0.0){
flag[4] = 0;
frame[4] = 0;
change_color(4);
change_position(4);
light_flag[4] = 0;
syaku[4] = 0;
}

}

// 花火パターン5
void hanabi5(void){

float y_s, y_e, l_s1, l_e1, l_s2, l_e2, alpha;

y_s = frame[5] * 0.03;
y_e = frame[5] * 0.04;

// 外側の円
l_s1 = frame[5] * 0.004;
l_e1 = frame[5] * 0.006;

// 内側の円
l_s2 = frame[5] * 0.001;
l_e2 = frame[5] * 0.006;

alpha = (GLfloat)(1 - (frame[5] - 74) * 0.009);

glEnable( GL_BLEND );
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );

if(y_e > 3.4 && alpha > 0.0){
if(light_flag[5] == 0){
light_data = 1.0;
light_flag[5] = 1;
}
glPushMatrix();
glTranslatef(0.0, 3.4, 0.0);
glColor4f(color[5][0][0], color[5][0][1], color[5][0][2], alpha);
line(l_s1, l_e1, 10);
glColor4f(color[5][1][0], color[5][1][1], color[5][1][2], alpha);
line(l_s2, l_e2, 9);
glColor4f(color[5][0][0], color[5][0][1], color[5][0][2], alpha);
line((l_s1+l_s2)/2, ((l_e1+l_e2)/2), 8);
glColor3f(1.0, 1.0, 1.0);
dot_rand((int)(l_e1 * 100), (int)(l_e1 * 10), 100);
glPopMatrix();
}

glDisable(GL_BLEND);

if(alpha < 0){
flag[5] = 0;
frame[5] = 0;
change_color(5);
change_position(5);
light_flag[5] = 0;
syaku[5] = 0;
}

}

// 自動打ち上げユニット
void auto_func(void){

int target;

// フラグが立っているものは着火
// 花火パターン0
if(flag[0] == 1){
glPushMatrix();
glTranslatef(position[0][0], position[0][1], position[0][2]);
hanabi0();
glPopMatrix();
}

// 花火パターン1
if(flag[1] == 1){
glPushMatrix();
glTranslatef(position[1][0],position[1][1],position[1][2]);
hanabi1();
glPopMatrix();
}

// 花火パターン2
if(flag[2] == 1){
glPushMatrix();
glTranslatef(position[2][0],position[2][1],position[2][2]);
hanabi2();
glPopMatrix();
}

// 花火パターン3
if(flag[3] == 1){
glPushMatrix();
glTranslatef(position[3][0],position[3][1],position[3][2]);
hanabi3();
glPopMatrix();
}

// 花火パターン4
if(flag[4] == 1){
glPushMatrix();
glTranslatef(position[4][0],position[4][1],position[4][2]);
hanabi4();
glPopMatrix();
}

// 花火パターン5
if(flag[5] == 1){
glPushMatrix();
glTranslatef(position[5][0],position[5][1],position[5][2]);
hanabi5();
glPopMatrix();
}

target = (rand() % flag_rate);

if(flag[target] == 0 && star_mine == 1){
flag[target] = 1;
}

}

// 描画
void display(void){

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glPushMatrix();
{

// 視点移動の平行移動
glTranslatef(move_x, move_y, 0);

// 視点移動の回転
glRotatef(mouse_rol_x, 1.0, 0.0, 0.0);
glRotatef(mouse_rol_y, 0.0, 1.0, 0.0);

// ズーム
glScalef(zoom, zoom, zoom);

// 背景
glPushMatrix();
background();
glPopMatrix();

// スターマイン
glPushMatrix();
auto_func();
glPopMatrix();

// 尺玉0
if(syaku[0] == 1){
glPushMatrix();
glTranslatef(0, 0, 0);
glScalef(2, 2, 2);
frame[0]++;
hanabi0();
glPopMatrix();
}

// 尺玉1
if(syaku[1] == 1){
glPushMatrix();
glTranslatef(5, 0, 5);
glScalef(2, 2, 2);
frame[1]++;
hanabi1();
glPopMatrix();
}

// 尺玉2
if(syaku[2] == 1){
glPushMatrix();
glTranslatef(-5, 0, 5);
glScalef(2, 2, 2);
frame[2]++;
hanabi2();
glPopMatrix();
}

// 尺玉3
if(syaku[3] == 1){
glPushMatrix();
glTranslatef(-5, 0, -5);
glScalef(2, 2, 2);
frame[3]++;
hanabi3();
glPopMatrix();
}

// 尺玉4
if(syaku[4] == 1){
glPushMatrix();
glTranslatef(5, 0, -5);
glScalef(2, 2, 2);
frame[4]++;
hanabi4();
glPopMatrix();
}

// 尺玉5
if(syaku[5] == 1){
glPushMatrix();
glTranslatef(25, 0, -25);
glScalef(2, 2, 2);
frame[5]++;
hanabi5();
glPopMatrix();
}

if(light_data > 0.1)light_data -= 0.01; // ディスプレイを暗くする処理

glutSwapBuffers();

}
glPopMatrix();

}


// 再描画
void reshape(int w, int h){

glViewport(0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, (GLfloat)w/(GLfloat)h, 1.0, 150.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0, 20.0, 20.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);

}

// キーボード操作
void keyboard (unsigned char key, int x, int y){

switch(key){

// ズームイン
case 'z':
zoom += 0.05;
glutPostRedisplay();
break;

// ズームアウト
case 'Z':
zoom -= 0.05;
glutPostRedisplay();
break;

// スターマイン!
case 's':
star_mine = 1;
glutPostRedisplay();
break;

// スターマイン...
case 'S':
star_mine = 0;
glutPostRedisplay();
break;

// 尺玉0
case '0':
syaku[0] = 1;
glutPostRedisplay();
break;

// 尺玉1
case '1':
syaku[1] = 1;
glutPostRedisplay();
break;

// 尺玉2
case '2':
syaku[2] = 1;
glutPostRedisplay();
break;

// 尺玉3
case '3':
syaku[3] = 1;
glutPostRedisplay();
break;

// 尺玉4
case '4':
syaku[4] = 1;
glutPostRedisplay();
break;

// 尺玉5
case '5':
syaku[5] = 1;
glutPostRedisplay();
break;

case 'l':
flag_rate = 400;
glutPostRedisplay();
break;

case 'm':
flag_rate = 200;
glutPostRedisplay();
break;

case 'h':
flag_rate = 50;
glutPostRedisplay();
break;

case 27:
exit(0);
break;

default:
break;

}

}

// キーボードの左側にある → ↓ ← ↑ の処理
void move(int key, int x, int y){

switch(key){

// 上スライド
case GLUT_KEY_UP:
move_y = move_y - 0.3;
glutPostRedisplay();
break;

// 下スライド
case GLUT_KEY_DOWN:
move_y = move_y + 0.3;
glutPostRedisplay();
break;

// 左スライド
case GLUT_KEY_LEFT:
move_x = move_x+0.3;
glutPostRedisplay();
break;

// 右スライド
case GLUT_KEY_RIGHT:
move_x = move_x-0.3;
glutPostRedisplay();
break;

default:
break;

}

}

void idle(void){

frame[0]++;
frame[1]++;
frame[2]++;
frame[3]++;
frame[4]++;
frame[5]++;
glutPostRedisplay();

}

// マウスクリック
void mouse_click(int button, int stat, int x, int y){

if(GLUT_DOWN == stat && button!=GLUT_MIDDLE_BUTTON){
// 左クリック → 横回転
if( GLUT_LEFT == button) mouseL=1, mouseR=0;
// 右クリック → 縦回転
else if( GLUT_RIGHT_BUTTON == button) mouseL=0, mouseR=1;
mouse_x = x;
mouse_y = y;
mouse_bgn_x = mouse_rol_x;
mouse_bgn_y = mouse_rol_y;
}
// 視点を元の位置に戻す
else if(button==GLUT_MIDDLE_BUTTON){
mouseL=0, mouseR=0;
move_x=0.0;
move_y=0.0;
mouse_rol_x = 0.0;
mouse_rol_y = 0.0;
zoom = 1.0;
glutPostRedisplay();
}

}


// マウスドラッグ
void mouse_drag(int x, int y){

// 横回転(y軸)
if( mouseL ){
// ドラッグ量から回転角度を求める
mouse_rol_y = (GLfloat)((x - mouse_x) + mouse_bgn_y)/2;
}
// 縦回転(x軸)
else if( mouseR ){
// ドラッグ量から回転角度を求める
mouse_rol_x = (GLfloat)((y - mouse_y) + mouse_bgn_x)/2;
// 回転角範囲の指定 0 < x < 45
if(mouse_rol_x > 45) mouse_rol_x = 45;
if(mouse_rol_x < -60) mouse_rol_x = -60;
}

glutPostRedisplay();

}

int main(int argc, char** argv){

// 時間によってランダムの要素を加える
srand((unsigned) time(NULL));

glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(700,700);
glutInitWindowPosition(100,100);
glutCreateWindow("FIRE WARK");
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutSpecialFunc(move);
glutIdleFunc(idle);
glutMouseFunc(mouse_click);
glutMotionFunc(mouse_drag);
glutMainLoop();
return 0;

}






















/ 2007/06/19(Tue)18:38 /
/ リアル / trackback:0 / comment:3 /
/ 麦芽コーヒー工房(紀文) / 久しぶりの更新じゃい
/ なつき URL #- [編集] / 2007/06/19 18:43 /
ご利用誠にありがとうございます^−^
弊社は今R0とかリネ2とかFF11とか扱っております
特にR0が大量に在庫を持っております
こちらの値段の方がほかの業者さんより一番安いですね
こちらの販売してるホームページは  http://www.rmtro-jp.com/blog/です
ご参考してから、もしご希望の鯖がありましたら、
是非ご連絡するのは幸いですね^^
または弊社の信用とサービスがいいです
こちらと対応したお客様が分かっています
それはご安心くださいね
以後でよろしくおねがいいたします^−^
/ RMT URL #3skNCNf. [編集] / 2007/09/11 09:56 /
RO イフリート戦
RO Ragnarok ラグナロク...RO Ragnarok ラグナロク
http://www.livedoorbloog.com/7112888/000029.zip
/ たー坊 URL #191wfSKs [編集] / 2008/01/13 11:05 /










Wisで送る(管理者にだけ表示を許可)

/ 麦芽コーヒー工房(紀文) /

PROFILE

麦芽こーひー

  • 麦芽こーひー
  • Lisa鯖で
    まったりと活動中
    AGI戦闘型BS

    将来的には男のロマンSTR120を目指してるが
    いつになるやら・・・



R-TRACKBACK

CATEGORIES



SEARCH