ページ 11

初投稿、プログラミング初心者です。DXライブラリでの画像の表示と当たり判定について質問です。

Posted: 2017年7月08日(土) 01:53
by えそ
初投稿です。
まだこのサイトに来て日が浅いので、至らないところが多々あると思いますので。ご指導のほどよろしくお願いします。
以下テンプレを使って質問させていただきます。

[1] DXライブラリでの画像の表示と当たり判定について質問です。
 [1.1] 自分が今行いたいことは何か
   
   関数を使って当たり判定をつけてみたいです。

 [1.2] どのように取り組んだか(プログラムコードがある場合記載)
   
   DXライブラリ ゲームプログラム講座というサイトでプログラムをそのまま書き映しながら
   学んでいます。  http://dxlib.o.oo7.jp/dxlecture_main.html

   ですが、最近学校の授業でクラスの使い方や、関数の使い方について少し学んだので
   活用してみようと思い、自分なりにクラスを作って関数を使って動かしてみようと思い、
   キー入力による画像の移動はできたのですが、同じ関数に当たり判定も入れてみようとしたところ
   画像が映らなくなったのでどうしようかと思い質問しました。
   以下、コードです

コード:

#include "DxLib.h"
#include <string>
#include "../DxLib Project2/Inputstate.h"
#include "../DxLib Project2/Inputstate.cpp"

using namespace std;
Inputstate input;

int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int CmdShow)
{
	
	int Ball_x, Ball_y,SikakuMuki,Sikaku_x,Sikaku_y;
	int BallHandle, SikakuHandle;

	SetGraphMode(640, 480, 16);
	ChangeWindowMode(TRUE);

	if (DxLib_Init() == -1) return -1;


	SetDrawScreen(DX_SCREEN_BACK);

	//ボールの画像を読み込み&ボールの座標の指定
	BallHandle = LoadGraph("Textures/Ball.png");
	Ball_x = 288; Ball_y = 400;
	
	//四角の画像を読み込み&四角の座標の指定
	SikakuHandle = LoadGraph("Textures/Sikaku.png");
	Sikaku_x = 0; Sikaku_y = 50;
	SikakuMuki = 1;

	//移動繰り返し処理
	while (1)
	{
		ClearDrawScreen();
		{

			Ball_x = input.XKey(Ball_x);
			Ball_y = input.YKey(Ball_y);

			DrawGraph(Ball_x, Ball_y, BallHandle, FALSE);
		}

		{
		Sikaku_x -= 3;
		Sikaku_y -= 2;

		DrawGraph(Sikaku_x, Sikaku_y, SikakuHandle, FALSE);
    	}

		ScreenFlip();

		if (ProcessMessage() != 0) break;
		if (CheckHitKey(KEY_INPUT_ESCAPE) == 1) break;
	}

	DxLib_End();

	return 0;
-----------------------------------------------------------

コード:

#pragma once
#include "DxLib.h"
#include<string>

using namespace std;

class Inputstate
{

	
public:
	Inputstate();
	~Inputstate();

	///<summary>
	///X座標
	///</summary>
	///<param name="x"></param>
public:int XKey(int x)
{
	if (CheckHitKey(KEY_INPUT_LEFT) == 1) x -= 3;
	if (CheckHitKey(KEY_INPUT_RIGHT) == 1) x += 3;
	if (x < 0)  x = 0; 
	if (x > 640 - 64)  x = 640 - 64; 

	return x;

}
	   ///<summary>
	   ///Y座標
	   ///</summary>
	   ///<param name="x"></param>
public:int YKey(int y)
{
	if (CheckHitKey(KEY_INPUT_DOWN) == 1) y += 3;
	if (CheckHitKey(KEY_INPUT_UP) == 1) y -= 3;
	if (y < 0) { y = 0; }
	if (y > 480 - 640) { y = 640 - 64; }

	return y;
}
 [1.3] どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載)
    
    エラーは出ていませんが、画面端の当たり判定を付けた途端画像が表示しなくなります。
    また、当たり判定は、当たり判定の関数。キー入力はキー入力の関数って感じで分けてみたいです。

 [1.4] 今何がわからないのか、知りたいのか

関数でx座標とy座標を同時に返したいです。
   ですが、色々調べたところ返り値は一つしか返せないと知り、どのように二つの座標を返せばいいかがわからないです。
 C++はつい最近習い始めたので用語とか知らなくて具体的に説明できませんが関数でxとy座標を同時に返す
   ことは可能でしょうか?拙い質問ですがよろしくお願いします。

[2] 環境  
 [2.1] OS : Windows
 [2.2] コンパイラ名 : VC++ 2017

[3] その他
 ・どの程度C言語を理解しているか
  基礎のif文やfor文、配列、List,Dictionary,クラス、クラスの継承などを学校で習っています。
  今現在習っている部分はクラスの継承の部分です。

 ・ライブラリを使っている場合は何を使っているか
  DXライブラリ

使い方が間違ってる等ありましたらご指摘ください。

Re: 初投稿、プログラミング初心者です。DXライブラリでの画像の表示と当たり判定について質問です。

Posted: 2017年7月08日(土) 02:21
by みけCAT
えそ さんが書きました: [1.3] どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載)
    
    エラーは出ていませんが、画面端の当たり判定を付けた途端画像が表示しなくなります。

