キャラクターに武器を投げて攻撃させる時の方向で困ったところがいくつかあります。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
samusu0905
記事: 336
登録日時: 11年前

キャラクターに武器を投げて攻撃させる時の方向で困ったところがいくつかあります。

#1

投稿記事 by samusu0905 » 11年前

2Dキャラクターに武器を左右に投げて攻撃させる処理をしています。
右には連続で投げてくれるんですが、キャラクターが左を向いて武器を投げる時に問題がありまして。
左にも投げることは出来てますが、連続で投げることができていないのに対し、武器を左に投げるとなぜか武器を右にも投げてしまうんです。私がやりたいのは、キャラクターが武器を左右どちらにでも連続で投げれるようにしたいということです。
コード載せておきます。「ここがおかしい」とか「ここが違くないか?」とかそういったところがあれば是非お願いします。

コード:

//攻撃------------------------------------------------------------------------------------------------
void Curlsanattack(void)
{
	int i=0;
	//Fキー、ボタン1を押下
	if( gsKeyState ('F') == GSKS_PRESS ||
		gsGetJoyPadState(0,JOYPAD_BUTTON1) == GSKS_PRESS)
	{
		//カールさんが右向きなら
		if( gCurlsan.type == 0 )
		{
			//鎌の持参を呼ぶ
			KamaBringing( (int)gCurlsan.x+160, (int)gCurlsan.y+45,
				(int)gCurlsan.w+100, (int)gCurlsan.h+100, (int)gCurlsan.tx+130, (int)gCurlsan.ty+100,
				(int)gCurlsan.tw+100, (int)gCurlsan.th+140, gCurlsan.rotate);
			gKama[i].type = 0;
		}
		//カールさんが左向きなら
		if( gCurlsan.type == 1 )
		{
			//鎌の持参を呼ぶ
			KamaBringing((int)gCurlsan.x+5, (int)gCurlsan.y+45,
				(int)gCurlsan.w+100, (int)gCurlsan.h+100, (int)gCurlsan.tx+130, (int)gCurlsan.ty+100,
				(int)gCurlsan.tw+100, (int)gCurlsan.th+140, (float)gCurlsan.rotate);
			gKama[i].type = 1;
		}
	}
}
これがキャラクターのコードです。

コード:

//****************************************************************
//                           鎌の処理
//****************************************************************
#include <stdio.h>				//C言語
#include "gs.h"					//学内ライブラリ
#include "def.h"				//共通定義
#include "Kama.h"				//鎌


//変数宣言-------------------------------------------------
OBJ gKama[KAMA_MAX];			//鎌の構造体
int gKamaTimer;					//鎌のタイマー


//変数参照-------------------------------------------------
extern gsTexture sKama1;		//鎌の右向き
extern gsTexture sKama2;		//鎌の左向き
extern gsTexture sKamastick;	//鎌 貼る専用
extern OBJ gCurlsan;			//カールさんの構造体


//開始------------------------------------------------------------------------------------------------------------
void KamaStart(void)
{
	int i;

	//鎌の数ループ
	for( i=0; i < KAMA_MAX; i++)
	{
		gKama[i].flg = OFF;
	}
	gKamaTimer = 0;						//鎌を連続で投げるタイマー
}


//メイン----------------------------------------------------------------------------------------------------------
void KamaMain(void)
{
	KamaMove();					//移動
	KamaInScreen();				//移動範囲の制限
	KamaBringingTimer();		//鎌を持つ時間
}


//表示------------------------------------------------------------------------------------------------------------
void KamaDraw(void)
{
	int x=0, y=0, w=0, h=0, tx=0, ty=0, tw=0, th=0;
	float rotate=0;
	gsDraw2D( sKamastick, 15, 50);

	//鎌の数ループ
	for(int i=0; i < KAMA_MAX; i++)
	{
		//鎌が存在すれば
		if( gKama[i].flg == ON)
		{
			//鎌が右向きなら
			if( gKama[i].type == 0)
			{
				gsDraw2DPartEx( sKama1, (int)gKama[i].x, (int)gKama[i].y,
					(int)gKama[i].w,(int)gKama[i].h,(int)gKama[i].tx,(int)gKama[i].ty,
					(int)gKama[i].tw,(int)gKama[i].th,(float)gKama[i].rotate,0x80ffffffff);
			}
			//鎌が左向きなら
			if( gKama[i].type == 1)
			{
				gsDraw2DPartEx( sKama2, (int)gKama[i].x, (int)gKama[i].y,
					(int)gKama[i].w, (int)gKama[i].h, (int)gKama[i].tx, (int)gKama[i].ty,
					(int)gKama[i].tw, (int)gKama[i].th, (float)gKama[i].rotate, 0x80ffffffff);
			}
		}
	}
}


