- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
#include <stdio.h> // this library is for standard input and output
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include "glut.h"// this library is for glut the OpenGL Utility Toolkit
#define RAINSIZE 50
int winWidth = 1000, winHeight = 1000;
int counter = 0;
time_t t;
float rotationAngle = 0;
struct drop {
float x = 400;
float y = 400;
float inc = 0.01;
float radius = 5;
float scale = 1.0;
float rotationAngle = 0;
float rotationInc = 1;
};
drop rain[RAINSIZE];
void initRain() {
srand((unsigned)time(&t));
for (int i = 0; i < RAINSIZE; i++) {
rain[i].x = rand() % winWidth;
rain[i].y = rand() % winHeight;
rain[i].inc = 1.5 + (float)(rand() % 100) / 1000.0;
rain[i].radius = (float)(rand() % 8);
rain[i].scale = (float)(rand() % 20000) / 1000.0;
rain[i].rotationAngle = (float)(rand() % 3000) / 1000.0;
rain[i].rotationInc = (float)(rand() % 100) / 1000.0;
if ((rand() % 100) > 50) {
rain[i].rotationInc = -rain[i].rotationInc;
}
}
}
void drawParticleShape(int i) {
glBegin(GL_POINTS);
glVertex2d(rain[i].x, rain[i].y);
glEnd();
glBegin(GL_LINES);
glVertex2d(rain[i].x, rain[i].y);
glVertex2d(rain[i].x, rain[i].y + rain[i].radius * 2);
glEnd();
}
void drawDrop(int i) {
glColor3f(0.0, 0.0, 1.0);
glLineWidth(2);
drawParticleShape(i);
rain[i].y -= rain[i].inc;
if (rain[i].y < 0) {
rain[i].y = winHeight;
}
}
void drawRain() {
for (int i = 0; i < RAINSIZE; i++) {
drawDrop(i);
}
}
// this is the initialisation function, called once only
void init() {
glClearColor(0.0, 0.0, 0.0, 0.0); // set what colour you want the background to be
glMatrixMode(GL_PROJECTION); // set the matrix mode, we will look at this later
gluOrtho2D(0.0, winWidth, 0.0, winHeight);
}
float elapsedTime = 0, base_time = 0, fps = 0, frames;
void calcFPS() {
elapsedTime = glutGet(GLUT_ELAPSED_TIME);
if ((elapsedTime - base_time) > 1000.0) {
fps = frames * 1000.0 / (elapsedTime - base_time);
printf("fps: %f", fps);
base_time = elapsedTime;
frames = 0;
}
frames++;
}
// This is the display function it is called when ever you want to draw something
// all drawing should be called form here
void display() {
glClear(GL_COLOR_BUFFER_BIT);
drawRain();
calcFPS();
glFlush();
counter++;
glutPostRedisplay();
}
// This is the idle function it is called whenever the program is idle
// This has the effect of repeatedly calling the display function
void idle() {
//display();
}
// As with many programming languages the main() function
// is the entry point for execution of the program
int main(int argc, char** argv) {
srand(1);
initRain();
glutInit(&argc, argv); //perform the GLUT initialization
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA); // more initialisation
glutInitWindowSize(winWidth, winHeight); // set window position
glutInitWindowPosition(0, 0); // set window size
glutCreateWindow("Hello"); // create a display with a given caption for the title bar
glEnable(GL_BLEND); //Enable blending.
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); //Set blending function.
init(); // call init function defined above
glutIdleFunc(idle); // define what function to call when the program is idle
glutDisplayFunc(display); // define what function to call to draw
// the last function in the program puts the program into infinite loop
glutMainLoop();
// this line exits the program
return 0;
}
我正在尝试创建从屏幕顶部落下并扩散的雨滴,但雨滴没有正确落下。它应该像真正的雨一样落下。我试图弄清楚问题出在哪里,但我一直在使情况变得更糟。如果您能帮助我并告诉我问题出在哪里,我将不胜感激。
工作原理:
我希望它如何工作(编辑上图):
最佳答案
您必须通过 glClear
在每帧开始时清除默认帧缓冲区(“窗口”)的颜色平面.请注意,只要您不明确更改帧缓冲区的内容,它就不会更改。您绘制的所有内容都会保留,直到被清除或覆盖。
进一步不要在idle
中重绘窗口,而是在display
中通过glutPostRedisplay
将当前窗口标记为需要重新显示。 . GLUT 事件处理循环将为您执行 display
调用:
void display() {
glClear( GL_COLOR_BUFFER_BIT );
drawRain();
calcFPS();
glFlush();
counter++;
glutPostRedisplay();
}
void idle() {
//display();
}
关于c++ - 创造雨滴,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53814299/
我在创建/理解 promise 方面遇到了困难。我了解它们的优点并了解如何使用它们。创建自己的 promise 功能是困难的部分。简单地说,如何将此函数转换为与 Promise 一起使用: ret.g
这是我以前的question的跟进 假设我想用我的函数创建一个future,但是不想立即启动它(即我不想调用val f = Future { ... // my function}。 现在,我可以看到
使用以下函数表示从本地 html 文件生成 Web 存档 function TLessonConstructor2.CreateMHT( const FileName : string):boolea
我正在研究注册安全。 @RestController public class UserController { @Autowired private BCryptPasswordEncoder bC
在下面的示例代码中,我想创建一个 Item来自 Component 的对象: struct Component { }; struct Item { explicit Item(Compone
我有以下代码。我认为通过发布我可以创建一个热流,但是每个连接上的 uniqueId 都不同。我希望 create 方法执行一次,然后作为任意数量的订阅者的热流运行。 private Date
我有以下型号 type User struct { gorm.Model Languages []Language `gorm:"many2many:user_language
我想做的是用管道创建这种通信: 1 / \ 3 2 \ / 4 所以应该有3个 child 。 parent 给第一个和第二个 child
我正在将一些代码从 Win32 移植到使用锁定文件的 Linux。我用 open 为 Linux 做了一个实现,但我不确定如果文件在 Samba 共享上它是否会工作。我试过了,它似乎可以正常工作,但我
我是一名优秀的程序员,十分优秀!