⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 winmain.cpp

📁 入侵者游戏 编译环境VC 开发库DIRECTX8.1以上 2D游戏
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	    rcRect.top = pDeadBullet->GetY()-6;
	    rcRect.right = pDeadBullet->GetX()+20;
	    rcRect.bottom = pDeadBullet->GetY()+32;
		
		if (rcRect.bottom > 640)
			rcRect.bottom = 640;
		DrawBackGround(lpBackBuffer, pDeadBullet->GetX(),pDeadBullet->GetY(),pDeadBullet->GetX()+20,pDeadBullet->GetY()+20);

		while (1)
		{
			hRet = lpFrontBuffer->BltFast(pDeadBullet->GetX(), pDeadBullet->GetY()-6, lpBkGround, &rcRect, FALSE);
			if (hRet == DD_OK)
			{
				break;
			}
			if (hRet == DDERR_SURFACELOST)
			{
				hRet = RestoreSurfaces();
				if (hRet != DD_OK)
					break;
			}
			if (hRet != DDERR_WASSTILLDRAWING)
				break;
		}
}


void DrawInvalidBackGround()
{
	
	// Redraw background
	RECT		rcRect;
	HRESULT		hRet;
	static		y = 0;
	const int	iFim = 455;
	if (lastTickCount = 0)
	{
		y =0;
	}
	y += 1;
	if (y>iFim)
		y = 0;

	rcRect.left = 0;
    rcRect.top = 0;
    rcRect.right = 640;
    rcRect.bottom = iFim-y;

	
	while (1)
    {
		hRet = lpBackBuffer->BltFast(0, y, lpBkGround, &rcRect, DDBLTFAST_NOCOLORKEY);
        if (hRet == DD_OK)
        {
            break;
        }
        if (hRet == DDERR_SURFACELOST)
        {
            hRet = RestoreSurfaces();
            if (hRet != DD_OK)
                break;
        }
        if (hRet != DDERR_WASSTILLDRAWING)
            break;
    }


	rcRect.left = 0;
    rcRect.top = iFim-y;
    rcRect.right = 640;
    rcRect.bottom = iFim;

	while (1)
    {
        hRet = lpBackBuffer->BltFast(0, 0, lpBkGround, &rcRect, DDBLTFAST_NOCOLORKEY);
        if (hRet == DD_OK)
        {
            break;
        }
        if (hRet == DDERR_SURFACELOST)
        {
            hRet = RestoreSurfaces();
            if (hRet != DD_OK)
                break;
        }
        if (hRet != DDERR_WASSTILLDRAWING)
            break;
    }

	//DrawBackGround(lpBackBuffer,0,y,640,460);
/*	Bullet*		pFirstBullet;
	Extra*		pFirstExtra;
	Ovni*		pFirstUFO;
	int			left;
	int			right;
	
	if (iRepaint == -1)
	{
		pFirstExtra = pExtra;
		while (pExtra != NULL)
		{
			
			pExtra->Repaint(lpBackBuffer,lpBkGround,NULL);
			pExtra = pExtra->GetNext();
		}
		pExtra = pFirstExtra;

		pFirstUFO = pUFO;
		while (pUFO != NULL)
		{
			
			pUFO->Repaint(lpBackBuffer, lpBkGround, NULL);
			pUFO = pUFO->GetNext();
		}
		pUFO = pFirstUFO;

		pFirstBullet = pBullet;
		while (pBullet != NULL)
		{
			pBullet->Repaint(lpBackBuffer,lpBkGround,NULL);
			//DrawBackGround(iTempX,iTempY-12, iTempX+20, iTempY+34);
			pBullet = pBullet->GetNext();
		}
		pBullet = pFirstBullet;


		left = iShipPos-25;
		if (left < 0)
			left=0;
		right = iShipPos+95;
		if (right > 640)
			right=640;
		DrawBackGround(lpBackBuffer,left,380,right,456);
	}
	else
	{
		DrawBackGround(lpBackBuffer,0,0,640,480);
		iRepaint--;
		iLastWeapon = -1;
		iLastAmmo = -1;
		Lastscore = -1;
		iLastShield = -1;
	}*/
}

