前提・実現したいこと
前回もここでまったくわからないopenGLについて質問させていただいたのですが、また質問させていただきたいと思います。
openGLでの描画がしたいと思っていてペイントソフトのように作るとこまでは前の質問にて解決しました。
次は画面上にボタンを作ってそのボタンを押すとペンの色が変わるというものとまた違うボタンを押すと一度描画した線が消えるというものを作りたいです。
ボタンだと難しいようでしたらあらかじめキーボード入力を決めておいて Bを入力したら 青色のペイント Yを入力したら 一度描画した線が消えるものです。
自分のような無知が質問するのも申し訳ないのですがどうしても作りたいので、協力してくださると助かります!!
よろしくお願いいたします
ソースコード
int WINW = 600;
int WINH = 400;
const int TEXTMAX = 40;
const int POINTMAX = 10000; // 大量の角を持つ折れ線を描いているのだから、バッファサイズが10点分しかないと線がすぐ消えていってしまう
char text[TEXTMAX];
double xList[POINTMAX];
double yList[POINTMAX];
int textnum;
int pointnum;
void DrawString() {
glRasterPos3d(0, 0, 0);//0,0,0位置をスタート位置にする
glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, 'P'); glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, 'a'); glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, 'i'); glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, 'n'); glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, 't'); glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, '!');
}
void myDisplay() {
int i, j;
glClearColor(1.0, 1.0, 1.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); DrawString(); glColor3d(1.0, 0.0, 0.0); glBegin(GL_LINE_STRIP); for (i = 0; i < POINTMAX; i++) { j = (pointnum + i) % POINTMAX; if (xList[j] == -20.0) { // 座標バッファに目印となる値が見つかったら、そこをラインストリップの区切りとする glEnd(); glBegin(GL_LINE_STRIP); } else if (xList[j] >= -1.0 && yList[j] >= -1.0) { glVertex2d(xList[j], yList[j]); } } glEnd(); glRasterPos2d(-0.9, -0.7); glutSwapBuffers();
}
void myKeyboard(unsigned char key, int x, int y) {
if (key == 0x1B) exit(0);
text[textnum] = key;
textnum = (textnum + 1) % TEXTMAX;
glutPostRedisplay();
}
void myMouseFunc(int button, int state, int x, int y) {
if (button == GLUT_LEFT_BUTTON && state == GLUT_UP) {
// マウスボタンが放されたら、目印となる適当な値を座標バッファに入れてやる
// myDisplay中でその値が見つかったら、そこでラインストリップを区切ってやる
xList[pointnum] = -20.0;
yList[pointnum] = 0.0;
pointnum = (pointnum + 1) % POINTMAX;
glutPostRedisplay();
}
}
void myMotionFunc(int x, int y) {
// 前回のマウス座標と相違があれば、変更前のmyMouseFuncの
// ifブロック内でやっていたのと同じことを行う
static int prevX = -10.0, prevY = -10.0;
if (x == prevX && y == prevY) return;
prevX = x;
prevY = y;
xList[pointnum] = (((double)x / WINW) * 2) - 1;
yList[pointnum] = ((((double)y / WINH) * 2) - 1)*(-1);
pointnum = (pointnum + 1) % POINTMAX;
glutPostRedisplay();
}
void myReshape(int width, int height) {
glViewport(0, 0, width, height);
WINW = width;
WINH = height;
}
void myInit(char* progname) {
int i;
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
glutInitWindowSize(WINW, WINH);
glutInitWindowPosition(0, 0);
glutCreateWindow(progname);
pointnum = 0;
for (i = 0; i < POINTMAX; i++) {
xList[i] = -10.0;
yList[i] = -10.0;
}
textnum = 0;
for (i = 0; i < TEXTMAX; i++) {
text[i] = '?0';
}
}
int main(int argc, char* argv[]) {
glutInit(&argc, argv);
myInit(argv[0]);
glutKeyboardFunc(myKeyboard);
glutMouseFunc(myMouseFunc);
glutMotionFunc(myMotionFunc); // モーションイベント用のハンドラーを登録
glutReshapeFunc(myReshape);
glutDisplayFunc(myDisplay);
glutMainLoop();
return 0;
}
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/07/19 02:13