// invaderView.cpp : CinvaderView クラスの実装 // #include "stdafx.h" #include "invader.h" #include "invaderDoc.h" #include "invaderView.h" #ifdef _DEBUG #define new DEBUG_NEW #endif #include // CinvaderView IMPLEMENT_DYNCREATE(CinvaderView, CView) BEGIN_MESSAGE_MAP(CinvaderView, CView) // 標準印刷コマンド ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview) ON_WM_CREATE() ON_WM_SIZE() ON_WM_TIMER() ON_WM_KEYDOWN() ON_WM_KEYUP() END_MESSAGE_MAP() // CinvaderView コンストラクション/デストラクション CinvaderView::CinvaderView() { // TODO: 構築コードをここに追加します。 } CinvaderView::~CinvaderView() { } BOOL CinvaderView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: この位置で CREATESTRUCT cs を修正して Window クラスまたはスタイルを // 修正してください。 return CView::PreCreateWindow(cs); } // CinvaderView 描画 #define TEKI 5 #define SHOT 255 #define MYSHOT 100 int xteki[TEKI],yteki[TEKI],size_teki[TEKI],size_teki_max,mov_teki[TEKI]; int xjiki,yjiki,size_jiki; int xshot[SHOT],yshot[SHOT],size_shot,mov_shot[SHOT]; int xshot2[SHOT],yshot2[SHOT],size_shot2,mov_shot2[SHOT]; int xshot3[SHOT],yshot3[SHOT],size_shot3,mov_shot3[SHOT]; int xmyshot[MYSHOT],ymyshot[MYSHOT],size_myshot,mov_myshot[MYSHOT]; int win_xsize,win_ysize; int box,hp,hp_max,hp_teki; bool finish,clear,last[TEKI],ready; int aa,bb,cc,dd,ee,ff,gg,hh; void CinvaderView::OnDraw(CDC* pDC) { CinvaderDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: この場所にネイティブ データ用の描画コードを追加します。 int a; for(a=0;aEllipse(xteki[a],yteki[a],xteki[a]+size_teki[a],yteki[a]+size_teki[a]); } pDC->Ellipse(xjiki,yjiki,xjiki+size_jiki,yjiki+size_jiki); //自機 int b; for(b=0;bRectangle(xshot[b],yshot[b],xshot[b]+size_shot,yshot[b]+size_shot); pDC->MoveTo(xshot2[b],yshot2[b]); pDC->LineTo(xshot2[b],yshot2[b]+size_shot2); pDC->MoveTo(xshot3[b],yshot3[b]); pDC->LineTo(xshot3[b]+size_shot3,yshot3[b]); } int c; for(c=0;cEllipse(xmyshot[c],ymyshot[c],xmyshot[c]+size_myshot,ymyshot[c]+size_myshot); } pDC->SetBkMode(TRANSPARENT); CString mojiretsu; mojiretsu.Format("HP: %2d / %2d",hp,hp_max); pDC->TextOut(10,win_ysize-30,mojiretsu); pDC->SetBkMode(OPAQUE); if(finish==TRUE || clear==TRUE){ if(finish==TRUE) pDC->TextOut(200,win_ysize/2-20,"ゲームオーバー"); else pDC->TextOut(200,win_ysize/2-20,"ゲームクリアー!"); pDC->TextOut(200,win_ysize/2,"リトライしますか? YES…Zキーを押して下さい"); } } // CinvaderView 印刷 BOOL CinvaderView::OnPreparePrinting(CPrintInfo* pInfo) { // デフォルトの印刷準備 return DoPreparePrinting(pInfo); } void CinvaderView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: 印刷前の特別な初期化処理を追加してください。 } void CinvaderView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: 印刷後の後処理を追加してください。 } // CinvaderView 診断 #ifdef _DEBUG void CinvaderView::AssertValid() const { CView::AssertValid(); } void CinvaderView::Dump(CDumpContext& dc) const { CView::Dump(dc); } CinvaderDoc* CinvaderView::GetDocument() const // デバッグ以外のバージョンはインラインです。 { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CinvaderDoc))); return (CinvaderDoc*)m_pDocument; } #endif //_DEBUG // CinvaderView メッセージ ハンドラ int CinvaderView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == -1) return -1; // TODO : ここに特定な作成コードを追加してください。 box=AfxMessageBox("難易度を選択して下さい\n「easy:中止」 「normal:再試行」 「hard:無視」" ,MB_ABORTRETRYIGNORE|MB_ICONQUESTION); if(box==IDABORT) box=30; else if(box==IDRETRY) box=10; else box=5; AfxMessageBox("★☆操作説明☆★\nショット:スペースキー\n移動:矢印キー\n\nOKボタンを押すとゲームがスタートします" ,MB_OK|MB_ICONINFORMATION); srand((unsigned)time(NULL)); shokika(); return 0; } void CinvaderView::shokika(void) //自作関数 { size_shot=10; size_shot2=100; size_shot3=100; size_myshot=10; size_jiki=30; size_teki_max=50; xjiki=100; yjiki=500; hp=hp_max=box; hp_teki=TEKI; finish=clear=ready=FALSE; aa=bb=cc=dd=ee=ff=gg=hh=0; int a; for(a=0;awin_xsize-size_teki[b]){ xteki[b]=win_xsize-size_teki[b]; mov_teki[b]=-mov_teki[b]; } } switch(aa){ //ランダムな敵1機がどの種類かの弾を1発だけ発射 case 0: if(bb==0){ if(last[ra]==TRUE){ xshot3[cc]=xteki[ra]+size_teki[ra]/2-size_shot3/2; yshot3[cc]=yteki[ra]+size_teki[ra]/2; mov_shot3[cc]=10; cc=(cc+1)%SHOT; goto A; } goto B; } else{ B: xshot2[dd]=xteki[ra]+size_teki[ra]/2; yshot2[dd]=yteki[ra]+size_teki[ra]/2; mov_shot2[dd]=10; dd=(dd+1)%SHOT; } A: bb=(bb+1)%2; break; default: xshot[ee]=xteki[ra]+size_teki[ra]/2; yshot[ee]=yteki[ra]+size_teki[ra]/2; mov_shot[ee]=5; ee=(ee+1)%SHOT; break; } aa=(aa+1)%3; int c,d; for(c=0,d=0;cxteki[g] && xmyshot[f]+size_myshot/2yteki[g] && ymyshot[f]+size_myshot/2xjiki && xshot[h]+size_shot/2yjiki && yshot[h]+size_shot/2xjiki && xshot2[h]yjiki && yshot2[h]+ixjiki && xshot3[h]+jyjiki && yshot3[h]win_xsize-size_jiki) xjiki=win_xsize-size_jiki; break; case VK_UP: yjiki+=-size_jiki/2; if(yjikiwin_ysize-size_jiki) yjiki=win_ysize-size_jiki; break; } InvalidateRect(NULL); } else if(nChar=='Z'){ //リトライ shokika(); InvalidateRect(NULL); } CView::OnKeyDown(nChar, nRepCnt, nFlags); } void CinvaderView::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) { // TODO : ここにメッセージ ハンドラ コードを追加するか、既定の処理を呼び出します。 if(finish==FALSE && clear==FALSE){ if(nChar==VK_SPACE && ready==TRUE){ //自弾発射 xmyshot[hh]=xjiki+size_jiki/2; ymyshot[hh]=yjiki+size_jiki/2; mov_myshot[hh]=-5; hh=(hh+1)%MYSHOT; ready=FALSE; InvalidateRect(NULL); } } CView::OnKeyUp(nChar, nRepCnt, nFlags); }