また投稿致します。
実は参考書を頼りに作成していまして、そこで分からないところがありましたのでお時間があるときに返して頂けたらと思っています。
長文になります。申し訳ありません!m(_ _)m
問題になっている部分はスクロール時に当たり判定とブロックの画像がずれてしまいます。
void DrawHero(int ac){
int key = GetJoypadInputState(DX_INPUT_KEY_PAD1);
DrawKnife(key);
float mv = 200.0f * g_frametime; //移動量計算
float hx = g_stagedata.hero.x;
float hy = g_stagedata.hero.y;
//ジャンプ処理
if (g_stagedata.hero.jumping == TRUE){
mv = 0; //ジャンプ中は自力で移動させない
g_stagedata.hero.jumppower -= GRAVITY;
hy -= (g_stagedata.hero.jumppower * g_frametime);
hx += (g_stagedata.hero.jumpforward * g_frametime);
}
if (key & PAD_INPUT_LEFT) {
hx -= mv;
g_stagedata.hero.turn = TRUE;
}
if (key & PAD_INPUT_RIGHT) {
hx += mv;
g_stagedata.hero.turn = FALSE;
}
//マップ当たり判定
AtariInfo atari = CheckBlock(hx, hy, g_stagedata.hero.x);
if (g_stagedata.hero.turn == FALSE){
if (atari.DR == TRUE || atari.UR == TRUE){
hx = g_stagedata.hero.x;
}
}
else {
if (atari.DL == TRUE || atari.UL == TRUE){
hx = g_stagedata.hero.x;
}
}
//接地チェック
if (atari.GL == TRUE || atari.GR == TRUE) {
g_stagedata.hero.noground = FALSE;
g_stagedata.hero.jumping = FALSE;
g_stagedata.hero.jumppower = 0;
g_stagedata.hero.jumpforward = 0;
//ジャンプ後に地面に埋まらないよう補正
hy = (float)((int)(hy / IMG_CHIPSIZE) * IMG_CHIPSIZE);
}
else {
g_stagedata.hero.noground = TRUE;
//重力で落下
g_stagedata.hero.jumping = TRUE;
}
//天井チェック
if (g_stagedata.hero.jumping == TRUE){
if (atari.UL == TRUE || atari.UR == TRUE){
g_stagedata.hero.jumppower = 0;
g_stagedata.hero.jumpforward = 0;
}
}
//ジャンプ処理その2
if (g_stagedata.hero.jumping == FALSE){
if (IsAKeyTrigger(key) == TRUE && g_stagedata.hero.noground == FALSE)
{
g_stagedata.hero.jumping = TRUE;
g_stagedata.hero.jumppower = JUMP_POWER;
if (key & PAD_INPUT_LEFT) {
g_stagedata.hero.jumpforward = -JUMP_FORWARD;
}
if (key & PAD_INPUT_RIGHT) {
g_stagedata.hero.jumpforward = JUMP_FORWARD;
}
}
}
//スクロール補正
if (hx - g_stagedata.scrollx > SCROLL_RIGHT){
g_stagedata.scrollx += (hx - g_stagedata.hero.x);
}
else if(hx - g_stagedata.scrollx < SCROLL_LEFT){
g_stagedata.scrollx += (hx - g_stagedata.hero.x);
}
if(hy - g_stagedata.scrolly > SCROLL_TOP ){
g_stagedata.scrolly += (hy - g_stagedata.hero.y);
}
if(hy - g_stagedata.scrolly < SCROLL_BOTTOM ){
g_stagedata.scrolly += (hy - g_stagedata.hero.y);
}
g_stagedata.hero.x = hx;
g_stagedata.hero.y = hy;
DrawRotaGraph2((int)(g_stagedata.hero.x - g_stagedata.scrollx),
(int)g_stagedata.hero.y, 0, 0, 0.8, 0,
g_imghandles.hero[ac % ANIMFRAME], TRUE, g_stagedata.hero.turn);
}
//ブロックとの当たり判定
BOOL _CheckBlockSub(float x, float y){
int mx = (int)(x / IMG_CHIPSIZE);
int my = (int)(y / IMG_CHIPSIZE);
//マップの範囲外ならFALSE
if ((mx < 0) || (mx >= g_stagedata.mapwidth) || (my >= MAP_HEIGHT) || (my < 0)){
return FALSE;
}
if (g_mapdata[my][mx] != '0') return TRUE;
return FALSE;
}
AtariInfo CheckBlock(float x, float y, float rx){
AtariInfo result;
result.UL = _CheckBlockSub(x, y);
result.UR = _CheckBlockSub(x + IMG_CHIPSIZE - 1, y);
result.DL = _CheckBlockSub(x, y + IMG_CHIPSIZE -1);
result.DR = _CheckBlockSub(x + IMG_CHIPSIZE - 1, y + IMG_CHIPSIZE -1);
result.GL = _CheckBlockSub(rx, y + IMG_CHIPSIZE);
result.GR = _CheckBlockSub(rx + IMG_CHIPSIZE - 1, y + IMG_CHIPSIZE);
return result;
}
void DrawMap(){
int sc = (int)(g_stagedata.scrollx / IMG_CHIPSIZE);
int sa = (int)(g_stagedata.scrolly / IMG_CHIPSIZE);
int shiftx = (int)g_stagedata.scrollx % IMG_CHIPSIZE;
int shifty = (int)g_stagedata.scrolly % IMG_CHIPSIZE;
for (int y = 0; y < SCR_HEIGHT + 1; y++){
for (int x = 0; x < SCR_WIDTH + 1; x++){
if (x + sc >= g_stagedata.mapwidth)break;
//else if (y + sa >= g_stagedata.mapheight)break;
if (g_mapdata[y + sa][x + sc] == '1'){
DrawRotaGraph2(x * IMG_CHIPSIZE - shiftx, y * IMG_CHIPSIZE - shifty,
0,0,0.8,0,
g_imghandles.block[0], TRUE);
}
if (g_mapdata[y + sa][x + sc] == '2'){
DrawRotaGraph2(x * IMG_CHIPSIZE - shiftx, y * IMG_CHIPSIZE - shifty,
0,0,0.8,0,
g_imghandles.block[1], TRUE);
}
if (g_mapdata[y + sa][x + sc] == '3'){
DrawRotaGraph2(x * IMG_CHIPSIZE - shiftx, y * IMG_CHIPSIZE - shifty,
0,0,0.8,0,
g_imghandles.block[2], TRUE);
}
if (g_mapdata[y + sa][x + sc] == '4'){
DrawRotaGraph2(x * IMG_CHIPSIZE - shiftx, y * IMG_CHIPSIZE - shifty,
0,0,0.8,0,
g_imghandles.block[3], TRUE);
}
if (g_mapdata[y + sa][x + sc] == '5'){
DrawRotaGraph2(x * IMG_CHIPSIZE - shiftx, y * IMG_CHIPSIZE - shifty,
0,0,0.8,0,
g_imghandles.block[4], TRUE);
}
if (g_mapdata[y + sa][x + sc] == '6'){
DrawRotaGraph2(x * IMG_CHIPSIZE - shiftx, y * IMG_CHIPSIZE - shifty,
0,0,0.8,0,
g_imghandles.block[5], TRUE);
}
if (g_mapdata[y + sa][x + sc] == '7'){
DrawRotaGraph2(x * IMG_CHIPSIZE - shiftx, y * IMG_CHIPSIZE - shifty,
0,0,0.8,0,
g_imghandles.block[6], TRUE);
}
if (g_mapdata[y + sa][x + sc] == '8'){
DrawRotaGraph2(x * IMG_CHIPSIZE - shiftx, y * IMG_CHIPSIZE - shifty,
0,0,0.8,0,
g_imghandles.block[7], TRUE);
}
if (g_mapdata[y + sa][x + sc] == '9'){
DrawRotaGraph2(x * IMG_CHIPSIZE - shiftx, y * IMG_CHIPSIZE - shifty,
0,0,0.8,0,
g_imghandles.block[8], TRUE);
}
if (g_mapdata[y + sa][x + sc] == 'a'){
DrawRotaGraph2(x * IMG_CHIPSIZE - shiftx, y * IMG_CHIPSIZE - shifty,
0,0,0.8,0,
g_imghandles.block[9], TRUE);
}
if (g_mapdata[y + sa][x + sc] == 'b'){
DrawRotaGraph2(x * IMG_CHIPSIZE - shiftx, y * IMG_CHIPSIZE - shifty,
0,0,0.8,0,
g_imghandles.block[10], TRUE);
}
if (g_mapdata[y + sa][x + sc] == 'c'){
DrawRotaGraph2(x * IMG_CHIPSIZE - shiftx, y * IMG_CHIPSIZE - shifty,
0,0,0.8,0,
g_imghandles.block[11], TRUE);
}
if (g_mapdata[y + sa][x + sc] == 'd'){
DrawRotaGraph2(x * IMG_CHIPSIZE - shiftx, y * IMG_CHIPSIZE - shifty,
0,0,0.8,0,
g_imghandles.block[12], TRUE);
}
}
}
}