teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

ソースのrectの部分を修正

2019/06/03 13:13

投稿

退会済みユーザー
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
- SDL_Rect rect = {0, 0, image->w, image->h};
79
+ rect.w = image->w;
80
+ rect.h = image->h;
81
+
77
82
  SDL_FreeSurface(image);
78
83
 
79
84
  while (isFinish == 0)

2

余計なコメントを削除

2019/06/03 13:12

投稿

退会済みユーザー
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の注意点を追記

2019/06/03 13:05

投稿

退会済みユーザー
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());