コード:

	if (y > 480 - 640) { y = 640 - 64; }
という行において、yの初期値400は480 - 640、すなわち-160より大きいので、y = 640 - 64、すなわちy = 576になります。
576は画面の縦幅である480より96大きいので、画像は画面外に描画され、表示されません。
条件式と、それが真のときにyに代入する値を適切に修正すればいいでしょう。
えそ さんが書きました:     また、当たり判定は、当たり判定の関数。キー入力はキー入力の関数って感じで分けてみたいです。
分けようとすればいいでしょう。
何がわからないのですか?
えそ さんが書きました:  [1.4] 今何がわからないのか、知りたいのか

関数でx座標とy座標を同時に返したいです。
   ですが、色々調べたところ返り値は一つしか返せないと知り、どのように二つの座標を返せばいいかがわからないです。
 C++はつい最近習い始めたので用語とか知らなくて具体的に説明できませんが関数でxとy座標を同時に返す
   ことは可能でしょうか?拙い質問ですがよろしくお願いします。
例えば、以下のいずれかを使えば可能といえるでしょう。

ポインタ

コード:

#include <iostream>

void func(int* x, int* y) {
	*x = 100;
	*y = 200;
}

int main(void) {
	int x = 0, y = 0;
	func(&x, &y);
	std::cout << "x = " << x << ", y = " << y << '\n';
	return 0;
}
参照

コード:

#include <iostream>

void func(int& x, int& y) {
	x = 100;
	y = 200;
}

int main(void) {
	int x = 0, y = 0;
	func(x, y);
	std::cout << "x = " << x << ", y = " << y << '\n';
	return 0;
}
構造体 (クラス)

コード:

#include <iostream>

struct coord_t {
	int x, y;

	coord_t(int x_ = 0, int y_ = 0) : x(x_), y(y_) {}
};

coord_t func(void) {
	return coord_t(100, 200);
}

int main(void) {
	coord_t c;
	c = func();
	std::cout << "x = " << c.x << ", y = " << c.y << '\n';
	return 0;
}

Re: 初投稿、プログラミング初心者です。DXライブラリでの画像の表示と当たり判定について質問です。

Posted: 2017年7月08日(土) 10:36
by えそ
みけCATさん 返信ありがとうございます。

早速治したら無事表示できました。
構文が間違っているのかなと思った手たのですがまさかタイプミスだとは

あと二つの値の返し方について返信してくださりありがとうございます。
まだポインタとかわからないのですが今から学んで早速取り入れてみようと思います。
ありがとうございました。