当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 3 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 又写了一个 demoscene (64K动画)
帖子发表于 : 2011-03-06 13:44 
头像

注册: 2010-04-23 20:40
帖子: 1950
地址: 浙江·杭州
系统: Arch Linux
送出感谢: 2
接收感谢: 31
这也是个超 simple 的作品,名曰:Waves
先上图(What a mess!):
附件:
文件注释: #define WAVE_SIZE 10
snap1.png
snap1.png [ 3.64 KiB | 被浏览 759 次 ]
附件:
文件注释: #define WAVE_SIZE 100
snap.png
snap.png [ 37.99 KiB | 被浏览 759 次 ]


恩,首先,我包装了一下glut (demolino.h)
[c]#ifndef __DEMOLINO_H__
#define __DEMOLINO_H__

#include <GL/glut.h>
#include <stdlib.h>
#include <stdio.h>

// Type
#define float GLfloat

// Uilities
#define CLEAR glClear(GL_COLOR_BUFFER_BIT)
#define RGB(R, G, B) (float)(R)/255.0f, (float)(G)/255.0f, (float)(B)/255.0f
#define RGBA(R, G, B, A) RGB(R, G, B), (float)(A)/255.0f
#define SET_COLOR_RGB(R, G, B) glColor3f(RGB(R, G, B))
#define SET_COLOR_RGBA(R, G, B, A) glColor4f(RGBA(R, G, B, A))
#define PUSH_MAT glPushMatrix()
#define POP_MAT glPopMatrix()
#define SWAP glutSwapBuffers()

// Custom info
#ifndef DEMO_TITLE
#define DEMO_TITLE "Demolino"
#endif

#ifndef DEMO_WIN_SIZE
#define DEMO_WIN_SIZE 320,240
#endif

#ifndef DEMO_FPS
#define DEMO_FPS 30
#endif

#ifndef DEMO_CLEAR_COLOR
#define DEMO_CLEAR_COLOR RGBA(0, 0, 0, 0)
#endif

void timer(int value);
void render(void);
void init(void);

// Called by GLUT library when idle (window not being
// resized or moved)
void TimerFunction(int value)
{
timer(value);

glutPostRedisplay();
glutTimerFunc(1000/DEMO_FPS, TimerFunction, 1);
}

void SpecialKeys(int key, int x, int y)
{
/*
if(key == GLUT_KEY_UP) xRot-= 5.0f;
if(key == GLUT_KEY_DOWN) xRot += 5.0f;
if(key == GLUT_KEY_LEFT) yRot -= 5.0f;
if(key == GLUT_KEY_RIGHT) yRot += 5.0f;
if(key > 356.0f) xRot = 0.0f;
if(key < -1.0f) xRot = 355.0f;
if(key > 356.0f) yRot = 0.0f;
if(key < -1.0f) yRot = 355.0f;

// Refresh the Window
glutPostRedisplay();
*/
}

void ChangeSize(int w, int h)
{
float nRange = 100.0f;

// Prevent a divide by zero
if(h == 0) h = 1;

// Set Viewport to window dimensions
glViewport(0, 0, w, h);

// Reset projection matrix stack
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

// Establish clipping volume (left, right, bottom, top, near, far)
if (w <= h) glOrtho (-nRange, nRange, -nRange*h/w, nRange*h/w, -nRange, nRange);
else glOrtho (-nRange*w/h, nRange*w/h, -nRange, nRange, -nRange, nRange);

// Reset Model view matrix stack
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

// Main program entry point
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(DEMO_WIN_SIZE);
glutCreateWindow(DEMO_TITLE);
glutReshapeFunc(ChangeSize);
glutDisplayFunc(render);
glutSpecialFunc(SpecialKeys);
glutTimerFunc(1000/DEMO_FPS, TimerFunction, 1);
glClearColor(DEMO_CLEAR_COLOR);

init();

glutMainLoop();

return 0;
}

#endif[/c]
主程序(demo.c):
[c]#define DEMO_TITLE "LanDeXithO 002 - Waves"
#define DEMO_WIN_SIZE 480, 480
#include "demolino.h"
#include <math.h>
#define PI 3.1415927

#define WAVE_SIZE 10
struct wave
{
int type; // 0: Sine; 1: Cosine;
float angle;
float angle_inc;
float x, y;
float x_inc;
float y_scale;
int r, g, b;
} waves[WAVE_SIZE];

