値を返さないコントロール パスがあります。と出て当たり判定が実装されない。(初学者)

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

トピックに返信する


答えを正確にご入力ください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: 値を返さないコントロール パスがあります。と出て当たり判定が実装されない。(初学者)

Re: 値を返さないコントロール パスがあります。と出て当たり判定が実装されない。(初学者)

#3

by keito94 » 8年前

梅衣堂ひよ さんが書きました: returnがfor文の中にしかないため、コンパイラからしてみるとCheckMapには返り値がない場合があるように見えているのが原因です。

for文の中にreturnあるけど、どの分岐でもこれだとfor文の1回目で必ず抜けてしまうため、きちんと判定してくれないのでは?(よく読んではいないため意図を汲めていない可能性はありますが
どうやら、それだったようです。ありがとうございました!!
追記:何故か当たり判定が実装されていない…どういうことだ…。

Re: 値を返さないコントロール パスがあります。と出て当たり判定が実装されない。(初学者)

#2

by 梅衣堂ひよ » 8年前

keito94 さんが書きました:

コード:

1>コードを生成中...
1>c:\users\keito940\documents\visual studio 2017\projects\スタアド\スタアド\collision.cpp(74): warning C4715: 'CCollision::CheckMap': 値を返さないコントロール パスがあります。
エラーというより警告では?
keito94 さんが書きました:

コード:

POINT CCollision::CheckMap(int x, int y) {
    POINT pt[] = {
        {x + mPt[0].x,  y + mPt[0].y},//左上
        {x + mPt[1].x,  y + mPt[1].y},//上の真ん中
        {x + mPt[2].x,  y + mPt[2].y},//右上
 
        {x + mPt[3].x,  y + mPt[3].y},//左の真ん中
        {x + mPt[4].x,  y + mPt[4].y},//右の真ん中
 
        {x + mPt[5].x,  y + mPt[5].y},//左下
        {x + mPt[6].x,  y + mPt[6].y},//下の真ん中
        {x + mPt[7].x,  y + mPt[7].y},//右下
    };
 
    POINT res = { x,y };
    DWORD cwidth = MapObj.GetChipWidth();
    DWORD cheight = MapObj.GetChipHeight();
    for (int i = 0; i < 8; i++) {
        int index = MapObj.GetValue(0, pt[i].x/MAPCHIP, pt[i].y/MAPCHIP);
        int src_x = (index % BitCount)*cwidth;
        int src_y = (index / BitCount)*cheight;
        if (src_x != 0 && src_y != 0) {
            res.x = pt[i].x / MAPCHIP;
            res.y = pt[i].y / MAPCHIP;
            return res;
        }
        res.x = -1;
        res.y = -1;
        return res;
    }
}
returnがfor文の中にしかないため、コンパイラからしてみるとCheckMapには返り値がない場合があるように見えているのが原因です。

for文の中にreturnあるけど、どの分岐でもこれだとfor文の1回目で必ず抜けてしまうため、きちんと判定してくれないのでは?(よく読んではいないため意図を汲めていない可能性はありますが

値を返さないコントロール パスがあります。と出て当たり判定が実装されない。(初学者)

#1

by keito94 » 8年前

プログラミング言語の知識を学びながら、当たり判定を実装しています。ですが、以下のエラーコードが出て、当たり判定が実装されません。
(マップエディタのライブラリはPlatinumです。)
エラーログは以下のとおりです。

コード:

1>コードを生成中...
1>c:\users\keito940\documents\visual studio 2017\projects\スタアド\スタアド\collision.cpp(74): warning C4715: 'CCollision::CheckMap': 値を返さないコントロール パスがあります。
Mapping.h

コード:

#pragma once
#include "fmfmap.h"
//マップオブジェクトの宣言
extern CFmfMap MapObj;
//ビットカウントの宣言
extern int BitCount;
//マップチップのサイズの宣言
const int MAPCHIP = 16;
Collision.h

コード:

#include "Main.h"
#include "Collision.h"
#include "Mapping.h"

CCollision::CCollision(POINT pt[], float clx, float cty, float crx, float cby,int col_type)
	:clx(clx), cty(cty), crx(crx), cby(cby),ColType(col_type) {
	Init();
	for (int i = 8; i < 8; i++) {
		mPt[i].x = pt[i].x;
		mPt[i].y = pt[i].y;
	}
}

void CCollision::Init() {
	ZeroMemory(mPt, sizeof(mPt));
}

void CCollision::GetXPosition(float* x, float* y, float* add_x, float* add_y) {
	float new_x;
	float temp_x = *x;
	float temp_add_x = *add_x;

	new_x = temp_x + temp_add_x;
	POINT block = CheckMap((int)new_x, (int)*y);
	if (block.x == -1) {
		//座標を更新
		*x = new_x;
	}
	else {
		if (temp_add_x > 0) {
			*x = (float)((block.x - 1) * 32 + 16 + crx - 0.1F);
		}
		else {
			*x = (float)((block.x + 1) * 32 + 16 + clx);
		}
		*add_x = 0;
	}
}

void CCollision::GetMove(float* x, float* y, float* add_x, float* add_y) {
	GetXPosition(x, y, add_x, add_y);
}

POINT CCollision::CheckMap(int x, int y) {
	POINT pt[] = {
		{x + mPt[0].x,	y + mPt[0].y},//左上
		{x + mPt[1].x,	y + mPt[1].y},//上の真ん中
		{x + mPt[2].x,	y + mPt[2].y},//右上

		{x + mPt[3].x,	y + mPt[3].y},//左の真ん中
		{x + mPt[4].x,	y + mPt[4].y},//右の真ん中

		{x + mPt[5].x,	y + mPt[5].y},//左下
		{x + mPt[6].x,	y + mPt[6].y},//下の真ん中
		{x + mPt[7].x,	y + mPt[7].y},//右下
	};

	POINT res = { x,y };
	DWORD cwidth = MapObj.GetChipWidth();
	DWORD cheight = MapObj.GetChipHeight();
	for (int i = 0; i < 8; i++) {
		int index = MapObj.GetValue(0, pt[i].x/MAPCHIP, pt[i].y/MAPCHIP);
		int src_x = (index % BitCount)*cwidth;
		int src_y = (index / BitCount)*cheight;
		if (src_x != 0 && src_y != 0) {
			res.x = pt[i].x / MAPCHIP;
			res.y = pt[i].y / MAPCHIP;
			return res;
		}
		res.x = -1;
		res.y = -1;
		return res;
	}
}
(一部のみなので単体では動かないことをご了承ください。)

ページトップ