void DrawExtra()
{
	// Draw extra objects in the screen (ammo, bonus, etc)

	Extra*		pFirstExtra;
	Extra*		pNextExtra = NULL;
	Extra*		pLastExtra = NULL;
	Extra*		pPrevExtra = NULL;

	pFirstExtra = pExtra;
	//因为当前屏幕中可能有多个奖子,所以这里使用while语句就是要将所有的奖子都绘制出来,
	//当前屏幕中的奖子都被保存在同一个奖子链表中,所以绘制所有奖子时要求遍历整个奖子队列
	while (pExtra != NULL)
	{
		//传入的是-3,即每次掉落3个象素点
		pExtra->Move(-3);
		//绘制当前节点奖子
		pExtra->Draw(lpBackBuffer,lpExtra);

		//如果当前的奖子已经掉落到屏幕以外,则调整奖子列表,删除当前奖子节点
		if (pExtra->GetY() > 455)
		{
			//调整奖子链表节点和相关指针
			if (pPrevExtra != NULL)
				pPrevExtra->SetNext( pExtra->GetNext() );
			pNextExtra = pExtra->GetNext();
			if (pNextExtra != NULL)
				pNextExtra->SetPrev(pPrevExtra);
			//如果当前奖子节点位于链表中的第一位置,则还需要再调整链表
			if (pExtra == pFirstExtra)
				pFirstExtra=pExtra->GetNext();
			//删除当前奖子节点
			delete(pExtra);
			//重置当前奖子节点
			pExtra = pNextExtra;
		}
		else
		{
			//遍历奖子链表:当前奖子节点指向链表中下一个节点
			pPrevExtra = pExtra;
			pExtra = pExtra->GetNext();
		}
	}
	pExtra = pFirstExtra;
}

void DrawBullet()
{
	// Draw bullets in the screen
	Bullet*		pFirstBullet;
	Bullet* pNextBullet = NULL;
	Bullet* pLastBullet = NULL;
	Bullet* pPrevBullet = NULL;

	pFirstBullet = pBullet;
	while (pBullet != NULL)
	{
		switch(pBullet->GetType())
		{
		case 0:
			pBullet->Move(6);
			pBullet->Draw(lpBackBuffer,lpShoot);
			break;
		case 1:
			pBullet->Move(-6);
			pBullet->Draw(lpBackBuffer,lpUfoShoot);
			break;
		case 2:
			pBullet->Move(10);
			pBullet->Draw(lpBackBuffer,lpShoot2);
			break;
		}

		if ((pBullet->GetY() <= -26) ||
			(pBullet->GetY() > 455))
		{
			if (pPrevBullet != NULL)
				pPrevBullet->SetNext( pBullet->GetNext() );
			pNextBullet = pBullet->GetNext();
			if (pNextBullet != NULL)
				pNextBullet->SetPrev(pPrevBullet);
			if (pBullet == pFirstBullet)
				pFirstBullet=pBullet->GetNext();
			//pBullet->Repaint(lpFrontBuffer,lpBkGround, NULL);
			//pBullet->Repaint(lpBackBuffer,lpBkGround, 1);
			delete(pBullet);
			pBullet = pNextBullet;
		}
		else
		{
		pPrevBullet = pBullet;
		pBullet = pBullet->GetNext();
		}
	}
	pBullet = pFirstBullet;
}

int CheckHitExtra(void)
{
	Extra		*pFirstExtra, *pPrevExtra, *pNextExtra;
	int			iReturn = 0;

	// Check if the ship get an extra
	pPrevExtra = NULL;
	pNextExtra = NULL;
	pFirstExtra = pExtra;
	while (pExtra != NULL)
	{
		if ((pExtra->GetX() >= iShipPos   &&
			pExtra->GetX()  < iShipPos+54 &&
			pExtra->GetY()  > 385         &&
			pExtra->GetY()  < 425)        &&
			(pExtra->GetType() != 0))
		{
			if (pPrevExtra != NULL)
				pPrevExtra->SetNext( pExtra->GetNext() );
			pNextExtra = pExtra->GetNext();
			if (pNextExtra != NULL)
				pNextExtra->SetPrev(pPrevExtra);
			if (pExtra == pFirstExtra)
				pFirstExtra=pExtra->GetNext();

			iReturn = pExtra->GetType();
			//pExtra->Repaint(lpFrontBuffer,lpBkGround,0);
			//pExtra->Repaint(lpBackBuffer,lpBkGround,1);
			delete(pExtra);
			pExtra = pFirstExtra;
			return iReturn;
		}
		pPrevExtra = pExtra;
		pExtra = pExtra->GetNext();
	}
	pExtra = pFirstExtra;
	return iReturn;
}