void circle(float x, float y, float r)
{
glBegin(GL_POLYGON);
float a;
for (a=0; a<2*PI; a+=0.1)
glVertex2f(x+cos(a)*r, y+sin(a)*r);
glEnd();
}

void draw_wave_path(int i)
{
glBegin(GL_LINE_STRIP);
float a, x;
for (a=0, x=-100; x<=100;
a+=waves[i].angle_inc, x+=waves[i].x_inc){
float y_offset = 0;
switch (waves[i].type){
case 0: // Sine
y_offset = sin(a);
break;
case 1: // Cosine
y_offset = cos(a);
break;
}
glVertex2f(x, waves[i].y + y_offset*waves[i].y_scale);
}
glEnd();
}

void draw(void)
{
int i;
for (i=0; i<WAVE_SIZE; i++){
float y_offset = 0;
switch (waves[i].type){
case 0: // Sine
y_offset = sin(waves[i].angle);
break;
case 1: // Cosine
y_offset = cos(waves[i].angle);
break;
}
SET_COLOR_RGBA(waves[i].r, waves[i].g, waves[i].b, 128);
draw_wave_path(i);
circle(waves[i].x, waves[i].y + y_offset*waves[i].y_scale, 2);
}
}

void render(void)
{
CLEAR;
PUSH_MAT;
draw();
POP_MAT;
SWAP;
}

void init_wave(int i)
{
waves[i].type = rand()%2;
waves[i].angle = 0;
waves[i].angle_inc = (float)(rand()%10)*PI/180;
waves[i].x = -100;
waves[i].y = (rand()%200)-100;
waves[i].x_inc = (rand()%6) + 1;
waves[i].y_scale = (rand()%100)/10.0 + 1;
waves[i].r = (rand()%192) + 64;
waves[i].g = (rand()%192) + 64;
waves[i].b = (rand()%192) + 64;
}

void update_waves(void)
{
int i;
for (i=0; i<WAVE_SIZE; i++){
waves[i].angle += waves[i].angle_inc;
waves[i].x+=waves[i].x_inc;
if (waves[i].x>100) init_wave(i);
}
}

void timer(int value)
{
update_waves();
}

void init(void)
{
int i;
for (i=0; i<WAVE_SIZE; i++){
init_wave(i);
}
}[/c]
恩恩,编译运行:
[bash]$ gcc -o demo demo.c -lglut # 你需要装好libglut先
$ ./demo[/bash]
恩不错,才15KB
啥?想要现成的?好吧,下不为例(-_-||)
附件:
demo.tar.gz [6.8 KiB]
被下载 37 次

Happy programming!


_________________
我是 Giumo Clanjor(哆啦比猫/兰威举)
Where there is a hacker, there is art. | Develop for Developers. (C & perl5)
博客 | Clanjor Prods.
类 C 语言到 brainfuck 编译器


最后由 cjxgm 编辑于 2011-03-06 13:51,总共编辑了 1 次

页首
 用户资料  
 
2 楼 
 文章标题 : Re: 又写了一个 demoscene (64K动画)
帖子发表于 : 2011-03-06 13:49 

注册: 2010-09-27 12:59
帖子: 2061
送出感谢: 0 次
接收感谢: 0 次
看到了宇宙的起源..外行支持


_________________
生活里,有很多转瞬即逝,像在车站的告别,刚刚还相互拥抱,转眼已各自天涯。很多时候,你不懂,我也不懂,就这样,说着说着就变了,听着听着就倦了,看着看着就厌了,跟着跟着就慢了,走着走着就散了,爱着爱着就淡了,想着想着就算了。


页首
 用户资料  
 
3 楼 
 文章标题 : Re: 又写了一个 demoscene (64K动画)
帖子发表于 : 2011-03-06 13:55 
头像

注册: 2010-10-07 14:23
帖子: 33999
地址: 某系某星某洲某国某省某市
系统: Archdows10
送出感谢: 29
接收感谢: 151
想起了弦理论。 :em02


_________________
心似浮云常自在,意如流水任东西。
此事背后一定有个天大的咪咪
广告:
1、走过路过,不要错过,dropbox网盘2.25G大放送
py大法好,退C保平安
java多妖孽,VB本异端
日诵一千遍,快活似神仙


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 3 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译