シューティングゲームの作り方改

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

トピックに返信する


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

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

トピックのレビュー
   

展開ビュー トピックのレビュー: シューティングゲームの作り方改

Re: シューティングゲームの作り方改

#17

by 参照魚 » 6年前

コード:

void tamaupdate(void)
{
    if (inport(PK_N))
    {
        gtama.fPosX = g_player.fPosX;
        gtama.fPosY = g_player.fPosY;
        gtama.flg = 1;
    }
 
    if (++gtama.fPosX > 79) {
        gtama.flg = 0;
    }
 
    if (gtama.fPosX == ou.fPosX&&gtama.fPosY == ou.fPosY)
    {
        gtama.fPosX = ou.fPosX - 1; // ここでgtama.fPosXの値を変更しているので
    }
}
 
 
void tamadrow(void)
{
    textcolor(RED);
 
    if (gtama.flg == 1)
    {
        gotoxy((int)gtama.fPosX, (int)gtama.fPosY);
        printf("弾");
    }
    /*if(gtama.flg == 0)
    {
        gotoxy((int)gtama.fPosX, (int)gtama.fPosY);
        printf("  ");
    }*/
 
 
    if (gtama.fPosX == ou.fPosX&&gtama.fPosY == ou.fPosY) // ここの条件が真にならないです
    {
        ou.fPosX +=2;
        gotoxy((int)ou.fPosX, (int)ou.fPosY);
        printf("王");
    }
    else
    {
        gotoxy((int)ou.fPosX, (int)ou.fPosY);
        printf("王");
    }
}
最初の条件判定で値を変更してしまっているので、次のところで真にならないため、ou.fPosX +=2;が実行されません。

コード:

void tamaupdate(void)
{
    if (gtama.fPosX == ou.fPosX&&gtama.fPosY == ou.fPosY)
    {
        gtama.move_flag = true; // SHOT構造体にメンバーを追加
    }
}
void tamadrow(void)
{
     if (gtama.move_flag == true) 
    {
        ou.fPosX +=2;
    }
     gotoxy((int)ou.fPosX, (int)ou.fPosY);
     printf("王");
    gtama.move_flag = false;
}

Re: 弾の当たり判定と弾の過去座標の消し方

#16

by こたん » 6年前

こたん さんが書きました:くばられたものなので、むだなところもあります
tama.cpp,player.cpp変更 構造体'ou'を作成
弾が王にあたったら王の座標が2動く処理にしてありますが
王がうごきません
main cpp

コード:

#include "main.h"
#include "player.h"
#include "./tama.h"

void Init(void);
void Uninit(void);
void Update(void);
void Draw(void);
void DispFPS(void);

#define DEBUG
int g_nCountFPS;				// FPSカウンタ

void main(void)
{
	// FPS計測するための変数
	DWORD dwExecLastTime;
	DWORD dwFPSLastTime;
	DWORD dwCurrentTime;
	int nCountFrame;

	// FPS計測の為の初期設定
	// 分解能を設定(何もしないとタイマの精度が悪くなるので設定)
	timeBeginPeriod(1);

	dwExecLastTime =
		dwFPSLastTime = timeGetTime();
	dwCurrentTime =
		nCountFrame = 0;

	Init();

	//printf("aaaaaaaaaaa");
	//getchar();
	//clrscr();

	do
	{
		dwCurrentTime = timeGetTime();
		if ((dwCurrentTime - dwFPSLastTime) >= 500)	// 0.5秒ごとに実行(毎回実行するとチカチカするので)
		{
			g_nCountFPS = nCountFrame * 1000 / (dwCurrentTime - dwFPSLastTime);
			dwFPSLastTime = dwCurrentTime;
			nCountFrame = 0;
		}

		if ((dwCurrentTime - dwExecLastTime) >= (1000 / 60))// FPSを60にするために設定
		{
			dwExecLastTime = dwCurrentTime;

			Update();

			Draw();

#ifdef DEBUG
			// FPS表示
			DispFPS();
#endif

			nCountFrame++;
		}
	} while (!inport(PK_ESC));

	//終了処理
	Uninit();

	// 分解能を戻す
	timeEndPeriod(1);
}
//=============================================================================
// 初期化処理
//=============================================================================
void Init(void)
{
	// プレイヤーの初期化処理
	InitPlayer();

}

//=============================================================================
// 終了処理
//=============================================================================
void Uninit(void)
{
	// プレイヤーの終了処理
	UninitPlayer();
}

//=============================================================================
// 更新処理
//=============================================================================
void Update(void)
{
	// プレイヤーの更新処理
	UpdatePlayer();

	//弾
	tamaupdate();

}

//=============================================================================
// 描画処理
//=============================================================================
void Draw(void)
{
	// プレイヤーの描画処理
	DrawPlayer();
	//弾
	tamadrow();
}

#ifdef DEBUG
//=============================================================================
// FPS表示
//=============================================================================
void DispFPS(void)
{
	// 色設定
	textcolor(WHITE);

	gotoxy(1, 1);
	printf("FPS:%d", g_nCountFPS);
}
#endif




tama.h

コード:

#pragma once
void tamaupdate(void);
void tamadrow(void);

#define ENEMY_SNUM_50

配布コード
conioex.h

コード:

 */
#ifndef __CONIOEX_H
#define __CONIOEX_H

#ifdef __cplusplus
extern "C" {
#endif

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#include <process.h>
#include <windows.h>
#include <tchar.h>
#include <mmsystem.h>
#include <digitalv.h>
#pragma comment(lib, "winmm.lib")

#ifdef CONIOEX
#define CONIOEX_INST extern 
#else /* !CONIOEX */
#define CONIOEX_INST 
#endif /* CONIOEX */

#ifdef __BORLANDC__
#define NOCURSOR		_NOCURSOR
#define SOLIDCURSOR		_SOLIDCURSOR
#define NORMALCURSOR	_NORMALCURSOR
__inline void setcursortype(int cur_t) {_setcursortype(cur_t);}
__inline int _kbhit(void) {return kbhit();}
#else /* !__BORLANDC__ */

#pragma warning(disable:4996)

#define NOCURSOR		0
#define SOLIDCURSOR		1
#define NORMALCURSOR	2

#define _NOCURSOR		NOCURSOR
#define _SOLIDCURSOR	SOLIDCURSOR
#define _NORMALCURSOR	NORMALCURSOR

#ifndef __COLORS
#define __COLORS
enum COLORS {
	BLACK,			/* 黒		*/
	BLUE,			/* 濃い青	*/
	GREEN,			/* 緑		*/
	CYAN,			/* 青緑		*/
	RED,			/* 濃い赤	*/
	MAGENTA,		/* 紫		*/
	BROWN,			/* 濃い黄	*/
	LIGHTGRAY,		/* 25%灰色	*/
	DARKGRAY,		/* 50%灰色	*/
	LIGHTBLUE,		/* 青		*/
	LIGHTGREEN,		/* 明るい緑	*/
	LIGHTCYAN,		/* 水色		*/
	LIGHTRED,		/* 赤		*/
	LIGHTMAGENTA,	/* ピンク	*/
	YELLOW,			/* 黄		*/
	WHITE			/* 白		*/
};
#endif /* _COLORS */

CONIOEX_INST WORD	__conioex_h_wAttribute		/* 境界色 */
#ifndef CONIOEX
= LIGHTGRAY
#endif /* CONIOEX */
;



/**
 * @brief	水平方向のカーソル位置を取得
 *
 * @return	現在のカーソル位置のX座標(1~)
 */
int wherex(void)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
	CONSOLE_SCREEN_BUFFER_INFO	csbi;

	GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
	return csbi.dwCursorPosition.X - csbi.srWindow.Left + 1;
}
#endif /* CONIOEX */

/**
 * @brief	垂直方向のカーソル位置を取得
 *
 * @return	現在のカーソル位置のY座標(1~)
 */
int wherey(void)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
	CONSOLE_SCREEN_BUFFER_INFO	csbi;

	GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
	return csbi.dwCursorPosition.Y - csbi.srWindow.Top + 1;
}
#endif /* CONIOEX */

/**
 * @brief	カーソル位置の移動
 *
 * @param	x [入力] X座標(1~)
 * @param	y [入力] Y座標(1~)
 */
void gotoxy(int x, int y)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
	COORD c;
	CONSOLE_SCREEN_BUFFER_INFO csbi;
	HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);

	c.X = x - 1;
	c.Y = y - 1;
	if (GetConsoleScreenBufferInfo(h, &csbi))
		c.Y += csbi.srWindow.Top;
	SetConsoleCursorPosition(h, c);
}
#endif /* CONIOEX */

/**
 * @brief	行末まで消去
 */
void clreol(void)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
	CONSOLE_SCREEN_BUFFER_INFO	csbi;
	COORD	c;
	HANDLE	h = GetStdHandle(STD_OUTPUT_HANDLE);

	if (GetConsoleScreenBufferInfo(h, &csbi)) {
		DWORD num;

		c = csbi.dwCursorPosition;
		FillConsoleOutputAttribute(h, csbi.wAttributes,
			csbi.srWindow.Right - csbi.dwCursorPosition.X + 1, c, &num);
		FillConsoleOutputCharacter(h, ' ',
			csbi.srWindow.Right - csbi.dwCursorPosition.X + 1, c, &num);
	}
}
#endif /* CONIOEX */

/**
 * @brief	画面消去
 */
void clrscr(void)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
	CONSOLE_SCREEN_BUFFER_INFO csbi;
	DWORD num;
	COORD c = {0, 0};
	HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);

	if (GetConsoleScreenBufferInfo(h, &csbi)) {
		__conioex_h_wAttribute = csbi.wAttributes;
		FillConsoleOutputAttribute(h, csbi.wAttributes, csbi.dwSize.X * csbi.dwSize.Y, c, &num);
		FillConsoleOutputCharacter(h, TEXT(' '), csbi.dwSize.X * csbi.dwSize.Y, c, &num);
		gotoxy(csbi.srWindow.Left + 1, csbi.srWindow.Top + 1);
	}
}
#endif /* CONIOEX */

/**
 * @brief	文字色高輝度化
 */
void highvideo(void)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
	CONSOLE_SCREEN_BUFFER_INFO csbi;
	HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);

	if (GetConsoleScreenBufferInfo(h, &csbi))
		SetConsoleTextAttribute(h, csbi.wAttributes | FOREGROUND_INTENSITY);
}
#endif /* CONIOEX */

/**
 * @brief	文字色低輝度化
 */
void lowvideo(void)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
	CONSOLE_SCREEN_BUFFER_INFO csbi;
	HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);

	if (GetConsoleScreenBufferInfo(h, &csbi))
		SetConsoleTextAttribute(h, csbi.wAttributes & ~FOREGROUND_INTENSITY);
}
#endif /* CONIOEX */

/**
 * @brief	既定文字色設定
 */
void normvideo(void)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), LIGHTGRAY);
}
#endif /* CONIOEX */

void textbackground(int newcolor)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
	CONSOLE_SCREEN_BUFFER_INFO csbi;
	HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
	if (GetConsoleScreenBufferInfo(h, &csbi))
		SetConsoleTextAttribute(h, (csbi.wAttributes & ~0x00f0) | ((newcolor & 0x07) << 4));
}
#endif /* CONIOEX */