BOOL CheckHitShip(void)
{
	Bullet		*pFirstBullet, *pPrevBullet, *pNextBullet;;

	// chekc if the ship was hitted

	if (iShipState == 1) 
		return FALSE;

	pPrevBullet = NULL;
	pNextBullet = NULL;
	pFirstBullet = pBullet;
	while (pBullet != NULL)
	{
		if ((pBullet->GetX() >= iShipPos   &&
			pBullet->GetX()  < iShipPos+54 &&
			pBullet->GetY()  > 385         &&
			pBullet->GetY()  < 425)        &&
			(pBullet->GetType() != 0))
		{
			if (pPrevBullet != NULL)
				pPrevBullet->SetNext( pBullet->GetNext() );
			pNextBullet = pBullet->GetNext();
			if (pNextBullet != NULL)
				pNextBullet->SetPrev(pPrevBullet);
			if (pBullet == pFirstBullet)
				pFirstBullet=pBullet->GetNext();
			DestroyBullet(pBullet);
			delete(pBullet);
			pBullet = pFirstBullet;
			return TRUE;
		}
		pPrevBullet = pBullet;
		pBullet = pBullet->GetNext();
	}
	pBullet = pFirstBullet;
	return FALSE;
}

void DrawShip()
{
	static int					ArgPosY = 0;
	static int					ArgPosX = 0;
	static int					inc = 70;
	
	// draw the ship

    RECT                        rcRect;
    HRESULT                     hRet;

    // DrawUFO();

	rcRect.left = ArgPosX;
	rcRect.top = ArgPosY;
	rcRect.right = ArgPosX + 70;
	rcRect.bottom = ArgPosY + 70;

	if (bShipStop)
	{
			SndObjPlay(hsoStop,0);
			bShipStop = FALSE;
	}

	iShipPos += iShipMov;

	if (iShipPos <= 1) 
	{
		iShipMov = 0;
		iShipPos = 1;
	}
	if (iShipPos >= 569) 
	{	
		iShipMov = 0;
		iShipPos = 569;	
	}

	if (iShipState == 0 && CheckHitShip() == TRUE)
	{
		iShield = iShield - 20;
	}

	if (iShield <= 0 && iShipState == 0)
	{
		iShield = 0;
		iShipState = 1;
		iShipMov = 0;
		ArgPosX = 0;
		ArgPosY = 0;
		rcRect.left = ArgPosX;
		rcRect.top = ArgPosY;
		rcRect.right = ArgPosX + 70;
		rcRect.bottom = ArgPosY + 70;
		inc = 70;
	}


	if (iShipState == SHIP_OK &&
		pExtra != NULL)
	{
		int iType;

		// check if we hit an extra
		// if so, select the kinf of extra
		iType = CheckHitExtra();
		switch (iType)
		{
		case 1:
			iPhotonAmmo += 25;
			if (iPhotonAmmo > 999)
				iPhotonAmmo = 999;
			SndObjStop(hsoGetExtra);
			SndObjPlay(hsoGetExtra, NULL);
			break;
		case 2:
			iMaxWeapon++;
			if (iMaxWeapon > 5)
				iMaxWeapon = 5;
			else
				iWeapon = iMaxWeapon;
			SndObjStop(hsoGetExtra);
			SndObjPlay(hsoGetExtra, NULL);
			break;
		case 3:
			score += 100;
			SndObjStop(hsoGetExtra);
			SndObjPlay(hsoGetExtra, NULL);
			break;
		case 4:
			iLaserAmmo += 40;
			if (iLaserAmmo > 999)
				iLaserAmmo = 999;
			SndObjStop(hsoGetExtra);
			SndObjPlay(hsoGetExtra, NULL);
			break;
		case 5:
			iShield += 10;
			if (iShield > 50)
				iShield = 50;
			SndObjStop(hsoGetExtra);
			SndObjPlay(hsoGetExtra, NULL);
			break;

		}

	}

	// Draw the ship sprite
	while (1)
	{
		if (iShipState == 0)
			hRet = lpBackBuffer->BltFast(iShipPos,380, lpShip, &rcRect, TRUE);
		else
			hRet = lpBackBuffer->BltFast(iShipPos,380, lpShipBoom, &rcRect, TRUE);
		if (hRet == DD_OK)
		{
			break;
		}
		if (hRet == DDERR_SURFACELOST)
		{
			hRet = RestoreSurfaces();
			if (hRet != DD_OK)
				break;
		}
		if (hRet != DDERR_WASSTILLDRAWING)
			break;
	}


	switch (iShipState)
	{
	case SHIP_OK:
		ArgPosX += inc;
		if (ArgPosX == 350 && inc > 0)
		{
			ArgPosX = 0;
			ArgPosY += inc;
			if (ArgPosY == 350)
			{
				ArgPosX=280;
				ArgPosY=280;
				inc = -70;
				return;
			}

		}

		if (ArgPosX == -70 && inc < 0)
		{
			ArgPosX = 280;
			ArgPosY += inc;
			if (ArgPosY == -70)
			{
				inc = 70;
				ArgPosX = 0;
				ArgPosY = 0;
			}
		}
		break;
	case SHIP_EXPLODING:
		ArgPosX += inc;
		if (ArgPosX == 490 && inc > 0)
		{
			ArgPosX = 0;
			ArgPosY += inc;
			if (ArgPosY == 210)
			{

				dwShipExplode = GetTickCount();
				iShipState = SHIP_DESTROYED;
				return;
			}
		}
		break;
	}

	
}

