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

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

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

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

SDL (Simple DirectMedia Layer)

SDL (Simple DirectMedia Layer)は、C言語で記述されたクロスプラットフォームのマルチメディアライブラリです。画像や音などを 統一してアクセスするためのAPIを提供。LinuxやWindows、各種MacOSなどを公式にサポートしています。

Q&A

解決済

1回答

258閲覧

起動すると表示がおかしくなる

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

SDL (Simple DirectMedia Layer)

SDL (Simple DirectMedia Layer)は、C言語で記述されたクロスプラットフォームのマルチメディアライブラリです。画像や音などを 統一してアクセスするためのAPIを提供。LinuxやWindows、各種MacOSなどを公式にサポートしています。

0グッド

0クリップ

投稿2019/06/18 09:34

編集2019/06/18 09:37

前提・実現したいこと

SDL2でゲームを作っています。
キャラクターの向きを実装中に以下の問題が発生しました。

発生している問題・エラーメッセージ

イメージ説明
イメージ説明

同じ実行ファイルでも、画像の表示が違くなってしまいます。

該当のソースコード

C

1#include "SDL2/SDL.h" 2#include "SDL2/SDL_image.h" 3 4typedef struct{ 5 SDL_Surface *image_f,*image_b,*image_r, *image_l; 6 SDL_Rect rect, rect_pos, rect_tmp; 7 SDL_Texture *texture_f,*texture_b,*texture_r,*texture_l; 8 SDL_Texture *texture_use; 9}layer_dir; 10 11typedef struct{ 12 SDL_Surface *image_small,*image_middle,*image_large; 13 SDL_Rect rect,rect_pos,rect_tmp; 14 SDL_Texture *texture_small,*texture_middle,*texture_large; 15 SDL_Texture *texture_use; 16}layer_ani; 17 18int Object[20][15] = { 19 {0, 0}, 20 {0, 0}}; 21 22int GetPos(SDL_Rect *from, SDL_Rect *to) 23{ 24 to->x = from->x * 23; 25 to->y = from->y * 31; 26 return 0; 27} 28 29void maketex_dir(layer_dir *,SDL_Renderer*); 30void maketex_ani(layer_ani *undefined,SDL_Renderer *renderer); 31 32void LoadIMG_dir(const char front[20],const char back[20],const char right[20],const char left[20],layer_dir *undefined); 33void LoadIMG_ani(const char small[20],const char middle[20],const char large[20],layer_ani *undefined); 34 35int main(int argc, const char *argv[]) 36{ 37 SDL_Window *Window; 38 SDL_Renderer *renderer; 39 40 int isFinish = 0; 41 int img = 0; 42 43 layer_dir charcter; 44 45 46 SDL_Init(SDL_INIT_EVERYTHING); 47 48 Window = SDL_CreateWindow("Key", 0, 0, 640, 480, SDL_WINDOW_SHOWN); 49 50 renderer = SDL_CreateRenderer(Window, -1, SDL_RENDERER_ACCELERATED); 51 SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); 52 53 LoadIMG_dir("char/front.png","char/back.png","char/right.png","char/left.png",&charcter); 54 55 56 maketex_dir(&charcter,renderer); 57 58 charcter.rect.x = 0; 59 charcter.rect.y = 0; 60 charcter.rect.w = charcter.image_f->w; 61 charcter.rect.h = charcter.image_f->h; 62 63 64 65 Object[1][1] = 1; 66 67 charcter.texture_use = charcter.texture_f; 68 69 charcter.rect_pos = charcter.rect; 70 charcter.rect_tmp = charcter.rect; 71 while (isFinish == 0) 72 { 73 74 SDL_Event event; 75 76 while (SDL_PollEvent(&event)) 77 { 78 switch (event.type) 79 { 80 case SDL_KEYDOWN: 81 { 82 switch (event.key.keysym.sym) 83 { 84 case SDLK_UP: 85 charcter.rect_tmp.y -= 1; 86 charcter.texture_use = charcter.texture_b; 87 break; 88 89 case SDLK_DOWN: 90 charcter.rect_tmp.y += 1; 91 charcter.texture_use = charcter.texture_f; 92 break; 93 94 case SDLK_RIGHT: 95 charcter.rect_tmp.x += 1; 96 charcter.texture_use = charcter.texture_r; 97 break; 98 99 case SDLK_LEFT: 100 charcter.rect_tmp.x -= 1; 101 charcter.texture_use = charcter.texture_l; 102 break; 103 104 case SDLK_ESCAPE: 105 isFinish = 1; 106 break; 107 } 108 } 109 } 110 111 if (charcter.rect_tmp.y < 0 || 112 charcter.rect_tmp.y > 14 || 113 charcter.rect_tmp.x < 0 || 114 charcter.rect_tmp.x > 19 || 115 Object[charcter.rect_tmp.y][charcter.rect_tmp.x] == 1) 116 { 117 charcter.rect_tmp = charcter.rect; 118 } 119 else 120 { 121 charcter.rect = charcter.rect_tmp; 122 } 123 124 125 GetPos(&charcter.rect, &charcter.rect_pos); 126 } 127 128 SDL_RenderClear(renderer); 129 SDL_RenderCopy(renderer, charcter.texture_use, NULL, &charcter.rect_pos); 130 SDL_RenderPresent(renderer); 131 } 132 133 SDL_DestroyRenderer(renderer); 134 SDL_DestroyTexture(charcter.texture_f); 135 SDL_DestroyWindow(Window); 136 137 SDL_Quit(); 138 139 return 0; 140} 141 142void maketex_dir(layer_dir *undefined,SDL_Renderer *renderer){ 143 undefined->texture_f = SDL_CreateTextureFromSurface(renderer,undefined->image_f); 144 undefined->texture_b = SDL_CreateTextureFromSurface(renderer,undefined->image_b); 145 undefined->texture_r = SDL_CreateTextureFromSurface(renderer,undefined->image_r); 146 undefined->texture_l = SDL_CreateTextureFromSurface(renderer,undefined->image_l); 147 148 SDL_FreeSurface(undefined->image_f); 149 SDL_FreeSurface(undefined->image_b); 150 SDL_FreeSurface(undefined->image_r); 151 SDL_FreeSurface(undefined->image_l); 152} 153 154void LoadIMG_dir(const char front[20],const char back[20],const char right[20],const char left[20],layer_dir *undefined){ 155 undefined->image_f = IMG_Load(front); 156 undefined->image_b = IMG_Load(back); 157 undefined->image_r = IMG_Load(right); 158 undefined->image_l = IMG_Load(left); 159} 160 161void maketex_ani(layer_ani *undefined,SDL_Renderer *renderer){ 162 undefined->texture_small = SDL_CreateTextureFromSurface(renderer,undefined->image_small); 163 undefined->texture_middle = SDL_CreateTextureFromSurface(renderer,undefined->image_middle); 164 undefined->texture_large = SDL_CreateTextureFromSurface(renderer,undefined->image_large); 165 166 SDL_FreeSurface(undefined->image_small); 167 SDL_FreeSurface(undefined->image_middle); 168 SDL_FreeSurface(undefined->image_large); 169} 170 171void LoadIMG_ani(const char small[20],const char middle[20],const char large[20],layer_ani *undefined){ 172 173 undefined->image_small = IMG_Load(small); 174 undefined->image_middle = IMG_Load(middle); 175 undefined->image_large = IMG_Load(large); 176 177}

補足情報(FW/ツールのバージョンなど)

gcc animation.c -lSDL2 -lSDL2_Image -lSDL2_ttf -g -o0 -o a.outでコンパイルしています。

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

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

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

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

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

guest

回答1

0

ベストアンサー

解決しました。
rectの値を設定する前にSDL_FreeSurfaceしていたのが問題でした。

投稿2019/06/18 09:43

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問