void textcolor(int newcolor)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
	CONSOLE_SCREEN_BUFFER_INFO csbi;
	HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
	if (GetConsoleScreenBufferInfo(h, &csbi))
		SetConsoleTextAttribute(h, (csbi.wAttributes & ~0x0f) | (newcolor & 0x0f));
}
#endif /* CONIOEX */

void textattr(int newattr)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), newattr);
}
#endif /* CONIOEX */

void setcursortype(int cur_t)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
	CONSOLE_CURSOR_INFO	cci;
	static	int nSize = -1;

	if (nSize < 0) {
		if (GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci))
			nSize = (int)cci.dwSize;
		else
			nSize = 25;
	}
	cci.dwSize		= (cur_t < NORMALCURSOR) ? 100 : nSize;
	cci.bVisible	= (cur_t != NOCURSOR);
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
}
#endif /* CONIOEX */
__inline void _setcursortype(int cur_t) {setcursortype(cur_t);}

/**
 * @brief	現在行に挿入
 */
void insline(void)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
	CONSOLE_SCREEN_BUFFER_INFO	csbi;
	HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);

	if (GetConsoleScreenBufferInfo(h, &csbi)) {
		COORD	c;
		DWORD	len;
		DWORD	num;
		LPTSTR	psz;
		LPWORD	pw;

		c.X = csbi.srWindow.Left;
		len = csbi.srWindow.Right - csbi.srWindow.Left + 1;
		psz = (LPTSTR)_alloca(len * sizeof(TCHAR));
		pw = (LPWORD)_alloca(len * sizeof(WORD));
		for (c.Y = csbi.srWindow.Bottom; c.Y > csbi.dwCursorPosition.Y; c.Y--) {
			c.Y--;
			ReadConsoleOutputAttribute(h, pw, len, c, &num);
			ReadConsoleOutputCharacter(h, psz, len, c, &num);
			c.Y++;
			WriteConsoleOutputAttribute(h, pw, len, c, &num);
			WriteConsoleOutputCharacter(h, psz, len, c, &num);
		}
		FillConsoleOutputAttribute(h, csbi.wAttributes, len, c, &num);
		FillConsoleOutputCharacter(h, TEXT(' '), len, c, &num);
	}
}
#endif /* CONIOEX */

/**
 * @brief	現在行の削除
 */
void delline(void)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
	CONSOLE_SCREEN_BUFFER_INFO	csbi;
	HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);

	if (GetConsoleScreenBufferInfo(h, &csbi)) {
		DWORD	num;
		COORD	c;
		DWORD	len;
		LPTSTR	psz;
		LPWORD	pw;

		c.X = csbi.srWindow.Left;
		len = csbi.srWindow.Right - csbi.srWindow.Left + 1;
		psz = (LPTSTR)_alloca(len * sizeof(TCHAR));
		pw = (LPWORD)_alloca(len * sizeof(WORD));
		for (c.Y = csbi.dwCursorPosition.Y; c.Y < csbi.srWindow.Bottom; c.Y++) {
			c.Y++;
			ReadConsoleOutputAttribute(h, pw, len, c, &num);
			ReadConsoleOutputCharacter(h, psz, len, c, &num);
			c.Y--;
			WriteConsoleOutputAttribute(h, pw, len, c, &num);
			WriteConsoleOutputCharacter(h, psz, len, c, &num);
		}
		FillConsoleOutputAttribute(h, __conioex_h_wAttribute, len, c, &num);
		FillConsoleOutputCharacter(h, TEXT(' '), len, c, &num);
	}
}
#endif /* CONIOEX */

#endif /* __BORLANDC__ */

__inline void setcaption(char *title) {SetConsoleTitleA(title);}
__inline int getcaption(char *title, int len) {return GetConsoleTitleA(title, len);}
__inline void msleep(unsigned long msecs) {Sleep(msecs);}

#define PK_ENTER				VK_RETURN
#define PK_ESC					VK_ESCAPE
#define PK_F1					VK_F1
#define PK_F2					VK_F2
#define PK_F3					VK_F3
#define PK_F4					VK_F4
#define PK_F5					VK_F5
#define PK_F6					VK_F6
#define PK_F7					VK_F7
#define PK_F8					VK_F8
#define PK_F9					VK_F9
#define PK_F10					VK_F10
#define PK_F11					VK_F11
#define PK_F12					VK_F12
#define PK_SP					VK_SPACE
#define PK_UP					VK_UP
#define PK_DOWN					VK_DOWN
#define PK_RIGHT				VK_RIGHT
#define PK_LEFT					VK_LEFT
#define PK_SHIFT				VK_SHIFT
#define PK_CTRL					VK_CONTROL
#define PK_ALT					VK_MENU
#define PK_BS					VK_BACK
#define PK_PAUSE				VK_PAUSE
#define PK_INS					VK_INSERT
#define PK_DEL					VK_DELETE
#define PK_TAB					VK_TAB
#define PK_NFER					VK_KANA		/* [無変換]	*/
#define PK_XFER					VK_CONVERT	/* [変換]	*/
#define PK_0					0x30
#define PK_1					0x31
#define PK_2					0x32
#define PK_3					0x33
#define PK_4					0x34
#define PK_5					0x35
#define PK_6					0x36
#define PK_7					0x37
#define PK_8					0x38
#define PK_9					0x39
#define PK_NUMPAD0				VK_NUMPAD0	/* テンキーの[0]	*/
#define PK_NUMPAD1				VK_NUMPAD1	/* テンキーの[1]	*/
#define PK_NUMPAD2				VK_NUMPAD2	/* テンキーの[2]	*/
#define PK_NUMPAD3				VK_NUMPAD3	/* テンキーの[3]	*/
#define PK_NUMPAD4				VK_NUMPAD4	/* テンキーの[4]	*/
#define PK_NUMPAD5				VK_NUMPAD5	/* テンキーの[5]	*/
#define PK_NUMPAD6				VK_NUMPAD6	/* テンキーの[6]	*/
#define PK_NUMPAD7				VK_NUMPAD7	/* テンキーの[7]	*/
#define PK_NUMPAD8				VK_NUMPAD8	/* テンキーの[8]	*/
#define PK_NUMPAD9				VK_NUMPAD9	/* テンキーの[9]	*/
#define PK_A					0x41
#define PK_B					0x42
#define PK_C					0x43
#define PK_D					0x44
#define PK_E					0x45
#define PK_F					0x46
#define PK_G					0x47
#define PK_H					0x48
#define PK_I					0x49
#define PK_J					0x4A
#define PK_K					0x4B
#define PK_L					0x4C
#define PK_M					0x4D
#define PK_N					0x4E
#define PK_O					0x4F
#define PK_P					0x50
#define PK_Q					0x51
#define PK_R					0x52
#define PK_S					0x53
#define PK_T					0x54
#define PK_U					0x55
#define PK_V					0x56
#define PK_W					0x57
#define PK_X					0x58
#define PK_Y					0x59
#define PK_Z					0x5A

#define PK_LT					0x0BC		/* [,]	*/
#define PK_GT					0x0BE		/* [.]	*/
#define PK_SLUSH				0x0BF		/* [?]	*/
#define PK_DOT					VK_DECIMAL	/* テンキーの[.]	*/
#define PK_DIV					VK_DIVIDE	/* テンキーの[/]	*/
#define PK_BSLUSH				0x0E2		/* [_]	*/

#define PK_SEMICOLON			0x0BB		/* [;]	*/
#define PK_ADD					VK_ADD		/* テンキーの[+]	*/
#define PK_COLON				0x0BA		/* [:]	*/
#define PK_MUL					VK_MULTIPLY	/* テンキーの[*]	*/
#define PK_RBRACE				0x0DD		/* []]	*/

#define PK_ATMARK				0x0C0		/* [@]	*/
#define PK_LBRACE				0x0DB		/* [[]	*/

#define PK_MINUS				0x0BD		/* [-]	*/
#define PK_SUB					VK_SUBTRACT	/* テンキーの[-]	*/
#define PK_XOR					0x0DE		/* [^]	*/
#define PK_YEN					0x0DC		/* [\]	*/

#define PK_KANJI				0x0F3		/* [半角/全角]	*/
#define PK_CAPS					0x0F0		/* [英数][ひらがな]	*/

#define PM_LEFT					VK_LBUTTON
#define PM_MID					VK_MBUTTON
#define PM_RIGHT				VK_RBUTTON
#define PM_CURX					0x0101
#define PM_CURY					0x0102

#define PJ1_XPOS				0x0200
#define PJ1_YPOS				0x0201
#define PJ1_ZPOS				0x0202
#define PJ1_BTNS				0x0203
#define PJ2_XPOS				0x0210
#define PJ2_YPOS				0x0211
#define PJ2_ZPOS				0x0212
#define PJ2_BTNS				0x0213
#define PJ3_XPOS				0x0220
#define PJ3_YPOS				0x0221
#define PJ3_ZPOS				0x0222
#define PJ3_BTNS				0x0223
#define PJ4_XPOS				0x0230
#define PJ4_YPOS				0x0231
#define PJ4_ZPOS				0x0232
#define PJ4_BTNS				0x0233
#define PJ_XPOS					PJ1_XPOS
#define PJ_YPOS					PJ1_YPOS
#define PJ_ZPOS					PJ1_ZPOS
#define PJ_BTNS					PJ1_BTNS

CONIOEX_INST DWORD	__conioex_h_dwKeyMap[8]
#ifndef CONIOEX
= {0, 0, 0, 0, 0, 0, 0, 0}
#endif /* CONIOEX */
;
CONIOEX_INST COORD	__conioex_h_crdMouse
#ifndef CONIOEX
= {0, 0}
#endif /* CONIOEX */
;

/**
 * @brief	キー情報リセット
 *
 * @return	なし
 */
void reinport(void)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
	int i;
	for(i = 0; i < 8; i++)
	{
		__conioex_h_dwKeyMap[i] = 0;
	}
}
#endif /* CONIOEX */


/**
 * @brief	各種リアルタイム入力
 *
 * @param	port [入力] ポート番号(P*_*)
 * @return	入力値
 */
