C++ 平台成型器(如mario bros)的碰撞不起作用

C++ 平台成型器(如mario bros)的碰撞不起作用,c++,list,collision-detection,C++,List,Collision Detection,我已经在这里坐了好几个小时了,想弄清楚碰撞是如何对平板电脑起作用的。。在做了大量的研究之后,我在互联网上发现了一些有用的东西。。但它还不起作用:/ 我的角色似乎跳了一次。。然后被困在离地面不远的地方 这是我从txt加载平台的函数(通过调用setupworld) 在我的txt文件中,我定义了xstart(平台开始的地方)xend(平台结束)ystart(平台底部)2个未使用的变量和纹理过滤器(0-4 atm) 然后,通过在x方向重复2x2个平铺来创建每个平台 numblocks=平台数量(sry表

我已经在这里坐了好几个小时了,想弄清楚碰撞是如何对平板电脑起作用的。。在做了大量的研究之后,我在互联网上发现了一些有用的东西。。但它还不起作用:/ 我的角色似乎跳了一次。。然后被困在离地面不远的地方

这是我从txt加载平台的函数(通过调用setupworld) 在我的txt文件中,我定义了xstart(平台开始的地方)xend(平台结束)ystart(平台底部)2个未使用的变量和纹理过滤器(0-4 atm)

然后,通过在x方向重复2x2个平铺来创建每个平台 numblocks=平台数量(sry表示错误变量名^^) 块的数量是通过取平台的结束坐标-开始坐标并除以2.0来计算的(我的平台的坐标总是可以除以2..,比如..0-16..或..8-16..)

如你所见。。结构块是所有数据保存到setupworld()中的位置,它与显示的平铺数量无关。。我的怪名字又来了


{


最后是检查冲突的代码

用于检查x的inPlatformx

是否正在检查平台左右两侧之间的角色 ->函数返回TRUE并写入collisionx

用于检查y的inPlatformy

同样适用于inPlatformy


bool-inPlatformx(浮点xpo、块块、int-i){
返回xpos>block.data[i].xstart&&
xposblock.data[i].ystart&&
ypos<(区块数据[i].ystart+0.2);
}
GLvoid DetectCollision(){

对于(int i=0;i除非我没有正确地跟随你的代码,否则一旦你到达跳跃的顶点并将你的
locky
设置为
!locky
,你就会开始敲击你的
else
语句,它从不检查碰撞。如果你在x或-x方向移动,你可能想这样做,因为地面可能不在同一方向上和你跳的起点相同的地方

此外,您的锁定检查是检查
ypos>=5.0f
,如果您已经在游戏世界的某个部分处于5.0标记以上,则会立即出现这种情况。您可能希望这是一个变量,例如
limitY=ypos+5.0f;
,然后检查
ypos>=limitY
,因此它可以不考虑来源。

至于您现在看到的问题,调试和查看y坐标的当前值应该很容易,并查看是否有任何明显的原因(例如没有执行最终的
ypos-=0.2f
)导致您在跳跃后稍微浮在地面上。(我看不出您编写代码的方式有明显的错误,尽管我不会按照您自己的方式设计代码。)


如果您正在为Windows开发此程序,您可能需要研究XNA开发,它使碰撞检测和解决变得更加容易。

除非我没有正确地遵循您的代码,否则,一旦您达到跳转的顶点并将
locky
设置为
!locky
,您就会开始点击
else
语句,这会导致永远不要检查碰撞。如果你在x或-x方向移动,你可能想这样做,因为地面可能不在跳跃原点的同一位置

此外,您的锁定检查是检查
ypos>=5.0f
,如果您已经在游戏世界的某个部分处于5.0标记以上,则会立即出现这种情况。您可能希望这是一个变量,例如
limitY=ypos+5.0f;
,然后检查
ypos>=limitY
,因此它可以不考虑来源。

至于您现在看到的问题,调试和查看y坐标的当前值应该很容易,并查看是否有任何明显的原因(例如没有执行最终的
ypos-=0.2f
)导致您在跳跃后稍微浮在地面上。(我看不出您编写代码的方式有明显的错误,尽管我不会按照您自己的方式设计代码。)


如果您是为Windows开发此程序,您可能需要研究XNA开发,它使冲突检测和解决变得更加容易。

您是否将locky初始化为true或false?因为我看到的所有代码都会反转locky的状态,因此根据输入的处理方式,locky值会翻转每个循环或可能性与你的期望不同步


我建议您在显示的代码中显式地将locky设置为true和false,而不是使用locky=!locky,这样可以更清楚地了解系统的状态。

您是否将locky初始化为true或false?因为我看到的所有代码都会反转locky的状态,因此根据输入的处理方式,您的locky值会翻转每一个循环或可能与您的期望不同步


我建议在您所展示的代码中明确地将locky设置为true和false,而不是使用locky=!locky,这样可以更清楚地了解系统的状态。

+1:但是XNA只适用于C,我没有发现它比其他可用引擎甚至我自己的Direct3D包装器好多少。我编辑了一些内容,但我仍然不确定它是什么这是错误的。我发布了最后的更改。我有什么错误吗。整个跳跃的事情完全令人困惑。有什么建议吗?:我是sry,但我想每个初学者都有自己的问题。当我提醒自己我上周末开始的时候,我为我迄今为止所做的一切感到非常自豪。你的DetectCollision()调用被注释掉了,所以这是你更新的第一个问题:)你的逻辑在你试图做的事情上仍然是不正确的。我建议你还是老一套。拿出纸和笔,浏览你的代码,手动更新你的变量,看看
GLvoid BuildLists()
texture[0]=LoadPNG("data/grass.png");
texture[1]=LoadPNG("data/gnd.png");
texture[2]=LoadPNG("data/pilz_test.png");
texture[3]=LoadPNG("data/rockwall.png");
texture[4]=LoadPNG("data/crate.png");
setupworld();
quad[0]=glGenLists(numblocks);

for(int loop=0;loop<numblocks;loop++)
{
    GLfloat xstart,xend,ystart,u,v,u2,v2;
    xstart=block.data[loop].xstart;
    xend=block.data[loop].xend;
    ystart=block.data[loop].ystart;
    //u=block.data[loop].u;
    //v=block.data[loop].v;
    GLuint filter=block.data[loop].filter;
    GLfloat blocks=(xend-xstart)/2.0f;

    u=0.0f;
    v=0.0f;
    u2=1.0f*blocks;
    v2=1.0f;

    glNewList(quad[loop],GL_COMPILE);
    glBindTexture(GL_TEXTURE_2D, texture[filter]);
                                    // Start Drawing Quads
        for(int y=0;y<blocks;y++)
        {
            glBegin(GL_QUADS);
                glTexCoord2f(u,v);
                glVertex3f(xstart,ystart,-1.0f);
                glTexCoord2f(u2,v);
                glVertex3f(xstart+((y+1)*2.0f),ystart,-1.0f);
                glTexCoord2f(u2,v2);
                glVertex3f(xstart+((y+1)*2.0f),ystart+2.0f,-1.0f);
                glTexCoord2f(u,v2);
                glVertex3f(xstart,ystart+2.0f,-1.0f);
            glEnd();                                
        }

    glEndList();
    quad[loop+1]=quad[loop]+1;
}
if (active)                     // Program Active?
        {
            if (keys[VK_ESCAPE])                
            {
                done=TRUE;              
                glDeleteTextures(1,&texture[0]);
                glDeleteTextures(1,&texture[2]);
                glDeleteTextures(1,&texture[1]);
            }
            if (keys['W'])
            {
                if(!locky)
                {   
                    DetectCollision();
                    ypos2=ypos;
                    ypos=ypos+0.2f;
                    if(ypos>=5.0f)
                    {
                        locky=!locky;
                    }
                    if(collisiony)
                    {
                        ypos=ypos2;
                        locky=!locky;
                    }
                }
                else
                {
                    if(ypos>0.0f && !collisiony)
                    {
                        ypos=ypos-0.2f;
                    }
                }
            }
            if (!keys['W'])
            {
                locky=!locky;
                if(ypos>0.0f && !collisiony)
                {
                    ypos=ypos-0.2f;
                }
            }
            if (keys['A'])
            {
                    if(xpos>0.0f && !collisionx)
                    {
                        xpos=xpos-0.2f;
                    }
            }
            if (keys['D'])
            {       
                    if(xpos< 50.0f && !collisionx)
                    {
                        xpos=xpos+0.2f;
                        xcam=xcam-0.1f;
                    }
            }
            glLoadIdentity();
            glTranslatef(0,-7.0f,-25.0f);
                SwapBuffers(hDC);           

            }
bool inPlatformx(float xpos, BLOCK block, int i){
    return   xpos > block.data[i].xstart &&
             xpos < block.data[i].xend;}
bool inPlatformy(float ypos, BLOCK block, int i){
    return   ypos > block.data[i].ystart &&
             ypos < (block.data[i].ystart+0.2); 
    }
GLvoid DetectCollision(){
for(int i=0; i<numblocks;i++)
{
    collisionx=inPlatformx(xpos,block,i);
    collisiony=inPlatformy(ypos,block,i);

}
                            if (keys['W'])
            {
                //DetectCollision();
                if(!locky)
                {   
                    ypos2=ypos;
                    ypos=ypos+0.2f;
                    if(ypos>=5.0f)
                    {
                        locky=!locky;
                    }
                    if(collisiony)
                    {
                        ypos=ypos2;
                        locky=!locky;
                    }
                }
                else
                {
                    if(ypos>0.0f)
                    {
                        ypos=ypos-0.2f;
                    }
                }
            }
            if (!keys['W'])
            {
                locky=!locky;
                if(ypos>0.0f && !collisiony)
                {
                    ypos=ypos-0.2f;
                }
            }
                            if (keys['A'])
            {
                    //DetectCollision();
                    if(xpos>0.0f && !collisionx)
                    {
                        xpos2=xpos;
                        xpos=xpos-0.2f;
                    }
                    if(collisionx)
                    {
                        xpos=xpos2;
                    }
            }
            if (keys['D'])
            {       
                    //DetectCollision();
                    if(xpos< 50.0f && !collisionx)
                    {
                        xpos2=xpos;
                        xpos=xpos+0.2f;
                        xcam=xcam-0.1f;
                    }
                        if(collisionx)
                    {
                        xpos=xpos2;
                    }
            }