box さんが書きました:KEYONN_ さんが書きました:
当たり判定がおかしいです。
どのようにおかしい、と判断されているのでしょうか。
ところで、コメントがないソースコードを読み解くのは、けっこうたいへんです。
また、変数や構造体の定義部の提示がないため、例えば「配列の要素数は適切に確保してあるか?」
というようなところが判断できないというのも困った点です。
どのようにおかしいかというと、壁ではない座標に弾が移動しても
(壁ではないy==0 か、y==240)反射してしまうのと、壁である座標でもそのまま通って
しまう事です。
あと、コメントと、変数と構造体の定義部の提示をします。
コード:
#include"DxLib.h"
#include<math.h>
#include<stdio.h>
#include<stdlib.h>
#define RAD (3.14159265/180)
typedef struct Bullet{
double x;//x座標
double y;//y座標
int flag;//フラグ
int kind;//種類(最初は銃、次にパワーアップしたら、レーザー,反射レーザー)
int syurui;//種類(自機用か、敵用か)
double angle;
double speed;
int vx,vy;
double OldX,OldY;
}Bullet;
typedef struct Enemy{
double x,y;//x,y座標
int width,height;//幅、高さ
int flag;//出現フラグ
int kind;//種類
int movekind;//動き方
int hp;//HP(ヒットポイント)
int tmp[100];//補助変数
}Enemy;
typedef struct Explosion{
int x,y;
int time;
int count;
int frame;
int flag;
}Explosion;
#define TAMA 0
#define LASER 1 //自機のショットタイプの定数
#define REFLASER 2 //反射レーザー
int tbl[]={128,96,0,32,64};//ロール値
int sx=0,sy=0;//スクロール値
int image;//自機のイメージ
int image2;//背景のイメージ
int image3[100];//敵
int SE[100];//効果音
int x=50;//x座標
int y=(240-32)/2;//y座標
int roll=20;//roll値 (/10する)
Bullet T[100]={0};
Enemy E[100]={0};
Explosion Ex[100]={0};
int Map[3][30][300]={0};
int MChip[256];
int xx[128];
int yy[128];
void DrawAndMoveShot()
{
int i;
for(i=0;i<100;i++)
{
if(T[i].flag==1)
{
if(T[i].syurui ==0)//種類(自機用か、敵用かの場合分け)0なら自機用、1なら敵用
{
if(T[i].kind==0) T[i].x+=5;//kind(パワーアップの武器の種類)が0ならx+=5;する
else{
//レーザー用移動ソース部分
if(Map[2][(int)(T[i].y/16)][(int)(T[i].x/16)]==0)
{
T[i].vy*=-1;
//map[2][y/16][x/16]が
//255以外だったら(0)なら反射する
//なお、マップエディタはPlatinamを使用
}
T[i].x+=T[i].vx;//加速値を加算
T[i].y+=T[i].vy;
}
}else{
T[i].x+=cos(T[i].angle*RAD)*T[i].speed;
T[i].y-=sin(T[i].angle*RAD)*T[i].speed;
//指定した角度で移動
}
switch(T[i].kind)//パワーアップの武器の種類
{
case TAMA://TAMAなら四角を描画
DrawBox(T[i].x,T[i].y,T[i].x+2,T[i].y+2,GetColor(255,0,0),TRUE);
//
break;
case LASER:
//レーザーなら、線を描画
DrawLine(T[i].x,T[i].y+16,T[i].x+32,T[i].y+16,GetColor(255,255,255));
break;
case REFLASER:
//反射レーザーなら、点を描画(45度なので、点だけでOK)
//DrawCircle(T[i].x,T[i].y,5,GetColor(255,0,0),TRUE);
//昔のVB6からソース移植(なので、あまり意味が分かってません)
for(int j=128;j>0;j--)
{
DrawPixel(xx[j],yy[j],GetColor(255,255,255));
//点を描画
}
for(int k=128;k>0;k--)
{
xx[k]=xx[k-1];
yy[k]=yy[k-1];
}
//DrawPixel(T[i].x,T[i].y,GetColor(255,0,0));
xx[0] = T[i].x;
yy[0] = T[i].y;
break;
}
if(T[i].x>320 || T[i].x<0 || T[i].y>240 || T[i].y<0) T[i].flag=0;
//画面外なら弾を消す
}
}
}