int inport(int port)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
	DWORD	dwEvent;
	HANDLE	h;

	/* ゲームパッド入力 */
	if ((port & 0xfe00) == 0x0200) {
		int		id = (port & 0x01f0) >> 4;
		int		func = port & 0x0f;
		JOYINFO	ji;

		switch (func) {
		case 0:	case 1:	case 2:	case 3:
			if (joyGetPos(id, &ji) != JOYERR_NOERROR)
				return -1;
			switch (func) {
			case 0:
				return ji.wXpos;
			case 1:
				return ji.wYpos;
			case 2:
				return ji.wZpos;
			case 3:
				return ji.wButtons;
			}
			break;
		default:
			break;
		}
		return 0;
	}
	// キー/マウス イベント チェック
	dwEvent = 0;
	h = GetStdHandle(STD_INPUT_HANDLE);
	if (GetNumberOfConsoleInputEvents(h, &dwEvent) && dwEvent) {
		DWORD			dwRead = 0;
		PINPUT_RECORD	pInpRec = (PINPUT_RECORD)_alloca(dwEvent * sizeof(INPUT_RECORD));

		if (ReadConsoleInput(h, pInpRec, dwEvent, &dwRead) && dwRead) {
			PINPUT_RECORD	pir = pInpRec;
			DWORD			dw;
			for (dw = 0; dw < dwRead; dw++, pir++) {
				switch (pir->EventType) {
				case KEY_EVENT: {
					KEY_EVENT_RECORD*	pker = &pir->Event.KeyEvent;
					if (pker->wVirtualKeyCode > 0x0FF)
						break;
					if (pker->bKeyDown)
						__conioex_h_dwKeyMap[pker->wVirtualKeyCode >> 5] |= (0x01 << (pker->wVirtualKeyCode & 31));
					else
						__conioex_h_dwKeyMap[pker->wVirtualKeyCode >> 5] &= ~(0x01 << (pker->wVirtualKeyCode & 31));
					if (pker->dwControlKeyState & (LEFT_ALT_PRESSED | RIGHT_ALT_PRESSED))
						__conioex_h_dwKeyMap[VK_MENU >> 5] |= (0x01 << (VK_MENU & 31));
					else
						__conioex_h_dwKeyMap[VK_MENU >> 5] &= ~(0x01 << (VK_MENU & 31));
					if (pker->dwControlKeyState & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED))
						__conioex_h_dwKeyMap[VK_CONTROL >> 5] |= (0x01 << (VK_CONTROL & 31));
					else
						__conioex_h_dwKeyMap[VK_CONTROL >> 5] &= ~(0x01 << (VK_CONTROL & 31));
					if (pker->dwControlKeyState & SHIFT_PRESSED)
						__conioex_h_dwKeyMap[VK_SHIFT >> 5] |= (0x01 << (VK_SHIFT & 31));
					else
						__conioex_h_dwKeyMap[VK_SHIFT >> 5] &= ~(0x01 << (VK_SHIFT & 31));
					break;
				}
				case MOUSE_EVENT: {
					MOUSE_EVENT_RECORD	*pmer = &pir->Event.MouseEvent;
					__conioex_h_crdMouse = pmer->dwMousePosition;
					if (pmer->dwButtonState & FROM_LEFT_1ST_BUTTON_PRESSED)
						__conioex_h_dwKeyMap[VK_LBUTTON >> 5] |= (0x01 << (VK_LBUTTON & 31));
					else
						__conioex_h_dwKeyMap[VK_LBUTTON >> 5] &= ~(0x01 << (VK_LBUTTON & 31));
					if (pmer->dwButtonState & FROM_LEFT_2ND_BUTTON_PRESSED)
						__conioex_h_dwKeyMap[VK_MBUTTON >> 5] |= (0x01 << (VK_MBUTTON & 31));
					else
						__conioex_h_dwKeyMap[VK_MBUTTON >> 5] &= ~(0x01 << (VK_MBUTTON & 31));
					if (pmer->dwButtonState & RIGHTMOST_BUTTON_PRESSED)
						__conioex_h_dwKeyMap[VK_RBUTTON >> 5] |= (0x01 << (VK_RBUTTON & 31));
					else
						__conioex_h_dwKeyMap[VK_RBUTTON >> 5] &= ~(0x01 << (VK_RBUTTON & 31));
					break;
				}
				default:
					break;
				}
			}
		}
	}

	// マウス座標を返す
	switch (port) {
	case PM_CURX:
		return __conioex_h_crdMouse.X + 1;
	case PM_CURY:
		return __conioex_h_crdMouse.Y + 1;
	default:
		break;
	}
	// キー状態を返す
	return (__conioex_h_dwKeyMap[(port & 0x0FF) >> 5] & (0x01 << (port & 31))) != 0;
}
#endif /* CONIOEX */

typedef struct {
	int				nDevType;
	MCIDEVICEID		wDeviceID;
	char			szPath[MAX_PATH];
	int				nRepeat;
} __conioex_h_SoundInfo;

/**
 * @brief	サウンド ファイルを開く
 *
 * @param	path [入力] ファイル名
 * @retval	非0	サウンド ハンドル
 * @retval	0	エラー
 */
int opensound(char *path)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
	const char	szMidiExt[] = ".mid|.midi|.rmi";
	const char	szWaveExt[] = ".wav|.wave";
	const char	szMP3Ext[] = ".mp3";
	char		szExt[_MAX_EXT];
	union {
		MCI_WAVE_OPEN_PARMSA	wop;
		MCI_OPEN_PARMSA			op;
	} m;
	DWORD		dwCmd;
	__conioex_h_SoundInfo	*psi;

	psi = (__conioex_h_SoundInfo *)malloc(sizeof(__conioex_h_SoundInfo));
	if (psi == NULL)
		return 0;
	ZeroMemory(psi, sizeof(*psi));

	ZeroMemory(&m, sizeof(m));
	_splitpath(path, NULL, NULL, NULL, szExt);
	strlwr(szExt);
	dwCmd = MCI_OPEN_TYPE | MCI_OPEN_ELEMENT;
	if (strstr(szMidiExt, szExt)) {
		psi->nDevType = MCI_DEVTYPE_SEQUENCER;
		lstrcpynA(psi->szPath, path, MAX_PATH);
		m.op.lpstrDeviceType = (LPCSTR)MCI_DEVTYPE_SEQUENCER;
		m.op.lpstrElementName = psi->szPath;
		dwCmd |= MCI_OPEN_TYPE_ID;
	} else if (strstr(szWaveExt, szExt)) {
		psi->nDevType = MCI_DEVTYPE_WAVEFORM_AUDIO;
		lstrcpynA(psi->szPath, path, MAX_PATH);
		m.wop.lpstrDeviceType  = (LPCSTR)MCI_DEVTYPE_WAVEFORM_AUDIO;
		m.wop.lpstrElementName = psi->szPath;
		dwCmd |= MCI_OPEN_TYPE_ID;
//		m.wop.dwBufferSeconds  = 60;
//		dwCmd |= MCI_WAVE_OPEN_BUFFER;
	} else if (strstr(szMP3Ext, szExt)) {
		psi->nDevType = MCI_DEVTYPE_DIGITAL_VIDEO;
		lstrcpynA(psi->szPath, path, MAX_PATH);
		m.op.lpstrDeviceType = "MPEGVideo";
		m.op.lpstrElementName = psi->szPath;
	} else {
		free(psi);
		return 0;
	}
	if (mciSendCommandA(0, MCI_OPEN, dwCmd, (DWORD)&m)) {
		free(psi);
		return 0;
	}
	psi->wDeviceID = m.op.wDeviceID;
	return (int)psi;
}
#endif /* CONIOEX */

/**
 * @brief	サウンド ファイルを閉じる
 *
 * @param	hsound [入力] サウンド ハンドル
 */
void closesound(int hsound)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
	__conioex_h_SoundInfo	*psi;

	if (!hsound)
		return;
	psi = (__conioex_h_SoundInfo *)hsound;
	if (psi->wDeviceID) {
		mciSendCommand(psi->wDeviceID, MCI_CLOSE, 0, 0);
		psi->wDeviceID = 0;
	}
	free(psi);
}
#endif /* CONIOEX */

/**
 * @brief	サウンドを再生する
 *
 * @param	hsound [入力] サウンド ハンドル
 * @param	repeat [入力] ループ有無
 */
void playsound(int hsound, int repeat)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
	__conioex_h_SoundInfo	*psi;
	DWORD					dwCmd;
	MCI_PLAY_PARMS			mpp;

	if (!hsound)
		return;
	psi = (__conioex_h_SoundInfo *)hsound;
	if (!psi->wDeviceID)
		return;
	psi->nRepeat = repeat;
	ZeroMemory(&mpp, sizeof(mpp));
	dwCmd = 0;
	if (repeat) {
		switch (psi->nDevType) {
		case MCI_DEVTYPE_DIGITAL_VIDEO:
			dwCmd |= (MCI_FROM | MCI_DGV_PLAY_REPEAT);
			mpp.dwFrom = 0;
			break;
		case MCI_DEVTYPE_SEQUENCER:
		case MCI_DEVTYPE_WAVEFORM_AUDIO:
			break;
		default:
			break;
		}
	}
	mciSendCommand(psi->wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, 0);
	mciSendCommand(psi->wDeviceID, MCI_PLAY, dwCmd, (DWORD)&mpp);
}
#endif /* CONIOEX */

/**
 * @brief	サウンド再生を停止する
 *
 * @param	hsound [入力] サウンド ハンドル
 */
void stopsound(int hsound)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
	__conioex_h_SoundInfo	*psi;

	if (!hsound)
		return;
	psi = (__conioex_h_SoundInfo *)hsound;
	if (!psi->wDeviceID)
		return;
	psi->nRepeat = 0;
	mciSendCommand(psi->wDeviceID, MCI_STOP, MCI_WAIT, 0);
	mciSendCommand(psi->wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, 0);
}
#endif /* CONIOEX */

/**
 * @brief	サウンド再生状態の取得
 *
 * @param	hsound [入力] サウンド ハンドル
 * @return	再生中ならば 0 以外を返す。
 */
int checksound(int hsound)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
	__conioex_h_SoundInfo	*psi;
	MCI_STATUS_PARMS		msp;

	if (!hsound)
		return 0;
	psi = (__conioex_h_SoundInfo *)hsound;
	if (!psi->wDeviceID)
		return 0;
	ZeroMemory(&msp, sizeof(msp));
	msp.dwItem = MCI_STATUS_MODE;
	if (mciSendCommand(psi->wDeviceID, MCI_STATUS, MCI_STATUS_ITEM, (DWORD)&msp))
		return 0;
	return msp.dwReturn == MCI_MODE_PLAY;
}
#endif /* CONIOEX */

/**
 * @brief	ループ再生の強制更新
 *
 * @param	hsound [入力] サウンド ハンドル
 */
void updatesound(int hsound)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
	__conioex_h_SoundInfo	*psi;
	MCI_STATUS_PARMS		msp;

	if (!hsound)
		return;
	psi = (__conioex_h_SoundInfo *)hsound;
	if (!psi->wDeviceID || !psi->nRepeat)
		return;
	switch (psi->nDevType) {
	case MCI_DEVTYPE_DIGITAL_VIDEO:
		break;
	case MCI_DEVTYPE_SEQUENCER:
	case MCI_DEVTYPE_WAVEFORM_AUDIO:
		ZeroMemory(&msp, sizeof(msp));
		msp.dwItem = MCI_STATUS_MODE;
		if (!mciSendCommand(psi->wDeviceID, MCI_STATUS, MCI_STATUS_ITEM, (DWORD)&msp)) {
			if (msp.dwReturn != MCI_MODE_PLAY) {
				if (psi->nRepeat > 0) {
					psi->nRepeat = -1;
					mciSendCommand(psi->wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, 0);
					mciSendCommand(psi->wDeviceID, MCI_PLAY, 0, 0);
				}
			} else
				psi->nRepeat = 1;
		}
		break;
	default:
		break;
	}
}
#endif /* CONIOEX */

/**
 * @brief	再生音量を設定する
 *
 * @param	hsound [入力] サウンド ハンドル
 * @param	percent [入力] 音量 (0 ~ 100)
 */
