キャラクター画像の分割と4方向への歩かせ方

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ライス

キャラクター画像の分割と4方向への歩かせ方

#1

投稿記事 by ライス » 15年前

ゲームプログラミングの館で学習している、C言語初心者です。
キャラクター画像の分割と、4方向への歩かせ方でつまづいてしまいました。
もともとサンプルにある画像ではできたのですが、http://www.tekepon.net/fsm/OADSの「VX版キャラクター」にある画像ではできませんでした。
それから、背景も一緒に写ってしまいます。
画像は、横に3・縦に4・合計12枚に分割して、画像1枚のサイズは32×48になると思います。
画像のキャラクターの向きは、1番上が前向き・2番目が左向き・3番目が右向き・4番目が後ろ向きです。
(すみません…画像は公開していいのか分からなかったので…)
どなたかその画像の分割方法、そしてそれを4方向に歩かせる方法を教えてください。
それと、背景を写らなくする方法を教えてください。
よろしくお願いします。

(補足)
・開発環境は、「Microsoft Visual C++ 2008 Express Edition」を利用しています。
・ライブラリは、DXライブラリを利用しています。 画像

ookami

Re:キャラクター画像の分割と4方向への歩かせ方

#2

投稿記事 by ookami » 15年前

こんばんは。

「もともとサンプルにある画像ではできた」ということは、単に分割のしかたと参照のしかたでしょうね。具体的には、ソースと元画像が分からないとなんとも言えませんが...。

素材サイトの画像なら、でどころ(URLなど)をちゃんと明記すれば問題ないと思います。
ただ、このサイトの素材投稿板の場合は、アップした人が独自に規約を書いている場合がありますから、ご注意ください。

背景色については、
SetTransColor で背景色の指定を変更するか、
元の画像の背景色を黒(0,0,0)にするのがいいと思います。

wing

Re:キャラクター画像の分割と4方向への歩かせ方

#3

投稿記事 by wing » 15年前

背景色というのはキャラの画像のバックの色でしょうか。
それなら一番簡単な方法は、画像ソフトでバックの色を
色域指定で選択して消してしまい透明にしてしまえばいいと思います。

ライス

Re:キャラクター画像の分割と4方向への歩かせ方

#4

投稿記事 by ライス » 15年前

投稿者です。
やはり画像がないと答えづらいと思うので、画像を添付します。
添付画像は、http://www.tekepon.net/fsm/EFMAPが配布しているフリー画像素材です。
よって、著作権はREFMAPに帰属します。
ソースについては、

#include "DxLib.h"

typedef struct{
int x , y , img , muki , walking_flag ;
} ch_t ;

int hantei [ 15 ] [ 20 ] = {
{ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 } ,
{ 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 } ,
{ 1 , 0 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 1 } ,
{ 1 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 1 } ,
{ 1 , 0 , 1 , 0 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 1 , 0 , 1 } ,
{ 1 , 0 , 1 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 1 , 0 , 1 } ,
{ 1 , 0 , 1 , 0 , 1 , 0 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 1 , 0 , 1 , 0 , 1 } ,
{ 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 } ,
{ 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 1 , 0 , 1 , 0 , 1 } ,
{ 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 1 , 0 , 1 } ,
{ 1 , 0 , 1 , 0 , 1 , 0 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 1 , 0 , 1 } ,
{ 1 , 0 , 1 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 1 } ,
{ 1 , 0 , 1 , 0 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 1 } ,
{ 1 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 } ,
{ 1 , 0 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 } ,
} ;

int can_or_cannot ( int x , int y , int muki ) {
if ( muki == 0 )
if ( hantei [ y / 32 - 1 ] [ x / 32 ] == 1 )
return 1 ;

if ( muki == 1 )
if ( hantei [ y / 32 ] [ x / 32 - 1 ] == 1 )
return 1 ;

if ( muki == 2 )
if ( hantei [ y / 32 + 1 ] [ x / 32 ] == 1 )
return 1 ;

if ( muki == 3 )
if ( hantei [ y / 32 ] [ x / 32 + 1 ] == 1 )
return 1 ;

return 0 ;
}

int WINAPI WinMain ( HINSTANCE hinstance, HINSTANCE hprevInstance, LPSTR loCmaLine, int CmaShow ) {
int image [ 12 ] , i , j ;
char Key [ 256 ] ;
ch_t ch ;

if ( ChangeWindowMode ( TRUE ) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1 ;

ch.x = 32 ;
ch.y = 448 ;
ch.walking_flag = 0 ;
ch.muki = 0 ;
int Color_Yellow = GetColor ( 255 , 255 , 0 ) ;
int Color_White = GetColor ( 255 , 255 , 255 ) ;

SetDrawScreen ( DX_SCREEN_BACK ) ;
LoadDivGraph ( "$vx_chara09_d.png" , 12 , 3 , 4 , 32 , 48 , image ) ;

while ( ! ProcessMessage() && ! ClearDrawScreen() && ! GetHitKeyStateAll ( Key ) && ! Key [ KEY_INPUT_ESCAPE ] ) {

for ( i = 0 ; i < 15 ; i++ )
for ( j = 0 ; j < 20 ; j++ )
if ( hantei [ i ] [ j ] == 1 )
DrawBox ( j * 32 , i * 32 , ( j + 1 ) * 32 , ( i + 1 ) * 32 , Color_White , TRUE ) ;

if ( ch.x % 32 == 0 && ch.y % 32 == 0 ) {
ch.walking_flag = 1 ;

if ( Key [ KEY_INPUT_UP ] == 1 )
ch.muki = 0 ;
else if ( Key [ KEY_INPUT_LEFT ] == 1 )
ch.muki = 1 ;
else if ( Key [ KEY_INPUT_DOWN ] == 1 )
ch.muki = 2 ;
else if ( Key [ KEY_INPUT_RIGHT ] == 1 )
ch.muki = 3 ;
else
ch.walking_flag = 0 ;

if ( ch.walking_flag == 1 )
if ( can_or_cannot ( ch.x , ch.y , ch.muki ) == 1 )
ch.walking_flag = 0 ;
}

if ( ch.walking_flag == 1 ) {
if ( ch.muki == 0 )
ch.y-- ;
else if ( ch.muki == 1 )
ch.x-- ;
else if ( ch.muki == 2 )
ch.y++ ;
else if ( ch.muki == 3 )
ch.x++ ;
}

ch.img = image [ ( ch.x % 32 + ch.y % 32 ) / 8 + ch.muki * 4 ] ;

DrawCircle ( 400 , 240 , 16 , Color_Yellow ) ;

DrawGraph ( ch.x , ch.y , ch.img , TRUE ) ;

ScreenFlip() ;
}
WaitKey() ;
DxLib_End() ;
return 0 ;
}

すみません…。
どこまで必要になるか分からなかったので、とりあえず全部書きました。
では、改めてよろしくお願いします。 画像

wing

Re:キャラクター画像の分割と4方向への歩かせ方

#5

投稿記事 by wing » 15年前

このサンプルは、縦4、横4の画像でうまく動くようにできているので、
私だったら、プログラムの変更を考えるより、画像をプログラムにあわせます。
具体的には、縦の2列目の止まっている画像をコピーして
一番左側に貼り付けて、縦4、横4にしちゃいます。

参考にならないと思いますので、他の方の意見を聞いてください。

ライス

Re:キャラクター画像の分割と4方向への歩かせ方

#6

投稿記事 by ライス » 15年前

投稿者です。
ありがとうございます。
ちゃんと出来ました。

閉鎖

“C言語何でも質問掲示板” へ戻る