zoukankan      html  css  js  c++  java
  • PacMan开发-碰撞检测实现

    在游戏如何让程序知道物体在撞墙?

    可通过无题所在点的位置和墙体边缘的位置进行检测。

    计算方法是:用中心坐标和朝向所对应的墙的位置与物体的宽度进行比较,若是大于宽度,则没有碰上。

    将地图分为若干个小的正方形格子,物体到每一个格子后进行碰撞检测。

    碰撞检测函数是在"GObject.h"的Collision()函数中,这是一个bool型函数。

    bool GObject::Collision()
    {
    	bool b = false;
    	AchiveCtrl();//更新行列的数据
    	if (dArray<0 || dRow<0 || dArray>MAPLENTH || dRow>MAPLENTH)
    	{
    		b = true;
    	}
    	else if (Achive())
    	{
    		switch (twCommand)
    		{
    		case LEFT:
    			if (dArray > 0 && !pStage->mapData[dRow][dArray - 1])
    			{
    				b = true;
    			}
    			break;
    		case RIGHT:
    			if (dArray < MAPLENTH - 1 && !pStage->mapData[dRow][dArray + 1])
    			{
    				b = true;
    			}
    			break;
    		case UP:
    			if (dRow>0 && !pStage->mapData[dRow - 1][dArray])
    			{
    				b = true;
    			}
    			break;
    		case DOWN:
    			if (dRow < MAPLENTH - 1 && !pStage->mapData[dRow + 1][dArray])
    			{
    				b = true;
    			}
    			break;
    		}
    		if (!b)
    		{
    			tw = twCommand;//没撞墙,指令成功
    		}
    	}
    	mX = point.x;
    	mY = point.y;
    	int MAX = pStage->LD*MAPLENTH + pStage->LD / 2;
    	int MIN = pStage->LD / 2;
    	switch (tw)
    	{
    	case LEFT:
    		if (dArray > 0 && !pStage->mapData[dRow][dArray - 1])
    		{
    			b = true;//撞墙了
    			break;
    		}
    		if (point.x < MIN)
    		{
    			point.x = MAX;
    		}
    		point.x -= speed;
    		break;
    	case RIGHT:
    		if (dArray < MAPLENTH - 1 && !pStage->mapData[dRow][dArray + 1])
    		{
    			b = true;//撞墙了
    			break;
    		}
    		point.x += speed;
    		if (point.x >MAX)
    		{
    			point.x = MIN;
    		}
    		break;
    	case UP:
    		if (dRow>0 && !pStage->mapData[dRow - 1][dArray])
    		{
    			b = true;//撞墙了
    			break;
    		}
    		if (point.y < MIN)
    		{
    			point.y = MAX;
    		}
    		point.y -= speed;
    		break;
    	case DOWN:
    		if (dRow < MAPLENTH - 1 && !pStage->mapData[dRow + 1][dArray])
    		{
    			b = true;
    			break;
    		}
    		point.y += speed;
    		if (point.y >MAX)
    		{
    			point.y = MIN;
    		}
    		break;
    	}
    	return b;
    }

    @ Mayuko

  • 相关阅读:
    Android学习笔记——Menu(三)
    Android学习笔记——Menu(二)
    Android学习笔记——Menu(一)
    Python学习笔记(三)——迭代
    Python学习笔记(二)——高级特性
    Python学习笔记(一)——基本知识点
    Java中遍历Map的常用方法
    比较Java中几个常用集合添加元素的效率
    Java计算两个程序运行时间
    Java中的并发编程集合使用
  • 原文地址:https://www.cnblogs.com/mayuko/p/4567514.html
Copyright © 2011-2022 走看看