ページ 11

ショップのプログラム

Posted: 2011年7月14日(木) 09:37
by HEVN
ショップの会話部分のプログラムがどうしても出来ません。
誰か教えてください。お願いします。
あとほかの部分のアドバイスなどがあれば教えてください。


shop.cpp

コード:

#include "DxLib.h"
#include "main.h"



//////////////////////////////////////////////////////////////////////////////
//  内部関数の定義
//////////////////////////////////////////////////////////////////////////////
static void Shop_data();//ショップ用外部データ管理
static void Shop_frame(int State);//ショップの枠の描写
static void Shop_Select(int x,int y,int State);//セレクトバーの描写
static void Shop_conve(int num);//ショップの会話画面
static void Shop_sell();//ショップの売却画面
static void Shop_buy();//ショップの購入画面
static void Shop_menu();//ショップのメニュー画面

//////////////////////////////////////////////////////////////////////////////
// 構造体
//////////////////////////////////////////////////////////////////////////////

//会話画面用構造体
typedef struct{
    char serif[10][255];  //セリフ保存用変数
	char serifBuf[10][40];//セリフ保存バッファ
    int flag;             //会話中かどうかのフラグ
	int KeyWaitFlag;      //ボタン押し待ちフラグ
	int serifnum;         //セリフの種類
	int CursorY,CursorX;  //描写座標
	int CP;               //行
}Conversation_t;
//メニュー用構造体
typedef struct{
	char moji[128]; // 項目名格納用変数
}Mane_t;
//ショップ用構造体
typedef struct{
	int SelectNum;       //メニュー選択場所
	int State;           //ショップの状態
	int Buyflag;         //購入中かどうか
}Shop_t;
//外部データ管理用構造体
typedef struct{
	int Frameimg[64];
	int Selectimg[16];
}Data_t;
//フレーム用構造体
typedef struct{
	int x,y;     //フレームの左上の座標
	int HEIGHT;  //フレームの縦の数
	int WIDTH;   //フレームの横の数
}Frame_t;
//武器データ用構造体
typedef struct{
	char nama[64];//武器の名前
	int  kind;     //武器の種類
	int  Power;    //武器の威力
	int  speed;    //武器の連射速度
	int  num;      //武器の連者数
	int  buy;      //武器の買値
	int  sell;     //武器の売値
}Weapon_t;

//////////////////////////////////////////////////////////////////////////////
// 変数
//////////////////////////////////////////////////////////////////////////////

Conversation_t CON;  //会話画面用構造体
Shop_t SP;           //ショップ用構造体
Data_t DT;           //外部データ管理用構造体
Mane_t mane[2][5]={
	{"購入","売却","御話","退出"},
	{"名称","威力","速度","連射数","値段"}};
Weapon_t WP[20];         //武器データ用構造体
Frame_t FM[4]={      //フレーム用構造体
	{10,80,13,5},  
	{10,350,8,33},
	{100,50,18,28},
	{540,350,8,6}}; 