void setvolume(int hsound, int percent)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
	__conioex_h_SoundInfo	*psi;

	if (!hsound)
		return;
	psi = (__conioex_h_SoundInfo *)hsound;
	if (!psi->wDeviceID)
		return;
	switch (psi->nDevType) {
	case MCI_DEVTYPE_DIGITAL_VIDEO: {
		MCI_DGV_SETAUDIO_PARMS	mdsp;

		ZeroMemory(&mdsp, sizeof(mdsp));
		mdsp.dwItem = MCI_DGV_SETAUDIO_VOLUME;
		mdsp.dwValue = percent * 10;
		mciSendCommand(psi->wDeviceID, MCI_SETAUDIO,
			MCI_DGV_SETAUDIO_ITEM | MCI_DGV_SETAUDIO_VALUE, (DWORD)&mdsp);
		break;
	}
	case MCI_DEVTYPE_SEQUENCER: {
		DWORD dwVolume;

		dwVolume = 0x0ffff * percent / 100;
		midiOutSetVolume(0, (DWORD)MAKELONG(dwVolume, dwVolume));
		break;
	}
	case MCI_DEVTYPE_WAVEFORM_AUDIO: {
		DWORD dwVolume;

		dwVolume = 0x0ffff * percent / 100;
		waveOutSetVolume(0, (DWORD)MAKELONG(dwVolume, dwVolume));
		break;
	}
	default:
		break;
	}
}
#endif /* CONIOEX */

#ifdef __cplusplus
}
#endif

#endif /* __CONIOEX_H */



弾cpp変更

コード:

void tamaupdate(void)
{
	if (inport(PK_N))
	{
		gtama.fPosX = g_player.fPosX;
		gtama.fPosY = g_player.fPosY;
		gtama.flg = 1;
	}

	if (++gtama.fPosX > 79) {
		gtama.flg = 0;
	}

	if (gtama.fPosX == ou.fPosX&&gtama.fPosY == ou.fPosY)
	{
		gtama.fPosX = ou.fPosX - 1;
	}
	

}


void tamadrow(void)
{
	textcolor(RED);

	if (gtama.flg == 1)
	{
		gotoxy((int)gtama.fPosX, (int)gtama.fPosY);
		printf("弾");
	}
	/*if(gtama.flg == 0)
	{
		gotoxy((int)gtama.fPosX, (int)gtama.fPosY);
		printf("  ");
	}*/


	if (gtama.fPosX == ou.fPosX&&gtama.fPosY == ou.fPosY)
	{
		ou.fPosX +=2;
		gotoxy((int)ou.fPosX, (int)ou.fPosY);
		printf("王");
	}
	else
	{
		gotoxy((int)ou.fPosX, (int)ou.fPosY);
		printf("王");
	}
}
player.cpp変更後

コード:

//=============================================================================
//
// プレイヤー処理 [player.cpp]
//
//=============================================================================
#define CONIOEX
#include "conioex.h"
#include "main.h"
#include "player.h"

//*****************************************************************************
// マクロ定義
//*****************************************************************************
#define	VALUE_MOVE_X			(0.75f)// 地上での移動量X方向
#define	VALUE_MOVE_Y			(0.30f)
#define	VALUE_MOVE_X_AIR		(0.30f)		// 空中での移動量X方向
#define	VALUE_RESIST_X			(0.50f)		// 地上での移動摩擦抵抗
#define	LIMIT_LEFT				(2.0f)		// 移動範囲左端
#define	LIMIT_RIGHT				(159.0f)		// 移動範囲右端
#define	LIMIT_DOWN				(24.0f)		// 移動範囲下端
#define LIMIT_APP               (2.0f)

// ここから追加 ジャンプ追加処理
#define	VALUE_JUMP				(0.80f)		// ジャンプ量

// ジャンプ処理を追加後
#define	VALUE_RESIST_X_AIR		(0.35f)		// 空中での移動摩擦抵抗
#define	VALUE_GRAVITY			(0.06f)		// 重力量

//*****************************************************************************
// プロトタイプ宣言
//*****************************************************************************


//*****************************************************************************
// グローバル変数
//*****************************************************************************
PLAYER g_player;			// プレイヤーワー
SHOT gtama;
komaou ou;
//=============================================================================
// プレイヤーの初期化処理
//=============================================================================
void InitPlayer(void)
{
	// プレイヤーワークのクリア
	g_player.fPosX = 1.0f;
	g_player.fPosY = 12.0f;
	g_player.fPosXOld =1.0f;
	g_player.fPosYOld = 12.0f;
	g_player.fMoveX = 0.0f;
	g_player.fMoveY = 0.0f;

	
	//gtama.fPosX = 20.0f;
	//gtama.fPosY = 23.0f;

	// ジャンプ追加処理
	g_player.bJump = false;
	g_player.bMove = false;
}

//=============================================================================
// プレイヤーの終了処理
//=============================================================================
void UninitPlayer(void)
{
}

//=============================================================================
// プレイヤーの更新処理
//=============================================================================
void UpdatePlayer(void)
{


	// 前回の位置を保存
	g_player.fPosXOld = g_player.fPosX;
	g_player.fPosYOld = g_player.fPosY;

	if (inport(PK_A))
	{// 左移動

		// ジャンプ追加処理
		/*if (g_player.bJump)
		{
			g_player.fMoveY -= VALUE_MOVE_Y_AIR;
		}*/
		g_player.fPosY -= 1;
			g_player.fMoveY -= 1;
		g_player.bMove = true;
	}

	if (inport(PK_D))
	{// ↓移動

		// ジャンプ追加処理
		/*if (g_player.bJump)
		{
			// 左移動追加後に考えさせる
			g_player.fMoveX += VALUE_MOVE_X_AIR;
		}
		else
		{
			g_player.fMoveX += VALUE_MOVE_X;
		}*/
		g_player.fPosY += 1;
		g_player.fMoveY -= VALUE_MOVE_Y;
		g_player.bMove = true;

	}

	// 位置更新
	//g_player.fPosY += g_player.fMoveY;
	if (g_player.fPosY > LIMIT_DOWN)
	{
		g_player.fPosY = LIMIT_DOWN;
	}
	if (g_player.fPosY <LIMIT_APP)
	{
		g_player.fPosY= LIMIT_APP;
	}

}

//=============================================================================
// プレイヤーの描画処理
//=============================================================================
void DrawPlayer(void)
{
	// 色設定
	textcolor(BLUE);

	if (g_player.bMove)
	{// 移動した場合
	 // 前回の位置でのプレイヤーを消去
		gotoxy((int)(g_player.fPosXOld), (int)(g_player.fPosYOld));
		printf(" ");
		gotoxy((int)(g_player.fPosXOld-2), (int)(g_player.fPosYOld));
		printf(" ");
		gotoxy((int)(g_player.fPosXOld+2), (int)(g_player.fPosYOld));
		printf(" ");
		gotoxy((int)(g_player.fPosXOld - 4), (int)(g_player.fPosYOld));
		printf(" ");
		gotoxy((int)(g_player.fPosXOld + 4), (int)(g_player.fPosYOld));
		printf(" ");
		gotoxy((int)(g_player.fPosXOld), (int)(g_player.fPosYOld - 1.0f));
		printf(" ");

		g_player.bMove = false;
	}

	// 現在の位置にプレイヤーを表示

	gotoxy((int)(g_player.fPosX), (int)(g_player.fPosY));
	printf("■");
	gotoxy((int)(g_player.fPosX), (int)(g_player.fPosY - 1.0f));
	printf("●");
	}
player.h変更後

コード:

プレイヤー処理 [player.h]
//
//=============================================================================

#ifndef _PLAYER_H_	// 2重インクルード防止のマクロ定義
#define _PLAYER_H_

//*************************************
// プレイヤー構造体
//*************************************
typedef struct
{
	double fPosX;		// 現在の位置X
	double fPosY;		// 現在の位置Y
	double fPosXOld;		// 前回の位置X
	double fPosYOld;		// 前回の位置Y
	double fMoveX;		// 移動量X方向
	double fMoveY;		// 移動量Y方向
	bool bMove;			// 移動したかどうか(描画更新用)
	bool bJump;			// ジャンプしたかどうか(描画更新用)
} PLAYER;

typedef struct
{
	double fPosX=50;		// 現在の位置X
	double fPosY=15;		// 現在の位置Y
	double fPosXOld;		// 前回の位置X
	double fPosYOld;		// 前回の位置Y
	double fMoveX;		// 移動量X方向
	double fMoveY;		// 移動量Y方向
	bool bMove;			// 移動したかどうか(描画更新用)
	bool bJump;			// ジャンプしたかどうか(描画更新用)
} komaou;


typedef struct {
	double fPosX; //現在位置の座標(X座標)
	double fPosY;//現在位置の座標(Y座標)
	double tax;//ターゲットまでの距離
	double spd;//スピード
	int pattern;
	bool flg;
	int time=60;
}SHOT;


//*****************************************************************************
// プロトタイプ宣言
//*****************************************************************************
void InitPlayer(void);
void UninitPlayer(void);
void UpdatePlayer(void);
void DrawPlayer(void);

//*****************************************************************************
// グローバル変数
//*****************************************************************************
extern PLAYER g_player;			// プレイヤーワー
extern SHOT gtama;
extern komaou ou;

#endif

Re: シューティングゲームの作り方改

#15

by こたん » 6年前

なるほど
勉強になります!
ありがとうございました

Re: シューティングゲームの作り方改

#14

by 参照魚 » 6年前

fPosYの値を-1しています。+1する++と同類の演算子です。この++や--は変数の後につけるやり方(i++)と前につけるやり方(--i)があります。

Re: シューティングゲームの作り方改

#13

by こたん » 6年前

すいません
もうひとついいでしょうか?
このgtma.fPosY<1の前にある--とはどういうことなのでしょうか?
--これをとったら表示位置が変わっていたので。

Re: シューティングゲームの作り方改

#12

by こたん » 6年前

おおおおおおおおお!
でましたー!!!

わざわざありがとうございました

Re: シューティングゲームの作り方改

#11

by 参照魚 » 6年前

11行目間違いです。すいません。

コード:

if ( gtama.flg == 1 && --gtama.fPosY < 1 ) {
}

Re: シューティングゲームの作り方改

#10

by 参照魚 » 6年前

アップデートと表示を分離してみました。弾が1発だけならtimeの条件は不要で、とりあえずY座標の条件だけでよいと思います。当たり判定で消える条件もあるかと思いますが、それはこれが解決してから考えればよいと思います。

せっかくtamadraw()があるならprintfはそちらで実行したほうがよいです。

コード:

void tamaupdate(void)
{
	if ( inport(PK_N) )
    {
		gtama.fPosX = g_player.fPosX;
		gtama.fPosY = g_player.fPosY;
		gtama.flg = 1;
    }

	if ( --gtama.fPosY < 1 ) {
        gtama.flg = 0;
    }
}

void tamadrow(void)
{
    if (gtama.flg == 1){
        gotoxy(gtama.fPosX, gtama.fPosY );
        printf("|");
	}
}

Re: シューティングゲームの作り方改

