回答編集履歴
3
ソースのrectの部分を修正
answer
CHANGED
@@ -51,6 +51,7 @@
|
|
51
51
|
|
52
52
|
int main(int argc, char *argv[])
|
53
53
|
{
|
54
|
+
SDL_Rect rect;
|
54
55
|
SDL_Event event;
|
55
56
|
SDL_Color white = {255, 255, 255};
|
56
57
|
int isFinish = 0;
|
@@ -73,7 +74,11 @@
|
|
73
74
|
SDL_Texture *texture = SDL_CreateTextureFromSurface(renderer, image);
|
74
75
|
|
75
76
|
// rectにimageの幅と高さを入れてからサーフェスを開放する
|
77
|
+
rect.x = 0;
|
78
|
+
rect.y = 0;
|
76
|
-
|
79
|
+
rect.w = image->w;
|
80
|
+
rect.h = image->h;
|
81
|
+
|
77
82
|
SDL_FreeSurface(image);
|
78
83
|
|
79
84
|
while (isFinish == 0)
|
2
余計なコメントを削除
answer
CHANGED
@@ -19,7 +19,6 @@
|
|
19
19
|
|
20
20
|
```cpp
|
21
21
|
TTF_Font *font = TTF_OpenFont("meiryo.ttc", 24);
|
22
|
-
// 面倒でもエラーチェックはした方が良いと思う
|
23
22
|
if (font == NULL)
|
24
23
|
{
|
25
24
|
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "%s", TTF_GetError());
|
1
TTF_OpenFontの注意点を追記
answer
CHANGED
@@ -1,14 +1,36 @@
|
|
1
1
|
`SDL_CreateRenderer`の第1引数は`SDL_Window*`ですが、
|
2
2
|
`SDL_CreateWindow`で値を入れる前なので中身は不定です。
|
3
3
|
|
4
|
+
`Segmentation fault`の原因はココ
|
4
5
|
|
5
6
|
```cpp
|
6
7
|
renderer = SDL_CreateRenderer(Window, -1, SDL_RENDERER_ACCELERATED);
|
7
8
|
Window = SDL_CreateWindow("Font", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_SHOWN);
|
8
9
|
```
|
9
10
|
|
11
|
+
`TTF_OpenFont`でフルパスを指定しないとカレントフォルダ(実行ファイルと同じフォルダ)を参照するので、標準でインストールされているフォントだからといって省くとエラーになると思われる。
|
12
|
+
この場合、実行ファイルと同じフォルダに`meiryo.ttc`が無いと`TTF_GetError`は`Couldn't open meiryo.ttc`というメッセージを返す。
|
13
|
+
|
14
|
+
ここはちゃんとエラーチェックをした方が良いと思う。
|
15
|
+
|
16
|
+
あと、`TTF_RenderUTF8_Blended(font, "あいうえお", white);`の部分
|
17
|
+
ソースコードがUTF-8で保存されていないと文字化けする
|
18
|
+
ほかは知らないけどWindowsでVisual Studioを使う場合は`u8"あいうえお"`とした方が良い。
|
19
|
+
|
20
|
+
```cpp
|
21
|
+
TTF_Font *font = TTF_OpenFont("meiryo.ttc", 24);
|
22
|
+
// 面倒でもエラーチェックはした方が良いと思う
|
23
|
+
if (font == NULL)
|
24
|
+
{
|
25
|
+
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "%s", TTF_GetError());
|
26
|
+
return EXIT_FAILURE;
|
27
|
+
}
|
28
|
+
```
|
29
|
+
|
10
30
|
`image`から値を取り出す前に`SDL_FreeSurface`で開放処理をしてしまっているので、`image->w`と`image->h`の値は不定です。
|
11
31
|
|
32
|
+
こちらの環境では`w`と`h`に負の値が入っていて文字が描画されませんでした。
|
33
|
+
|
12
34
|
```cpp
|
13
35
|
SDL_FreeSurface(image);
|
14
36
|
|
@@ -21,7 +43,7 @@
|
|
21
43
|
`SDL_RenderClear`、`SDL_RenderCopy`、`SDL_RenderPresent`の一連の描画処理がループ前に行われています。
|
22
44
|
キー入力で動かしたりする処理が入って無いので問題はないかもしれませんが…。
|
23
45
|
|
24
|
-
switch case文ですがbreakとdefaultは省かずにちゃんと書いたほうが良いです。
|
46
|
+
後、`switch case`文ですが`break`と`default`は省かずにちゃんと書いたほうが良いです。
|
25
47
|
思わぬバグの元になりますので。
|
26
48
|
|
27
49
|
```cpp
|
@@ -42,7 +64,6 @@
|
|
42
64
|
SDL_Renderer *renderer = SDL_CreateRenderer(Window, -1, SDL_RENDERER_ACCELERATED);
|
43
65
|
|
44
66
|
TTF_Font *font = TTF_OpenFont("meiryo.ttc", 24);
|
45
|
-
// 面倒でもエラーチェックはした方が良いと思う
|
46
67
|
if (font == NULL)
|
47
68
|
{
|
48
69
|
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "%s", TTF_GetError());
|