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

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回答

1980閲覧

SDL2でキーを長押しした際、一瞬の遅れが生じてしまう

退会済みユーザー

退会済みユーザー

総合スコア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などを公式にサポートしています。

1グッド

0クリップ

投稿2019/07/08 07:15

編集2019/07/10 03:46

前提・実現したいこと

SDL2を使ってゲームを作っています。
キー入力での移動を実装したのですが、長押しすると一瞬遅れて動いてしまいます。
その遅れを直すにはどうすれば良いのでしょうか?

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

イメージ説明

該当のソースコード

C

1#include "SDL2/SDL.h" 2#include "SDL2/SDL_image.h" 3#include "SDL2/SDL_joystick.h" 4 5int Object[20][15] = { 6 {0, 0}, 7 {0, 0}}; 8 9int GetPos(SDL_Rect *from, SDL_Rect *to) 10{ 11 to->x = from->x * 32; 12 to->y = from->y * 32; 13 return 0; 14} 15 16int main(int argc, const char *argv[]) 17{ 18 SDL_Window *Window; 19 SDL_Renderer *renderer; 20 SDL_Surface *image; 21 SDL_Rect rect, rect_pos, rect_tmp; 22 SDL_Texture *texture; 23 SDL_Joystick *joy; 24 int isFinish = 0; 25 26 SDL_Init(SDL_INIT_EVERYTHING); 27 28 Window = SDL_CreateWindow("Key", 0, 0, 640, 480, SDL_WINDOW_SHOWN); 29 30 renderer = SDL_CreateRenderer(Window, -1, SDL_RENDERER_ACCELERATED); 31 SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); 32 33 image = IMG_Load("char/front.png"); 34 35 texture = SDL_CreateTextureFromSurface(renderer, image); 36 rect.x = 0; 37 rect.y = 0; 38 rect.w = image->w; 39 rect.h = image->h; 40 41 rect_pos.w = image->w; 42 rect_pos.h = image->h; 43 rect_pos.x = 0; 44 rect_pos.y = 0; 45 SDL_FreeSurface(image); 46 47 Object[1][1] = 1; 48 49 rect_tmp = rect; 50 while (isFinish == 0) 51 { 52 53 SDL_Event event; 54 const Uint8 *state = SDL_GetKeyboardState(NULL); 55 56 while (SDL_PollEvent(&event)) 57 { 58 if (state[SDL_SCANCODE_DOWN]) 59 { 60 rect_tmp.y++; 61 } 62 if (state[SDL_SCANCODE_UP]) 63 { 64 rect_tmp.y--; 65 } 66 if (state[SDL_SCANCODE_RIGHT]) 67 { 68 rect_tmp.x++; 69 } 70 if (state[SDL_SCANCODE_LEFT]) 71 { 72 rect_tmp.x--; 73 } 74 if (state[SDL_SCANCODE_ESCAPE]) 75 { 76 isFinish = 1; 77 } 78 79 if (rect_tmp.y < 0 || 80 rect_tmp.y > 14 || 81 rect_tmp.x < 0 || 82 rect_tmp.x > 19 || 83 Object[rect_tmp.y][rect_tmp.x] == 1) 84 { 85 rect_tmp = rect; 86 } 87 else 88 { 89 rect = rect_tmp; 90 } 91 92 GetPos(&rect, &rect_pos); 93 } 94 95 SDL_RenderClear(renderer); 96 SDL_RenderCopy(renderer, texture, NULL, &rect_pos); 97 SDL_RenderPresent(renderer); 98 } 99 100 SDL_DestroyRenderer(renderer); 101 SDL_DestroyTexture(texture); 102 SDL_DestroyWindow(Window); 103 104 SDL_Quit(); 105 106 return 0; 107}

追記

イメージ説明

yuki23👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

while (SDL_PollEvent(&event)) のブロックの中にはイベントが発生しない限り入りませんが、キーを押している間ずっとイベントが発生しているわけではないので、動きが遅くなります。
while (SDL_PollEvent(&event)) の中身を外に出せば、とりあえず動くのではないかと思います。

投稿2019/07/09 14:20

yuki23

総合スコア1448

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

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

退会済みユーザー

退会済みユーザー

2019/07/10 03:45

回答ありがとうございます。 とりあえずラグは無くなったのですが、動きがものすごく速くなってしまいました。(画像参照) 一回の入力で動かす幅を変更すれば改善するのでしょうが、他にいい方法はありますでしょうか?
yuki23

2019/07/10 09:58

> 一回の入力で動かす幅を変更すれば改善するのでしょうが そうして下さい。普通はそうします。
退会済みユーザー

退会済みユーザー

2019/07/17 10:02

返信遅くなりすみません。 それでは、コンピュータのスペックによって動きが変わってしまうのでは無いでしょうか?
yuki23

2019/07/17 10:35 編集

動かす距離を、キーを押している時間に比例するようにすればよいでしょう。 SDLの機能では、SDL_GetTicksで初期化からの経過時間がわかりますので、押した時点からの差分を求めれば、キーを押している時間がわかります。
退会済みユーザー

退会済みユーザー

2019/07/17 10:35

確かにそれなら実現できますね。 回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問