//////////////////////////////////////////////////////////////////////////////
// 関数
//////////////////////////////////////////////////////////////////////////////
//ショップ用外部データ管理
static void Shop_data(){
	int n,num,i,fp,snum;
	char fname[2][32]={{"Weapon.csv"},
	                   {"Shop.txt"}};
	int input[64];
	char sinput;
	char inputc[64];

	LoadDivGraph("0.png",64,8,8,16,16,DT.Frameimg);
	LoadDivGraph("1.png",16,4,4,8,8,DT.Selectimg);
//セリフデータの読み込み
		snum=0;
		fp = FileRead_open(fname[1]);//ファイル読み込み
	if(fp == NULL){
		printfDx("read error\n");
		return;
	}
	while(1){
	    sinput=FileRead_getc(fp);//1文字取得する
		if(sinput==EOF){
			fp=NULL;
			break;
		}
		CON.serif[snum][CON.CP]=sinput;
		if(sinput!='\n')CON.CP++;
		else{
			CON.CP=0;
			snum++;
		}	
		}		
	//武器データの読み込み
        fp = FileRead_open(fname[0]);//ファイル読み込み
        if(fp == NULL){
                printfDx("read error\n");
                return;
        }
        for(i=0;i<2;i++)//最初の2行読み飛ばす
                while(FileRead_getc(fp)!='\n');
        n=0 , num=0;
        while(1){
                for(i=0;i<64;i++){
                        inputc[i]=input[i]=FileRead_getc(fp);//1文字取得する
                        if(inputc[i]=='/'){//スラッシュがあれば
                                while(FileRead_getc(fp)!='\n');//改行までループ
                                i=-1;//カウンタを最初に戻して
                                continue;
                        }
                        if(input[i]==',' || input[i]=='\n'){//カンマか改行なら
                                inputc[i]='\0';//そこまでを文字列とし
                                break;
                        }
                        if(input[i]==EOF){//ファイルの終わりなら
                                goto EXFILE;//終了
                        }
                }
                switch(num){
						case 0: for(int i=0;i<63;i++)WP[n].nama[i]   =inputc[i];break;
						case 1: WP[n].kind   =atoi(inputc);break;
						case 2: WP[n].Power  =atoi(inputc);break;
						case 3: WP[n].speed  =atof(inputc);break;
						case 4: WP[n].num    =atof(inputc);break;
						case 5: WP[n].buy    =atof(inputc);break;
						case 6: WP[n].sell   =atoi(inputc);break;
				}
                num++;
                if(num==7){
                        num=0;
                        n++;
                }
        }
EXFILE:
        FileRead_close(fp);
}
//ショップの枠の描写
static void Shop_frame(int State){
	static int num,tem,img;
	switch(State){
		case 0:
		case 3:
			num=2;
			break;
		case 1:
		case 2:
			num=3;
			break;
		case 5:
			num=4;
			break;
	}
	if(num==4)FM[1].WIDTH=33;
	else      FM[1].WIDTH=39;
	for(int z=0;z<num;z++){
	for(int i=0;i<FM[z].HEIGHT;i++){   //フレームの縦の数だけループ
		for(int j=0;j<FM[z].WIDTH;j++){//フレームの横の数だけループ
			if(i==0||i==FM[z].HEIGHT-1){
				if(j==0||j==FM[z].WIDTH-1)img=DT.Frameimg[4+(j/(FM[z].WIDTH-1)*3)+(i/(FM[z].HEIGHT-1)*24)];
				else                 img=DT.Frameimg[5+(i/(FM[z].HEIGHT-1)*24)];
			}
			else if(j==0||j==FM[z].WIDTH-1)img=DT.Frameimg[12+(j/(FM[z].WIDTH-1)*3)];
			if(i==0||j==0||i==FM[z].HEIGHT-1||j==FM[z].WIDTH-1)DrawGraph(FM[z].x+j*16,FM[z].y+i*16,img,TRUE);
		}
	}
	}
}
//セレクトバーの描写
static void Shop_Select(int x,int y,int State){
	static int Length,img;
	switch(State){
		case 0:
			Length=6;
			break;
		case 1:
			Length=50;
			break;
		case 2:
			Length=7;
			break;
	}

	for(int i=0;i<3;i++){
		for(int j=0;j<Length;j++){
			if(i==0||i==2){
				if(j==0||j==Length-1)img=DT.Selectimg[(j/(Length-1)*3)+(i/2*12)];
				else img=DT.Selectimg[1+(i/2*12)];
			}
			else if(j==0||j==Length-1)img=DT.Selectimg[8+(j/(Length-1))*3];
			else img=DT.Selectimg[9];
			DrawGraph(x+j*8,y+i*8,img,TRUE);
		}
	}
}
//ショップの会話画面
static void Shop_conve(int num){
	char OneMojiBuf[ 3 ];	// 1文字分一時記憶配列
		int i;
		char  Moji;
                // ボタン押し待ちフラグがたっていた場合はボタンが押されるまでここで終了
			if(CON.KeyWaitFlag == 1 ){
				if( ProcessMessage() == 0 && CheckHitKeyAll() != 0 )CON.KeyWaitFlag = 0 ;// ボタンが押されていたら解除
			}
			else{
				// 文字の描画
				Moji = CON.serif[num][CON.CP] ;
				switch( Moji ){
				case '&' :// 改行文字
                    CON.CP=0;
                    CON.CursorY++;
					break ;
				case '\n':
					CON.flag=0;
					CON.CP=0;
					CON.CursorX=0;
					CON.CursorY=0;
					  for( i = 0 ; i < 10 ; i ++ ){
								  for(int j = 0 ; j < 255; j ++ ){
									  CON.serifBuf[i][j]='\0';
								  }
							  }
					break;
				case '\r':
					while( ProcessMessage() == 0 && CheckHitKeyAll() != 0 ){}
					CON.KeyWaitFlag = 1 ;
                    CON.CP++;
					break;
		
						  default :	// その他の文字
							  // 1文字分抜き出す
							  OneMojiBuf[ 0 ] = CON.serif[num][CON.CP];
							  OneMojiBuf[ 1 ] = CON.serif[num][CON.CP+1];
							  OneMojiBuf[ 2 ] = '\0' ;
							  // 1文字テキストバッファに代入
							  CON.serifBuf[CON.CursorY ][CON.CursorX * 2 ] = OneMojiBuf[ 0 ] ;
							  CON.serifBuf[CON.CursorY ][CON.CursorX * 2 + 1 ] = OneMojiBuf[ 1 ];
							  // 参照文字位置を2バイト勧める
							  CON.CP += 2 ;					
							  // カーソルを一文字文進める				
							  CON.CursorX++;
							  break ;
					}
				}
		// テキストバッファの描画
		for(i=0;i<3;i++)
			DrawString(20,360+i*16,CON.serifBuf[i],GetColor( 255 , 255 , 255 ) ) ;

}
//ショップの売却画面
static void Shop_sell(){
}
//ショップの購入画面
static void Shop_buy(){
	for(int i=0;i<5;i++)DrawFormatString(120+i*80,75,GetColor(255,255,255),mane[1][i].moji);
	for(int i=0;i<10;i++){
		DrawFormatString(120,95+i*20,GetColor(255,255,255),"%s",WP[i].nama);
		DrawFormatString(216,95+i*20,GetColor(255,255,255),"%d",WP[i].Power);
		DrawFormatString(296,95+i*20,GetColor(255,255,255),"%d",WP[i].speed);
		DrawFormatString(406,95+i*20,GetColor(255,255,255),"%d",WP[i].num);
        DrawFormatString(440,95+i*20,GetColor(255,255,255),"%d",WP[i].buy);
		DrawFormatString(500,95+i*20,GetColor(255,255,255),"G");
	}

	if(SP.Buyflag==0){
		Shop_Select(112,91+SP.SelectNum*20,1);
		if(Key[KEY_INPUT_DOWN]==1)SP.SelectNum=(SP.SelectNum+1)%10; // 現在の選択項目を一つ下にずらす(ループする)
		if(Key[KEY_INPUT_UP]==1) SP.SelectNum=(SP.SelectNum+9)%10; // 現在の選択項目を一つ上にずらす(逆ループする)
		if(Key[KEY_INPUT_RETURN]==1){                  //エンターキーを押したら購入中フラグを立てる
			SP.Buyflag=1;
			SP.SelectNum=0;
		}
	}
	else{
		if(Key[KEY_INPUT_DOWN]==1||Key[KEY_INPUT_UP]==1)SP.SelectNum=(SP.SelectNum+1)%2; // 現在の選択項目を一つ下にずらす(ループする)
		DrawFormatString(560,380,GetColor(255,255,255),"はい");
		DrawFormatString(560,420,GetColor(255,255,255),"いいえ");
		Shop_Select(556,376+SP.SelectNum*40,2);
		if(Key[KEY_INPUT_RETURN]==1){  //エンターを押したとき
			if(SP.SelectNum==1){       //いいえならばBuyflagを0にする
				SP.SelectNum=0;
				SP.Buyflag=0;
			}
		}
	}
}
//ショップのメニュー画面
static void Shop_menu(){

	switch(SP.State){
			case 0:   
				Shop_Select(23,95+SP.SelectNum*50,0);
				break;   
			case 1: 
				Shop_buy();
				break;
			case 2:Shop_sell();break;
			case 3: 
				Shop_conve(0);
				break;
		}

	if(CON.flag==1)Shop_conve(CON.serifnum);
	else if(SP.State==0){
			if(Key[KEY_INPUT_DOWN]==1)SP.SelectNum=(SP.SelectNum+1)%4; // 現在の選択項目を一つ下にずらす(ループする)
			if(Key[KEY_INPUT_UP]==1) SP.SelectNum=(SP.SelectNum+3)%4; // 現在の選択項目を一つ上にずらす(逆ループする)
		if(Key[KEY_INPUT_RETURN]==1){
			SP.State=SP.SelectNum+1;
			SP.SelectNum=0;
		}
	}
for(int i=0;i<4;i++)DrawFormatString(30,100+i*50,GetColor(255,255,255),mane[0][i].moji); //ショップメニューの描写
		
}
//ショップ初期化
void Shop_ini(){
	memset(CON.serifBuf,0,sizeof(CON.serifBuf));
	memset(CON.serif,0,sizeof(CON.serif));
	SetFontSize(16);
	CON.flag=1;
	CON.serifnum=0;
	CON.CP=0;
	SP.Buyflag=0;
	Shop_data();
}
void Shop_main(){
	Shop_frame(SP.State+(SP.Buyflag*4));
	Shop_menu();
}
Weapon.csv