#9

by こたん » 6年前

丁寧にありがとうございます

直してみたのですがいぜん弾が発射されません。

一応
頭の中では
インベーダーゲームのようなに発射する弾をつくりたいと思っております。

コード:

if (inport(PK_W)&& gtama.time < 60)
	{
		//	if(gtama.flg == 0)
			//{
				gtama.flg = 1;
				gtama.fPosX=g_player.fPosX;
				gtama.fPosY=g_player.fPosY;
		//	}
	}

Re: シューティングゲームの作り方改

#8

by 参照魚 » 6年前

弾が表示されないのは下記の部分が間違っているためです。弾にプレイヤーの位置を教えないと正しい位置に表示されないです。

コード:

g_player.fPosX = gtama.fPosX;
g_player.fPosY = gtama.fPosY;
↓
gtama.fPosX = g_player.fPosX;
gtama.fPosY = g_player.fPosY;
gtamaはグローバル変数で1個だけ定義されているのですが、画面上に同時に表示される弾は1個だけという事であっていますでしょうか?ただ、gtama.timeはおそらく連射のインターバル調整のためだと思われますが、それだと変数を用意するところで間違ってしまっています。その場合は同時に発射可能な弾数分の変数が必要です。

コード:

#define SHOT_MAX 4 // 同時に4発まで発射可能
SHOT gtama[SHOT_MAX];

Re: シューティングゲームの作り方改

#7

by こたん » 6年前

tama.cpp中をいじってみましたが玉すらでないです

コード:

void tamaupdate(void)
{
	gtama.fPosX = g_player.fPosX;
	gtama.time ++;

	if (inport(PK_N)&& gtama.time < 60)
	{
		//	if(gtama.flg == 0)
			//{
				gtama.flg = 1;
				g_player.fPosX = gtama.fPosX;
				g_player.fPosY = gtama.fPosY;
		//	}
	}

	if (gtama.flg == 1)
	{
		gotoxy(gtama.fPosX, gtama.fPosY - 1);
		printf("|");
		gtama.time = 0;
	}
	if (gtama.fPosY < 1)
	{
		gtama.flg = 0;
	}
}


Re: シューティングゲームの作り方改

#6

by こたん » 6年前

返信ありがとうございます
printfでは弾を表示しております。

printfで偽になってしまっているのでしょうか?

無知で申し訳ないのですが
なぜそのようになっているのか教えていただけないでしょうか?
またなにが足りないのでしょうか?

Re: シューティングゲームの作り方改

#5

by 参照魚 » 6年前

コンソールにprintfで表示を行っているものかと思います。このコンソールへの表示の仕様がどういうものかわからないのですが、仮にFPS60毎に表示がクリアされるのだとすると、gtama.flagが1の時に一瞬だけ”|”が表示されて以降は表示されないと思います。

Re: シューティングゲームの作り方改

#4

by こたん » 6年前

返信ありがとうございますm(__)m
偽ということは
なにかつけたしたほうがいいということでしょうか?

プレイヤー座標に弾座標を入れているのは
プレイヤーと弾の位置を同じにするためです
そうしないとプレイヤーの上から弾がでないと思うので。

Re: シューティングゲームの作り方改

#3

by みけCAT » 6年前

gtama.time < 60という条件が偽であるために、弾が出ないことが考えられます。
また、なぜかプレイヤーの座標に弾の座標を代入しているのも不自然ですね。
よもやま さんが書きました:visual stuzio2015 弾の移動と表示の仕方
と関連している話題ですよね。
でしたら複数のトピックを乱立するのではなく
visual stuzio2015 弾の移動と表示の仕方
に記載してください。
その通りです。
同じ問題に関する質問は、1個のトピックでお願いします。
解決した後はお礼も忘れずに。

Re: シューティングゲームの作り方改

#2

by よもやま » 6年前

visual stuzio2015 弾の移動と表示の仕方
と関連している話題ですよね。
でしたら複数のトピックを乱立するのではなく
visual stuzio2015 弾の移動と表示の仕方
に記載してください。

シューティングゲームの作り方改

#1

by こたん » 6年前

くばられたものなので、むだなところもあります
main cpp

コード:

#include "main.h"
#include "player.h"
#include "./tama.h"

void Init(void);
void Uninit(void);
void Update(void);
void Draw(void);
void DispFPS(void);

#define DEBUG
int g_nCountFPS;				// FPSカウンタ

void main(void)
{
	// FPS計測するための変数
	DWORD dwExecLastTime;
	DWORD dwFPSLastTime;
	DWORD dwCurrentTime;
	int nCountFrame;

	// FPS計測の為の初期設定
	// 分解能を設定(何もしないとタイマの精度が悪くなるので設定)
	timeBeginPeriod(1);

	dwExecLastTime =
		dwFPSLastTime = timeGetTime();
	dwCurrentTime =
		nCountFrame = 0;

	Init();

	//printf("aaaaaaaaaaa");
	//getchar();
	//clrscr();

	do
	{
		dwCurrentTime = timeGetTime();
		if ((dwCurrentTime - dwFPSLastTime) >= 500)	// 0.5秒ごとに実行(毎回実行するとチカチカするので)
		{
			g_nCountFPS = nCountFrame * 1000 / (dwCurrentTime - dwFPSLastTime);
			dwFPSLastTime = dwCurrentTime;
			nCountFrame = 0;
		}

		if ((dwCurrentTime - dwExecLastTime) >= (1000 / 60))// FPSを60にするために設定
		{
			dwExecLastTime = dwCurrentTime;

			Update();

			Draw();

#ifdef DEBUG
			// FPS表示
			DispFPS();
#endif

			nCountFrame++;
		}
	} while (!inport(PK_ESC));

	//終了処理
	Uninit();

	// 分解能を戻す
	timeEndPeriod(1);
}
//=============================================================================
// 初期化処理
//=============================================================================
void Init(void)
{
	// プレイヤーの初期化処理
	InitPlayer();

}

//=============================================================================
// 終了処理
//=============================================================================
void Uninit(void)
{
	// プレイヤーの終了処理
	UninitPlayer();
}

//=============================================================================
// 更新処理
//=============================================================================
void Update(void)
{
	// プレイヤーの更新処理
	UpdatePlayer();

	//弾
	tamaupdate();
}

//=============================================================================
// 描画処理
//=============================================================================
void Draw(void)
{
	// プレイヤーの描画処理
	DrawPlayer();
	//弾
	tamadrow();
}

#ifdef DEBUG
//=============================================================================
// FPS表示
//=============================================================================
void DispFPS(void)
{
	// 色設定
	textcolor(WHITE);

	gotoxy(1, 1);
	printf("FPS:%d", g_nCountFPS);
}
#endif

player.cpp

コード:

//=============================================================================
//
// プレイヤー処理 [player.cpp]
//
//=============================================================================
#define CONIOEX
#include "conioex.h"
#include "main.h"
#include "player.h"

//*****************************************************************************
// マクロ定義
//*****************************************************************************
#define	VALUE_MOVE_X			(0.75f)		// 地上での移動量X方向
#define	VALUE_MOVE_X_AIR		(0.30f)		// 空中での移動量X方向
#define	VALUE_RESIST_X			(0.50f)		// 地上での移動摩擦抵抗
#define	LIMIT_LEFT				(2.0f)		// 移動範囲左端
#define	LIMIT_RIGHT				(118.0f)		// 移動範囲右端
#define	LIMIT_DOWN				(24.0f)		// 移動範囲下端
#define LIMIT_APP               (1.0f)

// ここから追加 ジャンプ追加処理
#define	VALUE_JUMP				(0.80f)		// ジャンプ量

// ジャンプ処理を追加後
#define	VALUE_RESIST_X_AIR		(0.35f)		// 空中での移動摩擦抵抗
#define	VALUE_GRAVITY			(0.06f)		// 重力量

//*****************************************************************************
// プロトタイプ宣言
//*****************************************************************************


//*****************************************************************************
// グローバル変数
//*****************************************************************************
PLAYER g_player;			// プレイヤーワー
SHOT gtama;
//=============================================================================
// プレイヤーの初期化処理
//=============================================================================
void InitPlayer(void)
{
	// プレイヤーワークのクリア
	g_player.fPosX = 20.0f;
	g_player.fPosY = 24.0f;
	g_player.fPosXOld = 20.0f;
	g_player.fPosYOld = 24.0f;
	g_player.fMoveX = 0.0f;
	g_player.fMoveY = 0.0f;

	gtama.fPosX = 20.0f;
	gtama.fPosY = 23.0f;

	// ジャンプ追加処理
	g_player.bJump = false;
	g_player.bMove = false;
}

//=============================================================================
// プレイヤーの終了処理
//=============================================================================
void UninitPlayer(void)
{
}

//=============================================================================
// プレイヤーの更新処理
//=============================================================================
void UpdatePlayer(void)
{
	// 前回の位置を保存
	g_player.fPosXOld = g_player.fPosX;
	g_player.fPosYOld = g_player.fPosY;

	if (inport(PK_A))
	{// 左移動

		// ジャンプ追加処理
		if (g_player.bJump)
		{
			g_player.fMoveX -= VALUE_MOVE_X_AIR;
		}
		else
		{
			g_player.fMoveX -= VALUE_MOVE_X;
		}
		g_player.bMove = true;
	}

	if (inport(PK_D))
	{// 右移動

		// ジャンプ追加処理
		if (g_player.bJump)
		{
			// 左移動追加後に考えさせる
			g_player.fMoveX += VALUE_MOVE_X_AIR;
		}
		else
		{
			g_player.fMoveX += VALUE_MOVE_X;
		}
		g_player.bMove = true;

	}

	if (inport(PK_P))
	{
		g_player.fMoveY = -VALUE_JUMP;
		g_player.fMoveY = -VALUE_JUMP;
		g_player.bJump = true;
	}


	// ジャンプ追加処理
	if (inport(PK_SP))
	{// ジャンプ
		if (!g_player.bJump)
		{
			g_player.fMoveY = -VALUE_JUMP;
			g_player.bJump = true;
		}
	}

	// ジャンプ追加処理
	if (g_player.bJump)
	{// ジャンプ中
		g_player.bMove = true;

		//ジャンプ処理を入れてから説明
		g_player.fMoveX += (0.0f - g_player.fMoveX) * VALUE_RESIST_X_AIR;		// 抵抗を加える
	}
	else
	{
		g_player.fMoveX += (0.0f - g_player.fMoveX) * VALUE_RESIST_X;			// 抵抗を加える
	}

	// 位置更新
	g_player.fPosX += g_player.fMoveX;
	if (g_player.fPosX < LIMIT_LEFT)
	{
		g_player.fPosX = LIMIT_LEFT;
	}
	if (g_player.fPosX > LIMIT_RIGHT)
	{
		g_player.fPosX = LIMIT_RIGHT;
	}

	// ジャンプ追加処理

	// ジャンプ処理を追加してから
	g_player.fMoveY += VALUE_GRAVITY;			// 重力を加える

	// 先にこちらの処理を入れる
	g_player.fPosY += g_player.fMoveY;

	// グラビティの処理後
	if (g_player.fPosY > LIMIT_DOWN)
	{// 地面にめり込んだ場合
		g_player.fPosY = LIMIT_DOWN;
		g_player.fMoveY = 0.0f;
		g_player.bJump = false;
	}
}

