質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

858閲覧

10秒立つと描画が止まってしまう

hikarhikar

総合スコア18

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/05/10 20:17

編集2020/05/10 21:35

描画が10秒立つと止まってしまいます。

[status.cppのworldClock()]関数で得た時間を描画していたのですが、なぜか10秒立つと止まってしまいます。(0,1,2,3,4,5,6,7,8,9という順番で描画され、最終的に9で止まってしまいます。)


[worldClock()]関数内で10秒経過したら初期化する処理を入れたのですが、その処理とは関係がありませんでした。5秒経過したら初期化に処理を書き換えても、0,1,2,3,4,0,1,2,3,4という順番で描画され最終的に4で止まってしまいました。


openglのdisplayFunc()関数
font.cppのfont_Draw()関数
status.cppのworldClock()関数
status.cppのdraw_status()関数

で処理が止まっているのかと思い、
printf関数で経過時間を描画したら、どの関数でも10秒経過以降も正常に処理されていました。


十の位を描画できないのかと思い
font_Draw()関数で

static int i=0;
i++;

で描画したら、5000ちょいまで描画できましたが、10秒立った瞬間にそれ以降は描画結果が変わりませんでした。(static int i の値はふえつづけているのに...)


動作はしているのに10秒立つととまってしまう。描画する値はふえつづけているのに...
font_Draw関数内の処理は正常なのに(10秒立っても処理は止まっていないが、10秒立つと描画がされない)、
なので、font_Draw関数になにかしらの原因があるのかと思い、色々試してみたのですががお手上げでした。

申し訳ありませんが、どこがいけないかご指摘いただければ幸いです。<(_ _)>

[status.h]

c

1#pragma once 2 3#define BUF_MAX 64 4 5class status { 6public: 7 int level = 0; 8 int nextLevel = 0; 9 int hp = 0; 10 int mp = 0; 11 int power = 0; 12 int defense = 0; 13 int speed = 0; 14 int jobCount = 0; 15 int gender = 0; 16 int intelligence = 0; 17 18 char Name[BUF_MAX] = { 0 }; 19}; 20 21class Human :public status { 22private: 23 int hour[2] = { 0 }; 24 int minute[2] = { 0 }; 25 int second[2] = { 0 }; 26public: 27 Human(); 28 void get_Name(); 29 void get_Job(); 30 31 void worldClock(); 32 void draw_status(); 33};

[status.cpp]

c

1#include <stdio.h> 2 3#include "status.h" 4#include "font.h" 5 6Human::Human() { 7 for (int i = 0; i < 2; i++) { 8 this->second[i] = 0; 9 this->minute[i] = 0; 10 this->hour[i] = 0; 11 } 12 13 this->nextLevel = 60; 14 this->level = 1; 15 this->hp = 10; 16 this->mp = 10; 17 this->power = 3; 18 this->defense = 3; 19 this->speed = 2; 20 this->jobCount = 5; 21 this->intelligence = 25; 22} 23 24void Human::get_Name() { 25 26} 27 28void Human::worldClock() { 29 static int time = 0; 30 if (time == 60) { 31 this->second[1]++; 32 time = 0; 33 } 34 if (this->second[1] == 10) 35 this->second[1] = 0; 36 37 time++; 38} 39int i = 0; 40void Human::draw_status() { 41 font_Begin(); 42 43 font_SetPosition(100, 122); 44 font_SetSize(35); 45 font_SetWidth(25); 46 font_GetColor(0x00, 0x00, 0x00); 47 font_Draw(L"%d%d:%d%d:%d%d", 48 this->hour[0], this->hour[1], 49 this->minute[0], this->minute[1], 50 i, this->second[1]); 51 i++; 52 font_SetPosition(432, 20); 53 font_SetSize(35); 54 font_SetWidth(25); 55 font_GetColor(0x00, 0x00, 0x00); 56 font_Draw(L"%d\n", this->level); 57 58 font_SetPosition(432, 55); 59 font_SetSize(15); 60 font_SetWidth(20); 61 font_GetColor(0x00, 0x00, 0x00); 62 font_Draw(L"%d\n", this->nextLevel); 63 64 font_SetPosition(100, 320); 65 font_SetSize(15); 66 font_SetWidth(20); 67 font_GetColor(0x00, 0x00, 0x00); 68 font_Draw(L"%d\n", this->power); 69 70 font_SetPosition(100, 355); 71 font_SetSize(15); 72 font_SetWidth(20); 73 font_GetColor(0x00, 0x00, 0x00); 74 font_Draw(L"%d\n", this->speed); 75 76 font_SetPosition(300, 320); 77 font_SetSize(15); 78 font_SetWidth(20); 79 font_GetColor(0x00, 0x00, 0x00); 80 font_Draw(L"%d\n", this->defense); 81 82 font_SetPosition(300, 355); 83 font_SetSize(15); 84 font_SetWidth(20); 85 font_GetColor(0x00, 0x00, 0x00); 86 font_Draw(L"%d\n", this->intelligence); 87 88 font_SetPosition(460, 320); 89 font_SetSize(15); 90 font_SetWidth(20); 91 font_GetColor(0x00, 0x00, 0x00); 92 font_Draw(L"%d\n", this->mp); 93 94 font_SetPosition(460, 355); 95 font_SetSize(15); 96 font_SetWidth(20); 97 font_GetColor(0x00, 0x00, 0x00); 98 font_Draw(L"%d\n", this->hp); 99 100 font_End(); 101}