/武器の名前,種類,威力,連射速度,連射数,買値,売値
,,,,,,
M92F,0,10,10,1,1500,500
H&K P8,0,12,10,1,2000,750
SIG P226,0,15,8,1,4000,1000
M93R,0,20,5,1,8000,3000
AK74,1,5,3,8,3000,1000

Shop.txt
いらっしゃい・・・いつも通り貧相な胸してやがんナ。&で、何にする?
ちったあウチの売り上げに貢献してケ
まいどありィ
てめ、買わねえのカヨ!見物料取るぞオイ
良いモン持ってきたんだろうナ?
うむ、買い取ってやる。感謝シロ
・・・え?
・・・カレーが食べたい。
俺だって昔はナ・・・、おい聞けよ!
HAHAHA☆今日ノ私ハ機嫌ガイイノデ~ス!何デモ持ってイッテクダッサ~イ!/nお前は誰だぁぁぁぁぁぁぁぁぁ!
み、漲ってきたぁ!今夜はパーr・・・おま!何時からいやがった!?

お願いします。

Re: ショップのプログラム

Posted: 2011年7月14日(木) 14:42
by softya(ソフト屋)
どう問題があるのか詳細と、単体で動くようにmainも用意してもらえますか?

Re: ショップのプログラム

Posted: 2011年7月14日(木) 14:54
by HEVN
main.cpp