BOOL CheckHit(Ovni* pCheckUfo)
{
	Bullet		*pFirstBullet, *pPrevBullet, *pNextBullet;;

	// Check if we have hitted and UFO
	if (pCheckUfo->isExploding() == TRUE) 
		return FALSE;

	pPrevBullet = NULL;
	pNextBullet = NULL;
	pFirstBullet = pBullet;
	while (pBullet != NULL)
	{
		if ((pBullet->GetX() > pCheckUfo->GetX()    &&
			pBullet->GetX() < pCheckUfo->GetX()+64 &&
			pBullet->GetY() > pCheckUfo->GetY()    &&
			pBullet->GetY() < pCheckUfo->GetY()+56) &&
			(pBullet->GetType() != 1))
		{
			pCheckUfo->LowStr(pBullet->GetPower());
			if (pPrevBullet != NULL)
				pPrevBullet->SetNext( pBullet->GetNext() );
			pNextBullet = pBullet->GetNext();
			if (pNextBullet != NULL)
				pNextBullet->SetPrev(pPrevBullet);
			if (pBullet == pFirstBullet)
				pFirstBullet=pBullet->GetNext();
			DestroyBullet(pBullet);
			delete(pBullet);
			pBullet = pFirstBullet;
				
			if (pCheckUfo->GetStr() <= 0)
			{
				return TRUE;
			}
			else
			{
				score += 1;
				SndObjStop(hsoSelect);
				SndObjPlay(hsoSelect,NULL);
				return FALSE;
			}
		}
		pPrevBullet = pBullet;
		pBullet = pBullet->GetNext();
	}
	pBullet = pFirstBullet;
	return FALSE;
}
		
BOOL CheckCrash(Ovni* pCheck)
{
	// Check if we have creashed in an UFO
	Ovni		*pFirst;
	pFirst = pUFO;
	while(pUFO != NULL)
	{
		if (pUFO->isExploding() == FALSE      &&
			pUFO->GetY() == pCheck->GetY()    &&
			pUFO != pCheck)
		{
			if (pCheck->GetX() < pUFO->GetX())
			{
				if (pUFO->GetX() - pCheck->GetX() <= 70 &&
					(
					(pCheck->GetInc() > 0 && pCheck->iType==0) ||
					(pCheck->GetMov() == 0 && pCheck->iType==2)   )
					)
					return TRUE;
			}
			else
			{
				if (pCheck->GetX() - pUFO->GetX() <= 70 &&
					((pCheck->GetInc() < 0 &&
					pCheck->iType == 0) ||
					(pCheck->GetMov()==1 &&
					pCheck->iType==2))
					)
					return TRUE;
			}
		}
		pUFO = pUFO->GetNext();
	}
	pUFO = pFirst;
	return FALSE;
}

void DrawUfo()
{
	static int					ArgPosY = 0;
	static int					ArgPosX = 0;
	DWORD							delayshoot;
	Ovni*						pFirst, *pNext, *pPrev, *pAux;
	Bullet*						pNewBullet, *pFirstBullet;
	Extra*						pNewExtra,  *pFirstExtra;
    
    pFirst = pUFO;
	
	// draw all the ufos

	pUFO = pFirst;
	pPrev = NULL;
	while(pUFO != NULL)
	{
		
		switch (pUFO->isExploding() )
		{
		case FALSE:
			switch (pUFO->iType)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -