ショップのプログラム
Posted: 2011年7月14日(木) 09:37
ショップの会話部分のプログラムがどうしても出来ません。
誰か教えてください。お願いします。
あとほかの部分のアドバイスなどがあれば教えてください。
shop.cpp
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・・・おま!何時からいやがった!?
お願いします。
誰か教えてください。お願いします。
あとほかの部分のアドバイスなどがあれば教えてください。
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();
}
/武器の名前,種類,威力,連射速度,連射数,買値,売値
,,,,,,
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・・・おま!何時からいやがった!?
お願いします。