//持参-------------------------------------------------------------------------------------------------------------
void KamaBringing(int x, int y, int w, int h, int tx, int ty, int tw, int th, float rotate)
{
	int i;

	//持参出来ないなら
	if( gKamaTimer > 0)
	{
		return;
	}

	//鎌の数ループ
	for( i=0; i < KAMA_MAX; i++)
	{
		//持っていなければ
		if( gKama[i].flg == OFF)
		{
			KamaBringingOne(i,x,y,w,h,tx,ty,tw,th,rotate);		//持参の実施
			break;
		}
	}
}


//持参の実施------------------------------------------------------------------------------------------------------
void KamaBringingOne(int i, int x, int y, int w, int h, int tx, int ty, int tw, int th, float rotate)
{
	gKama[i].flg = ON;			//持参する
	gKama[i].x = (float)x;		//X座標
	gKama[i].y = (float)y;		//Y座標
	gKama[i].w = (float)w;		//幅
	gKama[i].h = (float)h;		//高さ
	gKama[i].tx = (float)tx;	//画像先のX座標
	gKama[i].ty = (float)ty;	//画像先のY座標
	gKama[i].tw = (float)tw;	//画像先の幅
	gKama[i].th = (float)th;	//画像先のの高さ
	gKama[i].rotate = (float)rotate;//画像の回転
	gKamaTimer = 1;			//持参不可能状態にする
}

//持参するタイマー------------------------------------------------------------------------------------------------
void KamaBringingTimer(void)
{
	//鎌タイマーが0より大きいなら
	if( gKamaTimer > 0 )
	{
		gKamaTimer++;//加算する

		//タイマーが8より大きいなら
		if( gKamaTimer > 8)
		{
			gKamaTimer = 0;		//持てる状態にする
		}
	}
}


//移動------------------------------------------------------------------------------------------------------------
void KamaMove(void)
{
	int i;

	//鎌の数ループ
	for( i=0; i < KAMA_MAX; i++)
	{
		if(gKama[i].flg == ON && gCurlsan.flg == ON)
		{
			//鎌が右向きなら
			if( gKama[i].type == 0)
			{
				gKama[i].rotate -= (float)0.3;			//右に回転
				gKama[i].x += 6;						//右に移動
			}
			else
			//鎌が左向きなら
			if( gKama[i].type == 1)
			{
				gKama[i].rotate += (float)0.3;			//左に回転
				gKama[i].x -= 6;						//左に移動
			}
		}
	}
}


//移動範囲の制限---------------------------------------------------------------------------------------------------
void KamaInScreen(void)
{
	int i;

	//鎌の数ループ
	for(i=0; i < KAMA_MAX; i++)
	{
		//鎌を持っているなら
		if(gKama[i].flg == ON)
		{
			KamaInScreenOne(i);					//鎌の移動範囲の制限の実施
		}
	}
}


//移動範囲の制限の実施---------------------------------------------------------------------------------------------
void KamaInScreenOne(int i)
{
	//鎌が右向きまたは左向きなら
	if( gKama[i].type == 0 || gKama[i].type == 1)
	{
		//鎌のX座標が画面サイズ+50より大きいまたは、鎌のX座標が-30より小さいなら
		if( gKama[i].x  > GS_WINDOW_WIDTH+50 || gKama[i].x < -30)
		{
			gKama[i].flg = OFF;
		}
	}
}
これが武器のコードです。
修正すべきところなどあればお願いします。
宜しくお願いします。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: キャラクターに武器を投げて攻撃させる時の方向で困ったところがいくつかあります。

#2

投稿記事 by みけCAT » 11年前

Curlsanattack関数内でgKama.type、すなわちgKama[0].typeを設定しているのは不自然だと思います。
なぜ素直にKamaBringingOne関数内で設定しないのですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

samusu0905
記事: 336
登録日時: 11年前

Re: キャラクターに武器を投げて攻撃させる時の方向で困ったところがいくつかあります。

#3

投稿記事 by samusu0905 » 11年前

みけCATさん。>>回答有難うございました。
気が付きませんでした。
教えていただき有難うございました。感謝します。
コードを直したら成功しました。
キャラクタが左右に武器を投げてくれました。
解決です。

閉鎖

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