//=============================================================================
// プレイヤーの描画処理
//=============================================================================
void DrawPlayer(void)
{
	// 色設定
	//textcolor(RED);

	if (g_player.bMove)
	{// 移動した場合
	 // 前回の位置でのプレイヤーを消去
		gotoxy((int)(g_player.fPosXOld), (int)(g_player.fPosYOld));
		printf(" ");
		gotoxy((int)(g_player.fPosXOld), (int)(g_player.fPosYOld - 1.0f));
		printf(" ");

		g_player.bMove = false;
	}

	// 現在の位置にプレイヤーを表示
	gotoxy((int)(g_player.fPosX), (int)(g_player.fPosY));
	printf("■");
	gotoxy((int)(g_player.fPosX), (int)(g_player.fPosY - 1.0f));
	printf("●");

	//足場で

	for (int i = 1; i < 118; i++)
	{
		textcolor(RED);
		gotoxy(i, 25);
		printf("-");
	}
}

tama.cpp

コード:

#include "tama.h"
#include "player.h"
#define CONIOEX
#include "./conioex.h"

//static bool tama_flg = false;
int intime, stoptime, outtime, shottime;
bool sflag;
int scount;

void tamaupdate(void)
{
	gtama.fPosX = g_player.fPosX;
	gtama.time += 1;

	if (inport(PK_W))
	{
		if (gtama.flg == 0)
		{
			if (gtama.time < 60)
			{
				gtama.flg = 1;
				g_player.fPosX = gtama.fPosX;
				g_player.fPosY = gtama.fPosY;
			}
		}
	}

	if (gtama.flg == 1)
	{
		gotoxy(gtama.fPosX, gtama.fPosY - 1);
		printf("|");
		gtama.flg = 0;
	}
}


void tamadrow(void)
{
}
player.h

コード:

//=============================================================================
//
// プレイヤー処理 [player.h]
//
//=============================================================================

#ifndef _PLAYER_H_	// 2重インクルード防止のマクロ定義
#define _PLAYER_H_

//*************************************
// プレイヤー構造体
//*************************************
typedef struct
{
	double fPosX;		// 現在の位置X
	double fPosY;		// 現在の位置Y
	double fPosXOld;		// 前回の位置X
	double fPosYOld;		// 前回の位置Y
	double fMoveX;		// 移動量X方向
	double fMoveY;		// 移動量Y方向
	bool bMove;			// 移動したかどうか(描画更新用)
	bool bJump;			// ジャンプしたかどうか(描画更新用)
} PLAYER;


typedef struct {
	double fPosX; //現在位置の座標(X座標)
	double fPosY;//現在位置の座標(Y座標)
	double tax;//ターゲットまでの距離
	double spd;//スピード
	int pattern;
	bool flg;
	int time=60;
}SHOT;



/*struct target_Val {
	bool flg; //フラグ
	double fPosX, fPosY;		  //ポジション

}; struct target_Val ene;*/


//*****************************************************************************
// プロトタイプ宣言
//*****************************************************************************
void InitPlayer(void);
void UninitPlayer(void);
void UpdatePlayer(void);
void DrawPlayer(void);

//*****************************************************************************
// グローバル変数
//*****************************************************************************
extern PLAYER g_player;			// プレイヤーワー
extern SHOT gtama;

#endif
tama.h

コード:

#pragma once
void tamaupdate(void);
void tamadrow(void);

#define ENEMY_SNUM_50

配布コード
conioex.h

コード:

 */
#ifndef __CONIOEX_H
#define __CONIOEX_H

#ifdef __cplusplus
extern "C" {
#endif

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#include <process.h>
#include <windows.h>
#include <tchar.h>
#include <mmsystem.h>
#include <digitalv.h>
#pragma comment(lib, "winmm.lib")

#ifdef CONIOEX
#define CONIOEX_INST extern 
#else /* !CONIOEX */
#define CONIOEX_INST 
#endif /* CONIOEX */

#ifdef __BORLANDC__
#define NOCURSOR		_NOCURSOR
#define SOLIDCURSOR		_SOLIDCURSOR
#define NORMALCURSOR	_NORMALCURSOR
__inline void setcursortype(int cur_t) {_setcursortype(cur_t);}
__inline int _kbhit(void) {return kbhit();}
#else /* !__BORLANDC__ */

#pragma warning(disable:4996)

#define NOCURSOR		0
#define SOLIDCURSOR		1
#define NORMALCURSOR	2

#define _NOCURSOR		NOCURSOR
#define _SOLIDCURSOR	SOLIDCURSOR
#define _NORMALCURSOR	NORMALCURSOR

#ifndef __COLORS
#define __COLORS
enum COLORS {
	BLACK,			/* 黒		*/
	BLUE,			/* 濃い青	*/
	GREEN,			/* 緑		*/
	CYAN,			/* 青緑		*/
	RED,			/* 濃い赤	*/
	MAGENTA,		/* 紫		*/
	BROWN,			/* 濃い黄	*/
	LIGHTGRAY,		/* 25%灰色	*/
	DARKGRAY,		/* 50%灰色	*/
	LIGHTBLUE,		/* 青		*/
	LIGHTGREEN,		/* 明るい緑	*/
	LIGHTCYAN,		/* 水色		*/
	LIGHTRED,		/* 赤		*/
	LIGHTMAGENTA,	/* ピンク	*/
	YELLOW,			/* 黄		*/
	WHITE			/* 白		*/
};
#endif /* _COLORS */

CONIOEX_INST WORD	__conioex_h_wAttribute		/* 境界色 */
#ifndef CONIOEX
= LIGHTGRAY
#endif /* CONIOEX */
;



/**
 * @brief	水平方向のカーソル位置を取得
 *
 * @return	現在のカーソル位置のX座標(1~)
 */
int wherex(void)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
	CONSOLE_SCREEN_BUFFER_INFO	csbi;

	GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
	return csbi.dwCursorPosition.X - csbi.srWindow.Left + 1;
}
#endif /* CONIOEX */

/**
 * @brief	垂直方向のカーソル位置を取得
 *
 * @return	現在のカーソル位置のY座標(1~)
 */
int wherey(void)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
	CONSOLE_SCREEN_BUFFER_INFO	csbi;

	GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
	return csbi.dwCursorPosition.Y - csbi.srWindow.Top + 1;
}
#endif /* CONIOEX */

/**
 * @brief	カーソル位置の移動
 *
 * @param	x [入力] X座標(1~)
 * @param	y [入力] Y座標(1~)
 */
void gotoxy(int x, int y)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
	COORD c;
	CONSOLE_SCREEN_BUFFER_INFO csbi;
	HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);

	c.X = x - 1;
	c.Y = y - 1;
	if (GetConsoleScreenBufferInfo(h, &csbi))
		c.Y += csbi.srWindow.Top;
	SetConsoleCursorPosition(h, c);
}
#endif /* CONIOEX */

/**
 * @brief	行末まで消去
 */
void clreol(void)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
	CONSOLE_SCREEN_BUFFER_INFO	csbi;
	COORD	c;
	HANDLE	h = GetStdHandle(STD_OUTPUT_HANDLE);

	if (GetConsoleScreenBufferInfo(h, &csbi)) {
		DWORD num;

		c = csbi.dwCursorPosition;
		FillConsoleOutputAttribute(h, csbi.wAttributes,
			csbi.srWindow.Right - csbi.dwCursorPosition.X + 1, c, &num);
		FillConsoleOutputCharacter(h, ' ',
			csbi.srWindow.Right - csbi.dwCursorPosition.X + 1, c, &num);
	}
}
#endif /* CONIOEX */

/**
 * @brief	画面消去
 */
void clrscr(void)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
	CONSOLE_SCREEN_BUFFER_INFO csbi;
	DWORD num;
	COORD c = {0, 0};
	HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);

	if (GetConsoleScreenBufferInfo(h, &csbi)) {
		__conioex_h_wAttribute = csbi.wAttributes;
		FillConsoleOutputAttribute(h, csbi.wAttributes, csbi.dwSize.X * csbi.dwSize.Y, c, &num);
		FillConsoleOutputCharacter(h, TEXT(' '), csbi.dwSize.X * csbi.dwSize.Y, c, &num);
		gotoxy(csbi.srWindow.Left + 1, csbi.srWindow.Top + 1);
	}
}
#endif /* CONIOEX */

/**
 * @brief	文字色高輝度化
 */
void highvideo(void)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
	CONSOLE_SCREEN_BUFFER_INFO csbi;
	HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);

	if (GetConsoleScreenBufferInfo(h, &csbi))
		SetConsoleTextAttribute(h, csbi.wAttributes | FOREGROUND_INTENSITY);
}
#endif /* CONIOEX */

/**
 * @brief	文字色低輝度化
 */
void lowvideo(void)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
	CONSOLE_SCREEN_BUFFER_INFO csbi;
	HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);

	if (GetConsoleScreenBufferInfo(h, &csbi))
		SetConsoleTextAttribute(h, csbi.wAttributes & ~FOREGROUND_INTENSITY);
}
#endif /* CONIOEX */

/**
 * @brief	既定文字色設定
 */
void normvideo(void)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), LIGHTGRAY);
}
#endif /* CONIOEX */

void textbackground(int newcolor)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
	CONSOLE_SCREEN_BUFFER_INFO csbi;
	HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
	if (GetConsoleScreenBufferInfo(h, &csbi))
		SetConsoleTextAttribute(h, (csbi.wAttributes & ~0x00f0) | ((newcolor & 0x07) << 4));
}
#endif /* CONIOEX */

void textcolor(int newcolor)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
	CONSOLE_SCREEN_BUFFER_INFO csbi;
	HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
	if (GetConsoleScreenBufferInfo(h, &csbi))
		SetConsoleTextAttribute(h, (csbi.wAttributes & ~0x0f) | (newcolor & 0x0f));
}
#endif /* CONIOEX */

void textattr(int newattr)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), newattr);
}
#endif /* CONIOEX */

void setcursortype(int cur_t)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
	CONSOLE_CURSOR_INFO	cci;
	static	int nSize = -1;

	if (nSize < 0) {
		if (GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci))
			nSize = (int)cci.dwSize;
		else
			nSize = 25;
	}
	cci.dwSize		= (cur_t < NORMALCURSOR) ? 100 : nSize;
	cci.bVisible	= (cur_t != NOCURSOR);
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
}
#endif /* CONIOEX */
__inline void _setcursortype(int cur_t) {setcursortype(cur_t);}

/**
 * @brief	現在行に挿入
 */
