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

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

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

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

SDL (Simple DirectMedia Layer)

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

Q&A

解決済

1回答

1355閲覧

SDLライブラリで指定した領域を描画する時に座標も指定する方法が知りたいライブラリ関数がどれかもわからない。w

退会済みユーザー

退会済みユーザー

総合スコア0

C++

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

SDL (Simple DirectMedia Layer)

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

0グッド

0クリップ

投稿2020/07/30 12:23

編集2020/07/30 12:57

提示コード//////////  部の二重for文のコードで指定した領域を指定した座標に描画するというプログラムを作りたいのですがどうすればいいのでしょうか?ライブラリ関数で一番近いのはこの関数ですがこれでは指定した範囲からの範囲を指定した大きさで拡大縮小して表示という関数なのでちょっとやりたいこととは違います。

やりたいこと

読み込んだテクスチャから読み込んだ.csvファイルの数値を参考にない場所ある場所あるなその番号とテクスチャのマップチップを照らし合わせて座標をCELL分ずらして描画したいです。

参考サイト(公式リファレンス): http://sdl2referencejp.osdn.jp/index.html

#include "stdio.h" #include "stdlib.h" #include <vector> #include "SDL.h" #include "SDL_image.h" //.CSVファイルを読み込んでvector<int>二次元配列に格納 std::vector<std::vector<int>> *GetLoad_CSV(const char *filename,std::vector<std::vector<int>> **result); std::vector<std::vector<int>> *GetLoad_CSV(const char *filename,std::vector<std::vector<int>> **result) { FILE *fp; char tm[5000];//読み込んだ.csvファイルの文字列 //const char *filename = "MapLayer1.csv"; //.csvファイルを読み込む //std::vector<std::vector<int>> idx; //マップチップ番号格納 std::vector<std::vector<int>> *idx = new (std::vector<std::vector<int>>); //マップチップ番号格納 int vi = 0; char str[10]; fp = fopen(filename, "r"); if (fp == NULL) { printf("読み込み失敗\n"); exit(1); } // printf("読み込み成功\n"); while(fgets(tm, 5000, fp) != NULL) //一行づつ読み取り { idx->emplace_back(); int i = 0; int c = 0; while (true) { if ( (tm[i] >= '0' && tm[i] <= '9') || (tm[i] == '-' || tm[i] == '+') ) //文字だった場合 { str[c] = tm[i]; i++; c++; } else { int t = atoi(str);//数字をint型に変換 idx->back().push_back(t); //最後の配列に追加 memset(str, '\0', sizeof(str)); //数字保存char型配列を空にする //文字以外の数字でそれが'\n','\0'だった最後なのでループを抜ける if (tm[i] == '\n' || tm[i] == '\0') { break; } c = 0; i++; } } } //print_vector(idx); if(result != NULL) { *result = idx; } return idx; } int main(int argc,char** argv) { #define CELL ((int)32) bool mIsRunning = true;//ループするかどうか? SDL_Event event;//イベント処理 SDL_Init(SDL_INIT_VIDEO);//SDLライブラリ初期化 SDL_Window *mWindow = SDL_CreateWindow("Game Programming in C++ (Chapter 2)", 100, // Top left x-coordinate of window 100, // Top left y-coordinate of window 1024, // Width of window 768, // Height of window 0 // Flags (0 for no flags set)) ); SDL_Renderer *mRenderer = SDL_CreateRenderer(mWindow, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); std::vector<std::vector<int>> *idx = GetLoad_CSV("MapLayer1.csv",nullptr);//マップレイヤーを読み込む //画像を読み込み SDL_Surface *surf = IMG_Load("Tiles.png");//画像ファイルのパス if(surf == NULL) { printf(" %s\n",SDL_GetError()); } //サーフェイスからテクスチャを生成 SDL_Texture *tex = SDL_CreateTextureFromSurface(mRenderer, surf); SDL_FreeSurface(surf);//サーフェスは要らないので開放 int w,h;//幅と高さを格納 SDL_QueryTexture(tex,NULL,NULL,&w,&h);//テクスチャから画像の幅と高さを取得する関数 //テクスチャの幅と高さを確認 printf("w: %d 幅の個数: %d\n", w, w / CELL); printf("h: %d 高さの個数: %d\n\n", h, h / CELL); SDL_Rect rect = { CELL * 2, CELL * 2, CELL * 1, CELL * 1 }; SDL_Rect rect2 = { CELL * 4, CELL * 4, CELL * 0, CELL * 0 }; //ゲームループ while(mIsRunning == true) { //キー入力処理 while(SDL_PollEvent(&event)) { switch (event.type) { case SDL_QUIT: mIsRunning = false; break; } } const Uint8* state = SDL_GetKeyboardState(NULL); //キーボード入力値を入れてる //ESCキーで終了 if(state[SDL_SCANCODE_ESCAPE]) { mIsRunning = false; } //レンダリング SDL_RenderClear(mRenderer); SDL_RenderCopyEx(mRenderer, tex, &rect, &rect2, 0, NULL, SDL_FLIP_NONE);// /////////////////////////////////////////////////////////////////////////////////////////////////////////// for (int i = 0; i < idx->size(); i++) { for (int j = 0; j < idx->at(i).size(); j++){ if(idx->at(i).at(j) != -1) { // SDL_RenderCopyEx(mRenderer, tex, &rect, &rect2, 0, NULL, SDL_FLIP_NONE);// } } } /////////////////////////////////////////////////////////////////////////////////////////////////////////// SDL_RenderPresent(mRenderer); } return 0; }

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

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

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

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

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

guest

回答1

0

ベストアンサー

CSVの数値に対するテクスチャの座標をどこかに置いておいて、SDL_RenderCopyで描画すればいいと思います。

C++

1SDL_Rect src_rects[] = { // CSVの数値に対するテクスチャの座標 2 { 0, 0, CELL, CELL }, 3 { CELL * 1, 0, CELL, CELL }, 4 { CELL * 2, 0, CELL, CELL }, 5 { CELL * 3, 0, CELL, CELL }, 6}; 7 8while (true) { 9 SDL_Event ev; 10 while (SDL_PollEvent(&ev)) 11 { 12 if (ev.type == SDL_QUIT) 13 return 0; 14 } 15 16 SDL_SetRenderDrawColor(render, 0, 0, 0, 255); 17 SDL_RenderClear(render); 18 19 for (int i = 0; i < idx->size(); i++) { 20 for (int j = 0; j < idx->at(i).size(); j++) { 21 if (idx->at(i).at(j) != -1) { 22 SDL_Rect dst = { j * CELL, i * CELL, CELL, CELL }; 23 SDL_RenderCopy(render, tex, &src_rects[idx->at(i).at(j)], &dst); 24 } 25 } 26 } 27 28 SDL_RenderPresent(render); 29}

投稿2020/07/30 19:45

mah

総合スコア591

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

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

退会済みユーザー

退会済みユーザー

2020/07/31 00:51

自分も落ち着いていろいろ第三第四引数をいじったらなんとなく実装できました。それとなんで座標を指定してそこに描画という関数がないのが不思議です。あと一つのテクスチャから分割してタイルチップとして配列とかに格納する関数がないのかも不思議だと思いませんかw
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問