void CText2D::Render(float _posX, float _posY)
{
	__INT32 posX = __INT32 (_posX);
	__INT32 posY = __INT32 (_posY);
	for(int i = 0; i < strlen(m_strText); i++) 
	{
		SCharMap* map = m_CharMap->GetMap(m_strText[i]);
		if(map != NULL)
		{
			SRect<__INT32> border(posX, posY, 30, 30);
			SRect<__INT32> texCoord(map->x, map->y, map->w, map->h);
			g->DrawImageRegion(border, texCoord, m_img);
			posX += 30;
		}
	}
}
Exemplo n.º 2
0
void MapObject::OnControllerEvent(SControllerEvent Event)
{
	float ax,ay,az,aw;
	Matrix MVP;
	int mx=0;
	int my=0;
	float fx=0;
	float fy=0;
	__INT32 distance=0;
	TowerObject* tower;
	if (Event.Type == ECE_POINTER)
	{
		switch (Event.PointerData.Event)
		{
		case EPE_PRESSED:
			isPressed = true;
			dragDistanceX = 0;
			dragDistanceY = 0;
			break;
		case EPE_DRAGGED:
			distance= dragDistanceX*dragDistanceX + dragDistanceY*dragDistanceY;
			if (distance>50) isDrag=true;
			break;
		case EPE_RELEASED:
			
			if (isPressed)
			{			
				MVP.LoadIdentity();
				MVP.Multiply(*(CCamera3D::GetInstance()->GetProjectMatrix()));
				MVP.Multiply(*(CCamera3D::GetInstance()->GetViewMatrix()));

				ScreenPos2MapPos(Event.PointerData.X,Event.PointerData.Y,MVP,fx,fy);
				mx = __INT32(fx/scale);
				my = __INT32(fy/scale);
				if ((!isDrag)/* && ((mLogicMap[my*mWidth+mx]==OBJECT_NONE) || (mLogicMap[my*mWidth+mx]==OBJECT_TOWER))*/)
				{
					if (mx>=0 && mx<mWidth &&my>=0 && my<mHeight)
					{

						if (mLogicMap[my*mWidth+mx]==OBJECT_NONE) //click len vung dat trong'
						{
							ScreenPos2TowerPos(Event.PointerData.X,Event.PointerData.Y,MVP,mx,my);

							Log("Logic map position: %d %d", mx, my);
							if ((mx<mWidth) && (my<mHeight) && (mx>=0) && (my>=0))
							{
								if (selected == my * mWidth + mx)
								{
									selected =-1;
									drawRange = 0;
									CList<__INT32> NullList;
									UpdateTowerBuildBar(&NullList);
									return;									
								}

								selected = my * mWidth + mx;
								if ((mLogicMap[selected]==OBJECT_NONE) && 
									(mLogicMap[selected+1]==OBJECT_NONE) && 
									(mLogicMap[selected+mWidth]==OBJECT_NONE) && 
									(mLogicMap[selected+mWidth+1]==OBJECT_NONE) &&
									CPathManagement::GetInstance()->IsStillExist(selected))	//Vung dat 2x2 trong'
								{
									CStateIngame::currentBuildBar->sellButton->SetVisible(false);
									//kiem tra so button xay tru can hien
									CStateIngame::currentBuildBar->Tower1->SetVisible(true);

									Log("Truoc calc boundary");
									CalculateBoundary(mx, my, SELECTED_BUILDABLE_CELL_COLOR,0);
									Log("Sau calc boundary");
									CList<__INT32> towerList;//sau nay de thong tin cac tower co the xay tu dat' trong vao day
									towerList.AddItem(TOWER_GUN);
									UpdateTowerBuildBar(&towerList);
								}
								else	//2x2 khong trong'
								{
									CStateIngame::currentBuildBar->sellButton->SetVisible(false);
									CalculateBoundary(mx, my, SELECTED_UNBUILDABLE_CELL_COLOR,0);
									//an het cac button xay tru
									CStateIngame::currentBuildBar->Tower1->SetVisible(false);
									CStateIngame::currentBuildBar->Tower2->SetVisible(false);
									CStateIngame::currentBuildBar->Tower3->SetVisible(false);
									CStateIngame::currentBuildBar->Tower4->SetVisible(false);
								}
							}
						}
						else if(mLogicMap[my*mWidth+mx]==OBJECT_TOWER)//click len TOWER
						{
							CStateIngame::currentBuildBar->sellButton->SetVisible(true);
							tower = (CObjectManagement::GetInstance()->GetTower(MapPosition(mx,my)));
							if (!tower) 
								tower = (CObjectManagement::GetInstance()->GetTower(MapPosition(mx-1,my)));
							if (!tower) 
								tower = (CObjectManagement::GetInstance()->GetTower(MapPosition(mx-1,my-1)));
							if (!tower) 
								tower = (CObjectManagement::GetInstance()->GetTower(MapPosition(mx,my-1)));


							if (selected == tower->mPosition.mY * mWidth + tower->mPosition.mX)
								{
									selected =-1;
									drawRange = 0;
									CList<__INT32> NullList;
									UpdateTowerBuildBar(&NullList);
									return;									
								}
							selected = tower->mPosition.mY * mWidth + tower->mPosition.mX;
							CalculateBoundary( tower->mPosition.mX, tower->mPosition.mY, SELECTED_TOWER_CELL_COLOR, tower->mProperties->mRange);
						
							UpdateTowerBuildBar(tower->mProperties->mLstChildren);
						}
						else //click len Enemy hoac tree
						{
							CStateIngame::currentBuildBar->sellButton->SetVisible(false);
							ScreenPos2TowerPos(Event.PointerData.X,Event.PointerData.Y,MVP,mx,my);
							CalculateBoundary(mx, my, SELECTED_UNBUILDABLE_CELL_COLOR,0);
							//an het cac button xay tru
							CStateIngame::currentBuildBar->Tower1->SetVisible(false);
							CStateIngame::currentBuildBar->Tower2->SetVisible(false);
							CStateIngame::currentBuildBar->Tower3->SetVisible(false);
							CStateIngame::currentBuildBar->Tower4->SetVisible(false);
						}
					}
					else
						selected = -1;
				}
				isPressed = false;

			}

			isDrag = false;
			break;
		}
	}

	

}
Exemplo n.º 3
0
	void CSprite::UpdateAnimation(__UINT32 dt)
	{
		if (m_isEndOfAnimtion) 
		{
			m_iElapsedTime = 0;
			return;
		}

		m_isEndOfAnimtion = true;
		if (m_pCurrentAnimation)
		{
			//Log("m_iElapsedTime %d", m_iElapsedTime);
			// calculate frame number
			m_iElapsedTime += dt;
			int frameNo = __INT32((m_iElapsedTime*m_iFps)/1000);
			//Log("%d m_iElapsedTime %d frNo %d",dt, __INT32(m_iElapsedTime), frameNo);

			// if move to new frame
			m_isEndOfAnimtion = false;
			if (frameNo != m_iCurrentFrameNo)
			{
				m_isEndOfAnimtion = true;
				m_iCurrentFrameNo = frameNo;
				// find suitable key frame
				if (m_pCurrentAnimation->KeyFrameList)
				{
					m_pCurrentAnimation->KeyFrameList->BeginTravel();
					int nf = 0;
					while (!m_pCurrentAnimation->KeyFrameList->IsEndOfTravel())
					{
						SSpriteDBAnimKeyFrame* kf = m_pCurrentAnimation->KeyFrameList->Travel();
						nf += kf->Loop;
						if (nf > m_iCurrentAnimTotalFrame) {m_iCurrentAnimTotalFrame = nf;}

						//Log("nf %d %d",nf, m_iCurrentFrameNo);
						// if found
						if (nf > m_iCurrentFrameNo)
						{
							m_isEndOfAnimtion = false;

							//check if new KF
							if (m_pCurrentKeyFrame != kf)
							{
								m_pCurrentKeyFrame = kf;
								m_pCurrentFrame = 0;
								//link from KF to Frame
								if (m_pCurrentKeyFrame)
								{
									int frameID = m_pCurrentKeyFrame->FrameID;
									m_SpriteData->m_Frames.BeginTravel();
									while (!m_SpriteData->m_Frames.IsEndOfTravel())
									{
										SSpriteDBFrame *frame = m_SpriteData->m_Frames.Travel();
										if(frame && frame->ID == frameID)
										{
											m_pCurrentFrame = frame;
											//link to Bitmap if any
											m_pCurrentBitmap = 0;
											if (m_pCurrentFrame && m_pCurrentFrame->Type == ESPRFRAME_TYPE_RECT_IMG)
											{
												m_SpriteData->m_Bitmaps.BeginTravel();
												while(!m_SpriteData->m_Bitmaps.IsEndOfTravel())
												{
													SSpriteDBBitmap *bitmap = m_SpriteData->m_Bitmaps.Travel();
													if (bitmap && bitmap->ID == m_pCurrentFrame->RectImgFrame.ImgID)
													{
														m_pCurrentBitmap = bitmap;
													}
												}
											}
											break;
										}
									}
								}
							}						
							break;
						}//if (nf > m_iCurrentFrameNo)
					}//while (!m_pCurrentAnimation->KeyFrameList->IsEndOfTravel())
				}//if (m_pCurrentAnimation->KeyFrameList)
			}//if (frameNo != m_iCurrentFrameNo)

			//Log("m_isEndOfAnimtion %d", m_isEndOfAnimtion);
			if (m_isEndOfAnimtion)
			{
				if (m_iLoopCounter != 0)
				{
					if (m_iLoopCounter > 0) m_iLoopCounter--;
					m_iElapsedTime = Math_Min<__UINT64>(m_iElapsedTime - m_iCurrentAnimTotalFrame*m_iFps, 0);
					m_iCurrentFrameNo = -1;
					m_isEndOfAnimtion = false;
				}
			}
		}//if (m_pCurrentAnimation)
	}