void insline(void)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
	CONSOLE_SCREEN_BUFFER_INFO	csbi;
	HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);

	if (GetConsoleScreenBufferInfo(h, &csbi)) {
		COORD	c;
		DWORD	len;
		DWORD	num;
		LPTSTR	psz;
		LPWORD	pw;

		c.X = csbi.srWindow.Left;
		len = csbi.srWindow.Right - csbi.srWindow.Left + 1;
		psz = (LPTSTR)_alloca(len * sizeof(TCHAR));
		pw = (LPWORD)_alloca(len * sizeof(WORD));
		for (c.Y = csbi.srWindow.Bottom; c.Y > csbi.dwCursorPosition.Y; c.Y--) {
			c.Y--;
			ReadConsoleOutputAttribute(h, pw, len, c, &num);
			ReadConsoleOutputCharacter(h, psz, len, c, &num);
			c.Y++;
			WriteConsoleOutputAttribute(h, pw, len, c, &num);
			WriteConsoleOutputCharacter(h, psz, len, c, &num);
		}
		FillConsoleOutputAttribute(h, csbi.wAttributes, len, c, &num);
		FillConsoleOutputCharacter(h, TEXT(' '), len, c, &num);
	}
}
#endif /* CONIOEX */

/**
 * @brief	現在行の削除
 */
void delline(void)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
	CONSOLE_SCREEN_BUFFER_INFO	csbi;
	HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);

	if (GetConsoleScreenBufferInfo(h, &csbi)) {
		DWORD	num;
		COORD	c;
		DWORD	len;
		LPTSTR	psz;
		LPWORD	pw;

		c.X = csbi.srWindow.Left;
		len = csbi.srWindow.Right - csbi.srWindow.Left + 1;
		psz = (LPTSTR)_alloca(len * sizeof(TCHAR));
		pw = (LPWORD)_alloca(len * sizeof(WORD));
		for (c.Y = csbi.dwCursorPosition.Y; c.Y < csbi.srWindow.Bottom; c.Y++) {
			c.Y++;
			ReadConsoleOutputAttribute(h, pw, len, c, &num);
			ReadConsoleOutputCharacter(h, psz, len, c, &num);
			c.Y--;
			WriteConsoleOutputAttribute(h, pw, len, c, &num);
			WriteConsoleOutputCharacter(h, psz, len, c, &num);
		}
		FillConsoleOutputAttribute(h, __conioex_h_wAttribute, len, c, &num);
		FillConsoleOutputCharacter(h, TEXT(' '), len, c, &num);
	}
}
#endif /* CONIOEX */

#endif /* __BORLANDC__ */

__inline void setcaption(char *title) {SetConsoleTitleA(title);}
__inline int getcaption(char *title, int len) {return GetConsoleTitleA(title, len);}
__inline void msleep(unsigned long msecs) {Sleep(msecs);}

#define PK_ENTER				VK_RETURN
#define PK_ESC					VK_ESCAPE
#define PK_F1					VK_F1
#define PK_F2					VK_F2
#define PK_F3					VK_F3
#define PK_F4					VK_F4
#define PK_F5					VK_F5
#define PK_F6					VK_F6
#define PK_F7					VK_F7
#define PK_F8					VK_F8
#define PK_F9					VK_F9
#define PK_F10					VK_F10
#define PK_F11					VK_F11
#define PK_F12					VK_F12
#define PK_SP					VK_SPACE
#define PK_UP					VK_UP
#define PK_DOWN					VK_DOWN
#define PK_RIGHT				VK_RIGHT
#define PK_LEFT					VK_LEFT
#define PK_SHIFT				VK_SHIFT
#define PK_CTRL					VK_CONTROL
#define PK_ALT					VK_MENU
#define PK_BS					VK_BACK
#define PK_PAUSE				VK_PAUSE
#define PK_INS					VK_INSERT
#define PK_DEL					VK_DELETE
#define PK_TAB					VK_TAB
#define PK_NFER					VK_KANA		/* [無変換]	*/
#define PK_XFER					VK_CONVERT	/* [変換]	*/
#define PK_0					0x30
#define PK_1					0x31
#define PK_2					0x32
#define PK_3					0x33
#define PK_4					0x34
#define PK_5					0x35
#define PK_6					0x36
#define PK_7					0x37
#define PK_8					0x38
#define PK_9					0x39
#define PK_NUMPAD0				VK_NUMPAD0	/* テンキーの[0]	*/
#define PK_NUMPAD1				VK_NUMPAD1	/* テンキーの[1]	*/
#define PK_NUMPAD2				VK_NUMPAD2	/* テンキーの[2]	*/
#define PK_NUMPAD3				VK_NUMPAD3	/* テンキーの[3]	*/
#define PK_NUMPAD4				VK_NUMPAD4	/* テンキーの[4]	*/
#define PK_NUMPAD5				VK_NUMPAD5	/* テンキーの[5]	*/
#define PK_NUMPAD6				VK_NUMPAD6	/* テンキーの[6]	*/
#define PK_NUMPAD7				VK_NUMPAD7	/* テンキーの[7]	*/
#define PK_NUMPAD8				VK_NUMPAD8	/* テンキーの[8]	*/
#define PK_NUMPAD9				VK_NUMPAD9	/* テンキーの[9]	*/
#define PK_A					0x41
#define PK_B					0x42
#define PK_C					0x43
#define PK_D					0x44
#define PK_E					0x45
#define PK_F					0x46
#define PK_G					0x47
#define PK_H					0x48
#define PK_I					0x49
#define PK_J					0x4A
#define PK_K					0x4B
#define PK_L					0x4C
#define PK_M					0x4D
#define PK_N					0x4E
#define PK_O					0x4F
#define PK_P					0x50
#define PK_Q					0x51
#define PK_R					0x52
#define PK_S					0x53
#define PK_T					0x54
#define PK_U					0x55
#define PK_V					0x56
#define PK_W					0x57
#define PK_X					0x58
#define PK_Y					0x59
#define PK_Z					0x5A

#define PK_LT					0x0BC		/* [,]	*/
#define PK_GT					0x0BE		/* [.]	*/
#define PK_SLUSH				0x0BF		/* [?]	*/
#define PK_DOT					VK_DECIMAL	/* テンキーの[.]	*/
#define PK_DIV					VK_DIVIDE	/* テンキーの[/]	*/
#define PK_BSLUSH				0x0E2		/* [_]	*/

#define PK_SEMICOLON			0x0BB		/* [;]	*/
#define PK_ADD					VK_ADD		/* テンキーの[+]	*/
#define PK_COLON				0x0BA		/* [:]	*/
#define PK_MUL					VK_MULTIPLY	/* テンキーの[*]	*/
#define PK_RBRACE				0x0DD		/* []]	*/

#define PK_ATMARK				0x0C0		/* [@]	*/
#define PK_LBRACE				0x0DB		/* [[]	*/

#define PK_MINUS				0x0BD		/* [-]	*/
#define PK_SUB					VK_SUBTRACT	/* テンキーの[-]	*/
#define PK_XOR					0x0DE		/* [^]	*/
#define PK_YEN					0x0DC		/* [\]	*/

#define PK_KANJI				0x0F3		/* [半角/全角]	*/
#define PK_CAPS					0x0F0		/* [英数][ひらがな]	*/

#define PM_LEFT					VK_LBUTTON
#define PM_MID					VK_MBUTTON
#define PM_RIGHT				VK_RBUTTON
#define PM_CURX					0x0101
#define PM_CURY					0x0102

#define PJ1_XPOS				0x0200
#define PJ1_YPOS				0x0201
#define PJ1_ZPOS				0x0202
#define PJ1_BTNS				0x0203
#define PJ2_XPOS				0x0210
#define PJ2_YPOS				0x0211
#define PJ2_ZPOS				0x0212
#define PJ2_BTNS				0x0213
#define PJ3_XPOS				0x0220
#define PJ3_YPOS				0x0221
#define PJ3_ZPOS				0x0222
#define PJ3_BTNS				0x0223
#define PJ4_XPOS				0x0230
#define PJ4_YPOS				0x0231
#define PJ4_ZPOS				0x0232
#define PJ4_BTNS				0x0233
#define PJ_XPOS					PJ1_XPOS
#define PJ_YPOS					PJ1_YPOS
#define PJ_ZPOS					PJ1_ZPOS
#define PJ_BTNS					PJ1_BTNS

CONIOEX_INST DWORD	__conioex_h_dwKeyMap[8]
#ifndef CONIOEX
= {0, 0, 0, 0, 0, 0, 0, 0}
#endif /* CONIOEX */
;
CONIOEX_INST COORD	__conioex_h_crdMouse
#ifndef CONIOEX
= {0, 0}
#endif /* CONIOEX */
;

/**
 * @brief	キー情報リセット
 *
 * @return	なし
 */
void reinport(void)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
	int i;
	for(i = 0; i < 8; i++)
	{
		__conioex_h_dwKeyMap[i] = 0;
	}
}
#endif /* CONIOEX */


/**
 * @brief	各種リアルタイム入力
 *
 * @param	port [入力] ポート番号(P*_*)
 * @return	入力値
 */
int inport(int port)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
	DWORD	dwEvent;
	HANDLE	h;

	/* ゲームパッド入力 */
	if ((port & 0xfe00) == 0x0200) {
		int		id = (port & 0x01f0) >> 4;
		int		func = port & 0x0f;
		JOYINFO	ji;

		switch (func) {
		case 0:	case 1:	case 2:	case 3:
			if (joyGetPos(id, &ji) != JOYERR_NOERROR)
				return -1;
			switch (func) {
			case 0:
				return ji.wXpos;
			case 1:
				return ji.wYpos;
			case 2:
				return ji.wZpos;
			case 3:
				return ji.wButtons;
			}
			break;
		default:
			break;
		}
		return 0;
	}
	// キー/マウス イベント チェック
	dwEvent = 0;
	h = GetStdHandle(STD_INPUT_HANDLE);
	if (GetNumberOfConsoleInputEvents(h, &dwEvent) && dwEvent) {
		DWORD			dwRead = 0;
		PINPUT_RECORD	pInpRec = (PINPUT_RECORD)_alloca(dwEvent * sizeof(INPUT_RECORD));

		if (ReadConsoleInput(h, pInpRec, dwEvent, &dwRead) && dwRead) {
			PINPUT_RECORD	pir = pInpRec;
			DWORD			dw;
			for (dw = 0; dw < dwRead; dw++, pir++) {
				switch (pir->EventType) {
				case KEY_EVENT: {
					KEY_EVENT_RECORD*	pker = &pir->Event.KeyEvent;
					if (pker->wVirtualKeyCode > 0x0FF)
						break;
					if (pker->bKeyDown)
						__conioex_h_dwKeyMap[pker->wVirtualKeyCode >> 5] |= (0x01 << (pker->wVirtualKeyCode & 31));
					else
						__conioex_h_dwKeyMap[pker->wVirtualKeyCode >> 5] &= ~(0x01 << (pker->wVirtualKeyCode & 31));
					if (pker->dwControlKeyState & (LEFT_ALT_PRESSED | RIGHT_ALT_PRESSED))
						__conioex_h_dwKeyMap[VK_MENU >> 5] |= (0x01 << (VK_MENU & 31));
					else
						__conioex_h_dwKeyMap[VK_MENU >> 5] &= ~(0x01 << (VK_MENU & 31));
					if (pker->dwControlKeyState & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED))
						__conioex_h_dwKeyMap[VK_CONTROL >> 5] |= (0x01 << (VK_CONTROL & 31));
					else
						__conioex_h_dwKeyMap[VK_CONTROL >> 5] &= ~(0x01 << (VK_CONTROL & 31));
					if (pker->dwControlKeyState & SHIFT_PRESSED)
						__conioex_h_dwKeyMap[VK_SHIFT >> 5] |= (0x01 << (VK_SHIFT & 31));
					else
						__conioex_h_dwKeyMap[VK_SHIFT >> 5] &= ~(0x01 << (VK_SHIFT & 31));
					break;
				}
				case MOUSE_EVENT: {
					MOUSE_EVENT_RECORD	*pmer = &pir->Event.MouseEvent;
					__conioex_h_crdMouse = pmer->dwMousePosition;
					if (pmer->dwButtonState & FROM_LEFT_1ST_BUTTON_PRESSED)
						__conioex_h_dwKeyMap[VK_LBUTTON >> 5] |= (0x01 << (VK_LBUTTON & 31));
					else
						__conioex_h_dwKeyMap[VK_LBUTTON >> 5] &= ~(0x01 << (VK_LBUTTON & 31));
					if (pmer->dwButtonState & FROM_LEFT_2ND_BUTTON_PRESSED)
						__conioex_h_dwKeyMap[VK_MBUTTON >> 5] |= (0x01 << (VK_MBUTTON & 31));
					else
						__conioex_h_dwKeyMap[VK_MBUTTON >> 5] &= ~(0x01 << (VK_MBUTTON & 31));
					if (pmer->dwButtonState & RIGHTMOST_BUTTON_PRESSED)
						__conioex_h_dwKeyMap[VK_RBUTTON >> 5] |= (0x01 << (VK_RBUTTON & 31));
					else
						__conioex_h_dwKeyMap[VK_RBUTTON >> 5] &= ~(0x01 << (VK_RBUTTON & 31));
					break;
				}
				default:
					break;
				}
			}
		}
	}

	// マウス座標を返す
	switch (port) {
	case PM_CURX:
		return __conioex_h_crdMouse.X + 1;
	case PM_CURY:
		return __conioex_h_crdMouse.Y + 1;
	default:
		break;
	}
	// キー状態を返す
	return (__conioex_h_dwKeyMap[(port & 0x0FF) >> 5] & (0x01 << (port & 31))) != 0;
}
#endif /* CONIOEX */

