main.cpp
#include "solution/header/GV.h"
#include "solution\header\struct.h"
#include "solution\header\define.h"
#include "solution\header\int.h"
#include <math.h>
extern int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[]);
double xzahyou,yzahyou;
TamaPara_t TP;
ZikiPara_t ZP;
typedef struct{
int x,y,maxx,minx,maxy,miny,stage,maxhp,hp,canbreak,enemy,flag;
//中心のx,y座標,右端のx座標,左端のx座標,下のy座標,上のy座標,登場ステージ,最大HP,HP,倒せるかどうか,敵かどうか,存在フラグ
}BlockDeta_t;
BlockDeta_t BD[Block_Order_Max]={
/*中心のx,y座標,右端,左端,下端,上端,登場面,最大HP,HP,倒せるか,ノルマ,存在フラグ*/
{ 273, 233, 259, 232, 247, 220, 1, 1, 1, 1, 1, 1},
{ 245, 233, 259, 232, 247, 220, 1, 1, 1, 1, 1, 1},
{ 217, 233, 229, 204, 247, 220, 1, 1, 1, 1, 1, 1}
};
typedef struct{
int x,y,maxx,minx,maxy,miny,stage,maxhp,hp,canbreak,enemy,flag;
//中心のx,y座標,右端のx座標,左端のx座標,下のy座標,上のy座標,登場ステージ,最大HP,HP,倒せるかどうか,敵かどうか,存在フラグ
}BlockOrder_t;
BlockOrder_t BO[Block_Order_Max]={
/*中心のx,y座標,右端,左端,下端,上端,登場面,最大HP,HP,倒せるか,ノルマ,存在フラグ*/
{ 273, 233, 259, 232, 247, 220, 1, 1, 1, 1, 1, 1},
{ 245, 233, 259, 232, 247, 220, 1, 1, 1, 1, 1, 1},
{ 217, 233, 229, 204, 247, 220, 1, 1, 1, 1, 1, 1}
};
void ZikiOut(){//ミス時の処理
ZP.outmode=1;ZP.atmode=0;TamaStop=1;ZP.imgcnt=0;
}
void TamaMove(){//玉の動作
if(TamaStop==0){
TP.x+=(int)(TP.sp*cos(TP.ang*PI));
TP.y+=(int)(TP.sp*sin(TP.ang*PI));
}
}
void GamenTamaAtariJudge(){//画面端と玉の当たり判定の衝突判定及び処理
if(TP.y<=min_y+TP.at){//画面上
TP.y=min_y+TP.at;
TP.ang=2.000-TP.ang;
}
if(TP.y>=max_y-TP.at){//画面下
if(ZP.outmode==0){
ZikiOut();
}
/*TP.y=max_y-TP.at;
TP.ang=2.000-TP.ang;*/
}
if(TP.x<=min_x+TP.at){//画面左
TP.x=min_x+TP.at;
TP.ang=3.000-TP.ang;
}
if(TP.x>=max_x-TP.at){//画面右
TP.x=max_x-TP.at;
TP.ang=3.000-TP.ang;
}
}
int ZikiTamaHazikiJudge(){//自機のはじき判定と玉の当たり判定の衝突判定
int i;
double x,y,r;
if(ZP.img==12||ZP.img==13||ZP.img==14||ZP.img==15){//その場攻撃
x=(double)(ZP.x)-(double)(TP.x);//(自機の攻撃判定の中心のx座標)-玉のx座標
y=(double)(ZP.y)-(double)(TP.y);//(自機の攻撃判定の中心のy座標)-玉のx座標
r=(ZP.haziki)+(TP.at);
}
if(ZP.img==16||ZP.img==17||ZP.img==18||ZP.img==19){//左攻撃
x=(double)(ZP.x-9)-(double)(TP.x);//(自機の攻撃判定の中心のx座標)-玉のx座標
y=(double)(ZP.y)-(double)(TP.y);//(自機の攻撃判定の中心のy座標)-玉のx座標
r=(ZP.haziki)+(TP.at);
}
if(ZP.img==20||ZP.img==21||ZP.img==22||ZP.img==23){//右攻撃
x=(double)(ZP.x+9)-(double)(TP.x);//(自機の攻撃判定の中心のx座標)-玉のx座標
y=(double)(ZP.y)-(double)(TP.y);//(自機の攻撃判定の中心のy座標)-玉のx座標
r=(ZP.haziki)+(TP.at);
}
if(sqrt(TP.sp*TP.sp)>sqrt(r*r)){//移動した距離が(ZP.haziki)+(TP.at)より長ければ
double prey = TP.y-TP.sp*sin(TP.ang*PI);//1フレーム前の表示y座標
double prex = TP.x-TP.sp*cos(TP.ang*PI);//1フレーム前の表示x座標
double imay = TP.y;//現在の表示y座標
double imax = TP.x;//現在の表示x座標
double px,py;
for(i=0;i<sqrt(TP.sp*TP.sp)/sqrt(TP.at);i++){//進んだ分÷当たり判定分ループ
if(ZP.img==12||ZP.img==13||ZP.img==14||ZP.img==15){
px=prex-ZP.x;
py=prey-ZP.y;
}
if(ZP.img==16||ZP.img==17||ZP.img==18||ZP.img==19){
px=prex-(ZP.x-9);
py=prey-ZP.y;
}
if(ZP.img==20||ZP.img==21||ZP.img==22||ZP.img==23){
px=prex-(ZP.x+9);
py=prey-ZP.y;
}
if(px*px+py*py<r*r){
TP.x=(int)prex;
TP.y=(int)prey;
return 1;
}
prex+=TP.at*cos(TP.ang*PI);
prey+=TP.at*sin(TP.ang*PI);
}
}
if(x*x+y*y<r*r){//当たり判定内なら
return 1;//当たり
}
return 0;
}
int ZikiTamaAtariJudge(){//自機の当たり判定と玉の当たり判定の衝突判定(要検証)
int i;
/*double x,y,r;*/
double x=(double)(ZP.x)-(double)(TP.x);//自機の当たり判定の中心のx座標-玉のx座標
double y=(double)(ZP.y+9)-(double)(TP.y);//自機の当たり判定の中心のy座標-玉のy座標
double r=ZP.at+TP.at;//自機の当たり判定-玉の当たり判定
if(sqrt(TP.sp*TP.sp)>sqrt(r*r)){//玉が移動した距離が(ZP.at)+(TP.at)より長ければ
double pretx = TP.x-TP.sp*cos(TP.ang*PI);//1フレーム前の玉の表示x座標
double prety = TP.y-TP.sp*sin(TP.ang*PI);//1フレーム前の玉の表示y座標
double ptx,pty;
for(i=0;i<sqrt(TP.sp*TP.sp)/sqrt(TP.at*TP.at);i++){//玉が進んだ分÷玉の当たり判定分ループ
ptx=pretx-ZP.x;
pty=prety-ZP.y+9;
if(ptx*ptx+pty*pty<r*r){
TP.x=(int)pretx;
TP.y=(int)prety;
return 1;
}
}
}
if(x*x+y*y<r*r){
return 1;
}
return 0;
}
void ZikiTamaAtariHazikiSyori(){//自機の当たり判定、攻撃判定と玉の当たり判定の衝突時の処理
if(ZP.atmode>0){
if(TP.muteki==0){
if(ZikiTamaHazikiJudge()){
xzahyou=TP.x-ZP.x;
yzahyou=TP.y-(ZP.y+17);
TP.ang=(atan2(yzahyou,xzahyou))/PI;
TP.muteki=1;
}
}
}
if(ZP.atmode==0){
TP.muteki=0;
}
if(ZP.muteki==0){
if(ZP.outmode==0){
if(ZikiTamaAtariJudge()){
ZikiOut();
}
}
}
}
void ZikiMove(){//自機の動作(ポーズもここ)
ZP.img=((ZP.imgcnt)%48)/12;
if(Key[KEY_INPUT_RETURN]==1){//ポーズ
if(Pause==0){
TamaStop=1;
ZikiStop=1;
Pause=1;
}
else if(Pause==1){
TamaStop=0;
ZikiStop=0;
Pause=0;
}
}
if(ZikiStop==0){
if(Key[KEY_INPUT_A]<=0 && Key[ KEY_INPUT_RIGHT ] >= 1 && Key[ KEY_INPUT_LEFT ] <= 0 && ZP.atmode==0 && ZP.outmode==0){//右移動
if(ZP.x<(max_x-ZP.at)){
ZP.x+=(int)ZP.sp;
}
ZP.img+=8;
}
else if(Key[KEY_INPUT_A]<=0 && Key[ KEY_INPUT_RIGHT ] <= 0 && Key[ KEY_INPUT_LEFT ] >= 1 && ZP.atmode==0 && ZP.outmode==0){//左移動
if(ZP.x>(min_x+ZP.at)){
ZP.x-=(int)ZP.sp;
}
ZP.img+=4;
}
else if(Key[KEY_INPUT_A]==1 && Key[ KEY_INPUT_RIGHT ] >= 1 && Key[ KEY_INPUT_LEFT ] <= 0 && ZP.atmode==0 && ZP.outmode==0){//右攻撃
ZP.atmode=3;
ZP.imgcnt=0;
}
else if(Key[KEY_INPUT_A]==1 && Key[ KEY_INPUT_RIGHT ] <= 0 && Key[ KEY_INPUT_LEFT ] >= 1 && ZP.atmode==0 && ZP.outmode==0){//左攻撃
ZP.atmode=2;
ZP.imgcnt=0;
}
else if(Key[KEY_INPUT_A]==1 && Key[ KEY_INPUT_RIGHT ] <= 0 && Key[ KEY_INPUT_LEFT ] <= 0 && ZP.atmode==0 && ZP.outmode==0){//その場攻撃
ZP.atmode=1;
ZP.imgcnt=0;
}
else if(Key[KEY_INPUT_A]==1 && Key[ KEY_INPUT_RIGHT ] >= 1 && Key[ KEY_INPUT_LEFT ] >= 1 && ZP.atmode==0 && ZP.outmode==0){//その場攻撃
ZP.atmode=1;
ZP.imgcnt=0;
}
else {}
if(ZP.atmode>=1){/*攻撃中の処理*/
ZP.img=((ZP.imgcnt)%48)/12;/*硬直時間*/
ZP.img+=(2+ZP.atmode)*4;/*画像処理*/
if(ZP.atmode==2){/*左攻撃中の移動*/
if(ZP.x>(min_x+ZP.at)){
ZP.x-=(int)ZP.sp;
}
}
if(ZP.atmode==3){/*右攻撃中の移動*/
if(ZP.x<(max_x-ZP.at)){
ZP.x+=(int)ZP.sp;
}
}
if(ZP.imgcnt==47){
ZP.atmode=0;
}
}
if(ZP.outmode>=1){//やられモーションの処理
ZP.img=((ZP.imgcnt)%48)/12;/*硬直時間*/
ZP.img+=24;/*画像処理*/
if(ZP.imgcnt==47){
ZP.outmode=0;
//TP.x=Start_Tama_x;
TP.y=Start_Tama_y;
TP.ang=Start_Tama_ang;
TamaStop=0;
}
}
ZP.imgcnt++;
}
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
int i;//ループ用
int img_waku;
img_waku=LoadGraph("img/waku.png");
int img_tama;
img_tama=LoadGraph("img/tama_ver0.10.png");
int img_block1;
img_block1=LoadGraph("img/block1.png");
int img_Ziki[28];
LoadDivGraph("img/ziki[28]_ver0.26.png",28,4,7,53,35,img_Ziki);
TP.x=Start_Tama_x;
TP.y=Start_Tama_y;
TP.muteki=0;
TP.at=Tama_Atari_Hantei;
TP.sp=4.000;
TP.ang=Start_Tama_ang;
ZP.at=8.000;
ZP.haziki=17.000;
ZP.x=(max_x+min_x)/2;
ZP.y=max_y-18;
ZP.sp=4.000;
ZP.img=0;
ZP.imgcnt=0;
ZP.atmode=0;
ZP.zanki=5;
ZP.muteki=0;
ZP.outmode=0;
while(ScreenFlip()==0 &&ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
//↑メッセージ処理 ↑画面をクリア ↑入力状態を保存 ↑ESCが押されていない
ZikiMove();
TamaMove();
ZikiTamaAtariHazikiSyori();
GamenTamaAtariJudge();
DrawRotaGraph(ZP.x,ZP.y,1.0,0.0,img_Ziki[ZP.img],TRUE);
for(i=0;i<Block_Order_Max;i++){
if(BO[i].flag==1){
DrawRotaGraph(BO[i].x,BO[i].y,1.0,0.0,img_block1,TRUE);
}
}
DrawRotaGraph(TP.x,TP.y,1.0,0.0,img_tama,TRUE);
DrawGraph(0,0,img_waku,TRUE);
DrawFormatString( 0,0,GetColor(255,255,255),"%f",TP.sp);
DrawFormatString( 0,20,GetColor(255,255,255),"%d %d",TP.x,TP.y);
DrawFormatString( 0,40,GetColor(255,255,255),"%f",TP.at+ZP.at);
DrawFormatString( 0,60,GetColor(255,255,255),"%d %d",ZP.x-TP.x,ZP.y+9-TP.y);
DrawFormatString( 0,80,GetColor(0,0,255),"%d %d %d",BO[0].x,BO[0].y,BO[0].flag);
}
DxLib_End();
return 0;
}
#ifndef DEF_PLAYER_H //二重include防止
#define DEF_PLAYER_H
int Key[256];
int dgx=0,dgy=0;
int TamaStop=0,ZikiStop=0;//玉停止、自機停止
int Pause=0;//ポーズスイッチ
#endif
#include "GV.h"
typedef struct{//玉のパラメータ
int x,y,muteki;//x座標,y座標,玉無敵スイッチ
double at,sp,ang;//当たり判定、スピード、投射角
}TamaPara_t;
typedef struct{//自機のパラメータ
int x,y,img,imgcnt,zanki,muteki,atmode,outmode;//座標、画像の番号,画像カウンター,残機の数,無敵時間,攻撃スイッチ,やられスイッチ
double sp,at,haziki;//自機の動く速さ,当たり判定の大きさ,はじき判定の大きさ
}ZikiPara_t;
#define PI 3.141592//円周率
#define max_y 432//ゲーム部分下端
#define min_y 79 //ゲーム部分上端
#define max_x 512 //ゲーム部分右端
#define min_x 63 //ゲーム部分左端
#define Start_Tama_x 502//玉の初期x座標
#define Start_Tama_y 404//玉の初期y座標
#define Start_Tama_ang 1.000//玉の初期角度
#define Tama_Atari_Hantei 10.000//玉の当たり判定
#define Block_Order_Max 3//敵情報の数
#include "../header/GV.h"
//int Key[256];
int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key[i]==1) GetHitKeyStateAll_InputKey[i]++;
else GetHitKeyStateAll_InputKey[i]=0;
}
return 0;
}
1>AtariJudgeSyori.obj : error LNK2005: "int * Key" (?Key@@3PAHA) は既に main.obj で定義されています。
1>AtariJudgeSyori.obj : error LNK2005: "int dgx" (?dgx@@3HA) は既に main.obj で定義されています。
:
という風に書かれていたので「mainで定義されているならint.hをつなげなくてもいいだろう」と考えてmain.cppの4行目をコメントアウトしたら今度は「定義されていません」と出てしまいます。これは一体どういう事なのでしょうか。