村を歩けるようにする

アバター
Tatu
記事: 445
登録日時: 14年前
住所: 北海道

村を歩けるようにする

投稿記事 by Tatu » 14年前

今回は村のマップ内を歩き回れるようにします。
右上に行くとゲームが始まるようになっています。
描画は移動不可能な場所を白い四角で、自キャラの位置を緑の四角で表示します。
ちゃんとした描画にはチップ素材が必要となります。
村.png
村.png (61.31 KiB) 閲覧数: 83 回
今回の内容はゲームプログラミングの館19~24章を参考にして作っています。

mura.cppを追加。

CODE:

#include "../include/GV.h"

int mura_count;//初期化とオープニング、村人の移動などに使用する

//判定用データ 0:通過可能 1:通過不可 2:ノーマルスタート
int mura_map_data[17][20]={
	{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1},
	{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1},
	{1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1},
	{1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1},
	{1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1},
	{1,0,0,0,1,1,1,1,0,0,0,1,0,1,1,0,0,0,0,1},
	{1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1},
	{1,0,0,0,1,0,1,1,0,0,0,0,1,1,1,1,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
	{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
};

//村での自キャラデータ
struct{
	int x,y;
	int muki;
	int shift;
}m_ch;

//初期化
void mura_ini(){
	m_ch.muki=0;
	m_ch.x=32*9;
	m_ch.y=32*8;
}

//自キャラ移動制御
void m_ch_move(){
	if(m_ch.x%32==0 && m_ch.y%32==0){
		if(mura_map_data[m_ch.y/32][m_ch.x/32]==2){
			mura_count=-1;
			practice=0;
			stage=0;
			boss.boss_num=0;
			boss.knd=-1;//enter_bossで1足されるため
			func_state=GAME_INI;
			return;
		}
		if(CheckStatePad(configpad.slow)){
			m_ch.shift=2;
		}
		else m_ch.shift=1;

		if(CheckStatePad(configpad.right)){
			if(mura_map_data[m_ch.y/32][m_ch.x/32+1]!=1){
				m_ch.x+=2*m_ch.shift;
				m_ch.muki=0;
			}
		}
		else if(CheckStatePad(configpad.down)){
			if(mura_map_data[m_ch.y/32+1][m_ch.x/32]!=1){
				m_ch.y+=2*m_ch.shift;
				m_ch.muki=1;
			}
		}
		else if(CheckStatePad(configpad.left)){
			if(mura_map_data[m_ch.y/32][m_ch.x/32-1]!=1){
				m_ch.x-=2*m_ch.shift;
				m_ch.muki=2;
			}
		}
		else if(CheckStatePad(configpad.up)){
			if(mura_map_data[m_ch.y/32-1][m_ch.x/32]!=1){
				m_ch.y-=2*m_ch.shift;
				m_ch.muki=3;
			}
		}
	}
	else{
		switch(m_ch.muki){
		case 0:
			m_ch.x+=2*m_ch.shift;
			break;
		case 1:
			m_ch.y+=2*m_ch.shift;
			break;
		case 2:
			m_ch.x-=2*m_ch.shift;
			break;
		case 3:
			m_ch.y-=2*m_ch.shift;
			break;
		}
	}
}

//村の描画
void mura_graph(){
	int i,j;
	for(i=0;i<17;i++){
		for(j=0;j<20;j++){
			if(mura_map_data[i][j]==1){
				DrawBox(32*j,32*(i-1),32*(j+1),32*i,color[0],TRUE);
			}
		}
	}
	DrawBox(m_ch.x,m_ch.y-32,m_ch.x+32,m_ch.y,color[3],TRUE);
}

void mura_main(){
	if(mura_count==0) mura_ini();
	m_ch_move();
	mura_graph();
	mura_count++;
}
function.hに以下を追加。

CODE:

//mura.cpp
	GLOBAL void mura_main();
main.cppに以下を追加

CODE:

		case GAME_MURA:
			mura_main();
			break;
title.cppのtitle_menu()の以下を変更

CODE:

	if(CheckStatePad(configpad.shot)==1){
		switch(command){
		case 0:
			func_state=GAME_MURA;
			return;

コメントはまだありません。