[font.h]

c

1#define FONT_DEFAULT_SIZE 20 2 3void font_Begin(); 4void font_End(); 5 6void font_SetPosition(int _x, int _y); 7void font_SetWidth(int _width); 8void font_SetSize(int _size); 9 10int font_GetSize(); 11void font_GetColor(float red, float green,float blue); 12 13void font_Draw(const wchar_t* format, ...); 14

[font.cpp]

C

1#include <Windows.h> 2 3#include "glm/glm.hpp" 4#include "glut.h" 5 6#include "font.h" 7 8int x, y = 0; 9int width = 0; 10int size = FONT_DEFAULT_SIZE; 11float color[3] = { 0xff,0xff,0xff }; 12 13void font_Begin() { 14 glPushMatrix(); 15 glPushAttrib(GL_ALL_ATTRIB_BITS); 16 17 glMatrixMode(GL_PROJECTION); 18 glLoadIdentity(); 19 20 GLint viewport[4]; 21 glGetIntegerv(GL_VIEWPORT, viewport); 22 gluOrtho2D(0,viewport[2], viewport[3],0); 23 24 glMatrixMode(GL_MODELVIEW); 25 glLoadIdentity(); 26 27 glDisable(GL_DEPTH_TEST); 28 glDisable(GL_LIGHTING); 29 glDisable(GL_TEXTURE_2D); 30} 31 32void font_End() { 33 glPopMatrix(); 34 glPopAttrib(); 35} 36 37void font_SetPosition(int _x, int _y) { 38 x = _x + 5; 39 y = _y + 20; 40} 41 42void font_SetSize(int _size) { 43 size = _size; 44} 45 46void font_SetWidth(int _width) { 47 width = _width; 48} 49 50int font_GetSize() { 51 return size; 52} 53 54void font_GetColor(float _red, float _green, float _blue) { 55 color[0] = _red; 56 color[1] = _green; 57 color[2] = _blue; 58} 59 60void font_Draw(const wchar_t* format, ...) { 61 va_list argList; 62 63 if (format == nullptr)return; 64 65 wchar_t buf[256]; 66 va_start(argList, format); 67 vswprintf_s(buf, format, argList); 68 va_end(argList); 69 70 int length = wcslen(buf); 71 int list = glGenLists(length); 72 73 wchar_t fontType[] = { L"MS明朝" }; 74 HFONT Ofont = CreateFontW( 75 size, 76 width, 77 0, 78 0, 79 FW_REGULAR, 80 FALSE, 81 FALSE, 82 FALSE, 83 SHIFTJIS_CHARSET, 84 OUT_DEFAULT_PRECIS, 85 CLIP_DEFAULT_PRECIS, 86 DEFAULT_QUALITY, 87 FIXED_PITCH | FF_MODERN, 88 fontType); 89 90 HDC Odc = wglGetCurrentDC(); 91 SelectObject(Odc, Ofont); 92 93 wchar_t* font = buf; 94 int i = 0; 95 for (; (*font != '\0') && (*font != '\n'); font++) { 96 wglUseFontBitmapsW( 97 Odc, 98 *font, 99 1, 100 list + i 101 ); 102 i++; 103 } 104 glColor3f(color[0], color[1], color[2]); 105 glPushMatrix(); 106 { 107 glRasterPos2i(x, y); 108 for (int i = 0; i < length; i++) { 109 glCallList(list + i); 110 } 111 } 112 glPopMatrix(); 113 114 if (*font == '\n' || '\0') { 115 glDeleteLists(list, length); 116 117 font_SetPosition(0, y + font_GetSize()-15); 118 font_Draw(++font); 119 } 120} 121