コード:

#include "DxLib.h"
#include "Shop.h"
#include "main.h"
 
int Key[256];
 
int GetHitKeyStateAll_2(){
    char GetHitKeyStateAll_Key[256];
    GetHitKeyStateAll( GetHitKeyStateAll_Key );
    for(int i=0;i<256;i++){
        if(GetHitKeyStateAll_Key[i]==1) Key[i]++;
        else                            Key[i]=0;
    }
    return 0;
}

int GetKey(unsigned char Handle){
	return Key[Handle];
}
//何かキーが押され続けたカウントを取得する
void GetCheckHitKeyAll_2(int *HitCount)
{
	//	何かキーが押された?
	if( CheckHitKeyAll() > 0 ) {
		//	押されている間カウントする。
		(*HitCount)++;
	} else {
		//	開放されたら0に戻す。
		(*HitCount) = 0;
	}
}
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    ChangeWindowMode(TRUE);//ウィンドウモード
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
    Shop_ini();
    while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2()==0 && Key[KEY_INPUT_ESCAPE]==0){
          //↑メッセージ処理          ↑画面をクリア           ↑入力状態を保存       ↑ESCが押されていない
 
    Shop_main();
 
 
 
        ScreenFlip();
    }
 
    DxLib_End();
	return 0;
}

コード:

#ifndef INCLUDE_MAIN_H
#define INCLUDE_MAIN_H

//////////////////////////////////////////////////////
// 変数
//////////////////////////////////////////////////////
extern int Key[256];

////////////////////////////////////////////////////////
// 関数
////////////////////////////////////////////////////////
extern int GetKey(unsigned char Handle);
extern int GetHitKeyStateAll_2();


#endif //INCLUDE_MAIN_H

コード:

#ifndef INCLUDE_SHOP_H
#define INCLUDE_SHOP_H


////////////////////////////////////////////////////////
//構造体
////////////////////////////////////////////////////////


////////////////////////////////////////////////////////
// 関数
////////////////////////////////////////////////////////
extern void Shop_ini();
extern void Shop_main();

#endif //INCLUDE_SHOP_H

Re: ショップのプログラム

Posted: 2011年7月14日(木) 14:57
by h2so5
得体の知れないプログラムを持って来て、
教えてくださいと言われても答えようがありません。

「ショップのプログラム」がいかなる物なのか、
私達には分からないのですから。