typedef struct {
	int				nDevType;
	MCIDEVICEID		wDeviceID;
	char			szPath[MAX_PATH];
	int				nRepeat;
} __conioex_h_SoundInfo;

/**
 * @brief	サウンド ファイルを開く
 *
 * @param	path [入力] ファイル名
 * @retval	非0	サウンド ハンドル
 * @retval	0	エラー
 */
int opensound(char *path)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
	const char	szMidiExt[] = ".mid|.midi|.rmi";
	const char	szWaveExt[] = ".wav|.wave";
	const char	szMP3Ext[] = ".mp3";
	char		szExt[_MAX_EXT];
	union {
		MCI_WAVE_OPEN_PARMSA	wop;
		MCI_OPEN_PARMSA			op;
	} m;
	DWORD		dwCmd;
	__conioex_h_SoundInfo	*psi;

	psi = (__conioex_h_SoundInfo *)malloc(sizeof(__conioex_h_SoundInfo));
	if (psi == NULL)
		return 0;
	ZeroMemory(psi, sizeof(*psi));

	ZeroMemory(&m, sizeof(m));
	_splitpath(path, NULL, NULL, NULL, szExt);
	strlwr(szExt);
	dwCmd = MCI_OPEN_TYPE | MCI_OPEN_ELEMENT;
	if (strstr(szMidiExt, szExt)) {
		psi->nDevType = MCI_DEVTYPE_SEQUENCER;
		lstrcpynA(psi->szPath, path, MAX_PATH);
		m.op.lpstrDeviceType = (LPCSTR)MCI_DEVTYPE_SEQUENCER;
		m.op.lpstrElementName = psi->szPath;
		dwCmd |= MCI_OPEN_TYPE_ID;
	} else if (strstr(szWaveExt, szExt)) {
		psi->nDevType = MCI_DEVTYPE_WAVEFORM_AUDIO;
		lstrcpynA(psi->szPath, path, MAX_PATH);
		m.wop.lpstrDeviceType  = (LPCSTR)MCI_DEVTYPE_WAVEFORM_AUDIO;
		m.wop.lpstrElementName = psi->szPath;
		dwCmd |= MCI_OPEN_TYPE_ID;
//		m.wop.dwBufferSeconds  = 60;
//		dwCmd |= MCI_WAVE_OPEN_BUFFER;
	} else if (strstr(szMP3Ext, szExt)) {
		psi->nDevType = MCI_DEVTYPE_DIGITAL_VIDEO;
		lstrcpynA(psi->szPath, path, MAX_PATH);
		m.op.lpstrDeviceType = "MPEGVideo";
		m.op.lpstrElementName = psi->szPath;
	} else {
		free(psi);
		return 0;
	}
	if (mciSendCommandA(0, MCI_OPEN, dwCmd, (DWORD)&m)) {
		free(psi);
		return 0;
	}
	psi->wDeviceID = m.op.wDeviceID;
	return (int)psi;
}
#endif /* CONIOEX */

/**
 * @brief	サウンド ファイルを閉じる
 *
 * @param	hsound [入力] サウンド ハンドル
 */
void closesound(int hsound)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
	__conioex_h_SoundInfo	*psi;

	if (!hsound)
		return;
	psi = (__conioex_h_SoundInfo *)hsound;
	if (psi->wDeviceID) {
		mciSendCommand(psi->wDeviceID, MCI_CLOSE, 0, 0);
		psi->wDeviceID = 0;
	}
	free(psi);
}
#endif /* CONIOEX */

/**
 * @brief	サウンドを再生する
 *
 * @param	hsound [入力] サウンド ハンドル
 * @param	repeat [入力] ループ有無
 */
void playsound(int hsound, int repeat)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
	__conioex_h_SoundInfo	*psi;
	DWORD					dwCmd;
	MCI_PLAY_PARMS			mpp;

	if (!hsound)
		return;
	psi = (__conioex_h_SoundInfo *)hsound;
	if (!psi->wDeviceID)
		return;
	psi->nRepeat = repeat;
	ZeroMemory(&mpp, sizeof(mpp));
	dwCmd = 0;
	if (repeat) {
		switch (psi->nDevType) {
		case MCI_DEVTYPE_DIGITAL_VIDEO:
			dwCmd |= (MCI_FROM | MCI_DGV_PLAY_REPEAT);
			mpp.dwFrom = 0;
			break;
		case MCI_DEVTYPE_SEQUENCER:
		case MCI_DEVTYPE_WAVEFORM_AUDIO:
			break;
		default:
			break;
		}
	}
	mciSendCommand(psi->wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, 0);
	mciSendCommand(psi->wDeviceID, MCI_PLAY, dwCmd, (DWORD)&mpp);
}
#endif /* CONIOEX */

/**
 * @brief	サウンド再生を停止する
 *
 * @param	hsound [入力] サウンド ハンドル
 */
void stopsound(int hsound)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
	__conioex_h_SoundInfo	*psi;

	if (!hsound)
		return;
	psi = (__conioex_h_SoundInfo *)hsound;
	if (!psi->wDeviceID)
		return;
	psi->nRepeat = 0;
	mciSendCommand(psi->wDeviceID, MCI_STOP, MCI_WAIT, 0);
	mciSendCommand(psi->wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, 0);
}
#endif /* CONIOEX */

/**
 * @brief	サウンド再生状態の取得
 *
 * @param	hsound [入力] サウンド ハンドル
 * @return	再生中ならば 0 以外を返す。
 */
int checksound(int hsound)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
	__conioex_h_SoundInfo	*psi;
	MCI_STATUS_PARMS		msp;

	if (!hsound)
		return 0;
	psi = (__conioex_h_SoundInfo *)hsound;
	if (!psi->wDeviceID)
		return 0;
	ZeroMemory(&msp, sizeof(msp));
	msp.dwItem = MCI_STATUS_MODE;
	if (mciSendCommand(psi->wDeviceID, MCI_STATUS, MCI_STATUS_ITEM, (DWORD)&msp))
		return 0;
	return msp.dwReturn == MCI_MODE_PLAY;
}
#endif /* CONIOEX */

/**
 * @brief	ループ再生の強制更新
 *
 * @param	hsound [入力] サウンド ハンドル
 */
void updatesound(int hsound)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
	__conioex_h_SoundInfo	*psi;
	MCI_STATUS_PARMS		msp;

	if (!hsound)
		return;
	psi = (__conioex_h_SoundInfo *)hsound;
	if (!psi->wDeviceID || !psi->nRepeat)
		return;
	switch (psi->nDevType) {
	case MCI_DEVTYPE_DIGITAL_VIDEO:
		break;
	case MCI_DEVTYPE_SEQUENCER:
	case MCI_DEVTYPE_WAVEFORM_AUDIO:
		ZeroMemory(&msp, sizeof(msp));
		msp.dwItem = MCI_STATUS_MODE;
		if (!mciSendCommand(psi->wDeviceID, MCI_STATUS, MCI_STATUS_ITEM, (DWORD)&msp)) {
			if (msp.dwReturn != MCI_MODE_PLAY) {
				if (psi->nRepeat > 0) {
					psi->nRepeat = -1;
					mciSendCommand(psi->wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, 0);
					mciSendCommand(psi->wDeviceID, MCI_PLAY, 0, 0);
				}
			} else
				psi->nRepeat = 1;
		}
		break;
	default:
		break;
	}
}
#endif /* CONIOEX */

/**
 * @brief	再生音量を設定する
 *
 * @param	hsound [入力] サウンド ハンドル
 * @param	percent [入力] 音量 (0 ~ 100)
 */
void setvolume(int hsound, int percent)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
	__conioex_h_SoundInfo	*psi;

	if (!hsound)
		return;
	psi = (__conioex_h_SoundInfo *)hsound;
	if (!psi->wDeviceID)
		return;
	switch (psi->nDevType) {
	case MCI_DEVTYPE_DIGITAL_VIDEO: {
		MCI_DGV_SETAUDIO_PARMS	mdsp;

		ZeroMemory(&mdsp, sizeof(mdsp));
		mdsp.dwItem = MCI_DGV_SETAUDIO_VOLUME;
		mdsp.dwValue = percent * 10;
		mciSendCommand(psi->wDeviceID, MCI_SETAUDIO,
			MCI_DGV_SETAUDIO_ITEM | MCI_DGV_SETAUDIO_VALUE, (DWORD)&mdsp);
		break;
	}
	case MCI_DEVTYPE_SEQUENCER: {
		DWORD dwVolume;

		dwVolume = 0x0ffff * percent / 100;
		midiOutSetVolume(0, (DWORD)MAKELONG(dwVolume, dwVolume));
		break;
	}
	case MCI_DEVTYPE_WAVEFORM_AUDIO: {
		DWORD dwVolume;

		dwVolume = 0x0ffff * percent / 100;
		waveOutSetVolume(0, (DWORD)MAKELONG(dwVolume, dwVolume));
		break;
	}
	default:
		break;
	}
}
#endif /* CONIOEX */

#ifdef __cplusplus
}
#endif

#endif /* __CONIOEX_H */


ページトップ