[main.cpp]

opengl

1#include <stdio.h> 2#include <stdlib.h> 3 4#include "glm/glm.hpp" 5#include "glut.h" 6 7#include "rect.h" 8#include "font.h" 9#include "bmp.h" 10#include "status.h" 11 12using namespace glm; 13vec2 windowSize = { 600,400 }; 14Rect rect1 = Rect(0, 0, 600, 400); 15Human human1; 16 17void display(void) { 18 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 19 20 glMatrixMode(GL_PROJECTION); 21 glLoadIdentity(); 22 gluOrtho2D(0, windowSize.x, windowSize.y, 0); 23 24 glMatrixMode(GL_MODELVIEW); 25 glLoadIdentity(); 26 27 human1.worldClock(); 28 rect1.rect_Draw(); 29 human1.draw_status(); 30 31 glutSwapBuffers(); 32} 33 34void idle(void) { 35 glutPostRedisplay(); 36} 37 38void reshape(int width, int height) { 39 printf("reshape: width:%d height:%d\n", width, height); 40 glViewport(0,0,width,height); 41 windowSize = vec2(width, height); 42} 43 44void motion(int x, int y) { 45 printf("x:%d y:%d\n", x, y); 46} 47 48int main(int argc, char* argv[]) { 49 glutInit( 50 &argc, 51 argv); 52 glutInitDisplayMode(GL_DOUBLE); 53 glutInitWindowPosition(100,100); 54 glutInitWindowSize(windowSize.x,windowSize.y); 55 glutCreateWindow("Window"); 56 57 bmp_Load("ステータスウィンドウ.bmp"); 58 59 glutDisplayFunc(display); 60 glutIdleFunc(idle); 61 glutReshapeFunc(reshape); 62 glutMotionFunc(motion); 63 64 glutMainLoop(); 65 66 return 0; 67}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ぱっと見、気になった点を2つ。

vsprintf_s関数の引数が誤っている。
CreateFont関数で作成したフォントオブジェクトをDeleteObjectで解放していない。

投稿2020/05/10 22:33

majiponi

総合スコア1720

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hikarhikar

2020/05/11 06:49

majiponiさんご返答ありがとうございます。 majiponiさんがおっしゃった通りDeleteObjectで開放したら正常に動作できました。 本当にありがとうございました<(_ _)>
guest

0

ベストアンサー

動作確認はしていませんが…
コードを見た感じfont_Draw()内で毎回CreateFont()を呼びOdcにセットしており、Odcのフォントを元に戻さずDeleteObject()もしていないので、ある程度の回数呼び出された後にそれ以上フォントを作れなくなっているのでは?

今回直接関係ありませんが、書式化結果の2行目以降に書式化文字が含まれていると、font_Draw()再帰呼び出しで誤動作するので"%s"を指定しておいたほうがよいと思います。

diff

1- if (*font == '\n' || '\0') { 2+ if (*font == '\n' && *(font+1) != '\0') { 3 glDeleteLists(list, length); 4 5 font_SetPosition(0, y + font_GetSize()-15); 6- font_Draw(++font); 7+ font_Draw(L"%s", ++font); 8 }

投稿2020/05/10 22:23

編集2020/05/10 23:01
SHOMI

総合スコア4079

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hikarhikar

2020/05/11 06:47

SHOMIさんご返答ありがとうございます。 SHOMIさんがおっしゃった通りに直してみたら、正常に動作しました。 何から何まで本当にありがとうございました。<(_ _)>
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問