ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

ジャリの為のプログラム教室コミュの第4回

  • mixiチェック
  • このエントリーをはてなブックマークに追加
#include"my.h"

//プレイヤー
void CPlayer::Move()
{
//プレイヤー描画
DrawRectGraph( g_Player.x, g_Player.y, g_Player.bx, g_Player.by,
g_Player.sx, g_Player.sy,g_Handle.h_Player, TRUE, FALSE );

if(g_Player.y >= 32*11)
{
g_Player.y = 32*11;
}

//左移動
if(CheckHitKey( KEY_INPUT_LEFT ) != 0 || GetJoypadInputState( PAD_INPUT_LEFT ) != 0)
{

//移動力
g_Player.vx = 4;

//当たり判定
// if(g_Player.MapCheckSide() != 1)
// {
// //画面端の判定
// if(g_Map.ScreenTop != 0)
// {
// g_Map.ScreenTop += g_Player.vx;
// }
// }
}

//右移動
if(CheckHitKey( KEY_INPUT_RIGHT ) != 0 || GetJoypadInputState( PAD_INPUT_RIGHT ) != 0)
{
//移動力
g_Player.vx = -8;

if(g_Player.MapCheckSide() != 2)
{
g_Map.ScreenSide += g_Player.vx;
}
}

if(CheckHitKey( KEY_INPUT_LEFT ) != 0 || GetJoypadInputState( PAD_INPUT_RIGHT ) != 0)
{
//移動力
g_Player.vx = 8;

if(g_Player.MapCheckSide() != 2)
{
g_Map.ScreenSide += g_Player.vx;
}
}

if(CheckHitKey( KEY_INPUT_UP ))
{
//移動力
g_Player.vy = 10;
}

//ジャンプ
//中空に居るか?
if(g_Player.JumpStatus == ON)
{
//居るなら減速です
g_Player.vy -= 1;
}

//じゃんぷぼたん(地上にいたら
if(CheckHitKey( KEY_INPUT_Z ) != 0 || GetJoypadInputState( PAD_INPUT_B ) != 0 && g_Player.JumpStatus == OFF)
{
g_Player.vy = 11.0;
g_Player.JumpStatus = ON;
}

//当たってなかったら
// if(g_Player.JumpPower < 0)
// {
if(g_Player.MapCheckTop() != 1)
{
g_Player.y -= g_Player.vy;
}
// }
// else if(g_Player.JumpPower > 0)
// {
// if(g_Player.MapCheckTop() != 1)
// {
// g_Map.ScreenTop += g_Player.JumpPower;
// }
// }

//地面に居たらジャンプステータスはオフ
if(g_Player.MapCheckTop() == 1)
{
g_Player.JumpStatus = OFF;
g_Player.JumpPower = 0;
}
else
{
g_Player.JumpStatus = ON;
}

//初期化
g_Player.vx = 0;
g_Player.vy = 0;
}



#include"my.h"

//=========================================================
// マップ横との判定
//=========================================================
int CPlayer::MapCheckSide()
{

//定義
int mx,my;
int nx = g_Player.x + g_Player.vx + g_Map.ScreenSide; //自キャラの位置
int ny = g_Player.y;// + g_Map.ScreenTop;
int nxw = nx + g_Player.sx;
int nyh = ny + g_Player.sy;

// マップの位置
mx = nx / CHIP_WIDTH ;
my = ny / CHIP_HEIGHT ;

// ゲーム座標範囲外かどうかをチェックする。
if( nx < 0 || nxw > MAP_WIDTH * CHIP_WIDTH )
{
return 0 ;
}

//左側判定
if( g_Map.Map[ ny / CHIP_HEIGHT ] [ nx / CHIP_WIDTH ] != 'z' || // プレイヤーの座標の左上
g_Map.Map[ ny / CHIP_HEIGHT ] [ nxw/ CHIP_WIDTH ] != 'z' || // プレイヤーの座標の右上
g_Map.Map[ nyh / CHIP_HEIGHT ] [ nx / CHIP_WIDTH ] != 'z' || // 右の下
g_Map.Map[ nyh / CHIP_HEIGHT ] [ nxw/ CHIP_WIDTH ] != 'z') // 左の下
{
return 1 ;
}

//// プレイヤーの右側が壁に当たっているかどうかを調べる
//if( g_Map.Map[ ny / CHIP_HEIGHT ] [ nxw / CHIP_WIDTH ] != 'z' || // プレイヤーの座標の右上
// g_Map.Map[ nyh / CHIP_HEIGHT ] [ nxw / CHIP_WIDTH ] != 'z' ) // 右の下
//{
// return 1 ;
//}

// マップ範囲外かどうかをチェックする。
if( mx < 0 || mx >= MAP_WIDTH )
{
return 0 ;
}

// 正常に動きますよ〜
return 3 ;
}

//=========================================================
// マップ縦との判定
//=========================================================
int CPlayer::MapCheckTop(void)
{
//定義
int mx,my;
int nx = g_Player.x + g_Map.ScreenSide; //自キャラの位置
int ny = g_Player.y + g_Player.vy + g_Map.ScreenTop;
int nxw = nx + g_Player.sx;
int nyh = ny + g_Player.sy;

// マップの位置
mx = nx / CHIP_WIDTH ;
my = ny / CHIP_HEIGHT ;

// ゲーム座標範囲外かどうかをチェックする。
if( ny < 0 || nyh > MAP_HEIGHT * CHIP_HEIGHT )
{
return 0 ;
}


//左側判定
if( g_Map.Map[ ny / CHIP_HEIGHT ] [ nx / CHIP_WIDTH ] != 'z' || // プレイヤーの座標の左上
g_Map.Map[ ny / CHIP_HEIGHT ] [ nxw/ CHIP_WIDTH ] != 'z' || // プレイヤーの座標の右上
g_Map.Map[ nyh / CHIP_HEIGHT ] [ nx / CHIP_WIDTH ] != 'z' || // 右の下
g_Map.Map[ nyh / CHIP_HEIGHT ] [ nxw/ CHIP_WIDTH ] != 'z') // 左の下
{
return 1 ;
}

// 正常に動きますよ〜
return 3 ;
}

コメント(3)

これねー 床抜けるんだよwwww
床突き抜けるのwww助けてwwww
元のプログラムを作ったのは俺だが…w
分からないプログラムを使うより、
自分で作り直したほうがいいぞ!!

余裕が出来たら書き込むぜ!
ソースを見た感じだと、プレイヤーの4点がどのマップチップの中にあるかどうかを
調べているみたいだな

これだとプレイヤーの大きさとマップチップの大きさによっては
マップチップに埋まったりするから
オレンジ本にあった一番最初の当たり判定のほうがいいと思う

画面内にあるマップチップだけ判定すれば処理数も少なくなるし

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

ジャリの為のプログラム教室 更新情報

ジャリの為のプログラム教室のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。