XiaoHui.net 笑汇程序员论坛首页
工作并快乐着,职业并休闲着
寻梦的岁月从不言辛苦几许,
不问收获几多……
» 游客:  申请新用户 | 登录 | 会员 | 统计 | 帮助 » XiaoHui.Net 笑汇程序员论坛 | 纯文字版 | 全站索引 | XiaoHui.com


[算法讨论] 帮忙啊!

RSS 订阅当前论坛  

上一主题 下一主题
     

标题: [算法讨论] 帮忙啊!  
 
pweot17951
小水手
Rank: 1



UID 29739
精华 0
积分 2
帖子 2
阅读权限 10
注册 2007-3-6
来自 广东
状态 离线
帮忙啊!

这个代码在算法上有欠缺,麻烦高手补全!!

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <mmsystem.h>
#include <vector>
#include "client.h"
#include "engine/cl_entity.h"
#include "calcscreen.h"
#include "common/event_api.h"
#include "engine/pmtrace.h"
#include "engine/pm_defs.h"
#include "walkbot.h"

WalkBot wBot;

void DrawHudStringCenter (int x, int y, int r, int g, int b, const char *fmt, ... );

bool wayFree(float* from,float* to)
{
        pmtrace_t tr;
        gEngfuncs.pEventAPI->EV_SetTraceHull( 2 );

        gEngfuncs.pEventAPI->EV_PlayerTrace( from, to, PM_GLASS_IGNORE, me.ent->index, &tr );

        return ( tr.fraction == 1.0 );
}


void WalkBot::addWaypoint(vec3_t input) //添加路点
{
    waypoint wTemp;
    VectorCopy(input,wTemp.origin);
    wPoints.push_back(wTemp);
}

void WalkBot::adjustWaypoint(int ID, float x, float y, float z) //调整路点
{
    wPoints[ID].origin[0] = x;
    wPoints[ID].origin[1] = y;
    wPoints[ID].origin[2] = z;
}

bool WalkBot::wBotMeIsinRadius(int ID) //路点是否在范围内
{
    if ((me.ent->origin[0] <= (wPoints[ID].origin[0] + cvar.walkbot_radius)) &&
        (me.ent->origin[0] >= (wPoints[ID].origin[0] - cvar.walkbot_radius)) &&
        (me.ent->origin[1] <= (wPoints[ID].origin[1] + cvar.walkbot_radius)) &&
        (me.ent->origin[1] >= (wPoints[ID].origin[1] - cvar.walkbot_radius)))
        {
        return true;
    }
    else
        return false;
}

void WalkBot::wBotDraw() //路点样式
{
    float vecScreen[2];
    for (int i = 0;i < wBot.wPoints.size();i++) {
        if (wPoints.visible) {
            if (NewCalcScreen(wBot.wPoints.origin, vecScreen)) {
                if (wBot.wPoints.visible) {
                    DrawHudStringCenter(vecScreen[0]+(cvar.walkbot_draw_w/2), vecScreen[1]-20, 0, 255, 0, "ID: %i",i);
                    gEngfuncs.pfnFillRGBA(vecScreen[0], vecScreen[1], cvar.walkbot_draw_w, cvar.walkbot_draw_h, 0, 255, 0, 255);
                }
                else if (!wBot.wPoints.visible) {
                    DrawHudStringCenter(vecScreen[0]+(cvar.walkbot_draw_w/2), vecScreen[1]-20, 255, 0, 0, "ID: %i",i);
                    gEngfuncs.pfnFillRGBA(vecScreen[0], vecScreen[1], cvar.walkbot_draw_w, cvar.walkbot_draw_h, 255, 0, 0, 255);
                }
            }
        }
    }
}

void WalkBot::wBotVisibility()//路点可见性
{
    for (int i = 0;i < wBot.wPoints.size();i++)
        wBot.wBotCheckVisibility(i);
}


void WalkBot::wBotCheckVisibility(int ID) //检查路点是否可见
{
    vec3_t wTemp, wOutput, forward, right, up;
    VectorCopy(wPoints[ID].origin, wOutput);

    wTemp[0] = 0.0f;
    wTemp[1] = wPoints[ID].origin[1];
    wTemp[2] = 0.0f;

    gEngfuncs.pfnAngleVectors(wTemp, forward, right, up);
    wTemp[2] = -wTemp[2];

    wOutput[0] = wOutput[0] + forward[0] + up[0] + right[0];
    wOutput[1] = wOutput[1] + forward[1] + up[1] + right[1];
    wOutput[2] = wOutput[2] + forward[2] + up[2] + right[2];

    if (wayFree(me.pmEyePos, wOutput))
        wPoints[ID].visible = true;
    else {
        wPoints[ID].visible = false;
        if (target != -1) {
            if (ID == target)
                wBotSelectWaypoint();
        }
    }
}

void WalkBot::wBotSelectWaypoint() //寻点算法
{
    target = oldtarget;

    if (target == -1)
        target = 0;
    else if (target == wPoints.size() - 1) {
        if (wBotMeIsinRadius(target)) //路点是否在范围内
            {
            target = -1;
            
            wBot.onSwitch = false;
        }
    }
    else if (wBotMeIsinRadius(target) && !wPoints[target].hasBeenUsed/*是否已使用*/ && wPoints[target].visible/*是否为有效*/)
     {
        wPoints[target].hasBeenUsed = true;
        target++;
    }
    else if (!wPoints[target].visible) {
        wPoints[target].hasBeenUsed = false;
        target--;
    }

    oldtarget = target;
}






void WalkBot::wBotCalculateAimingSpot() //计算路点瞄准范围
{
    vec3_t wTemp, wTempOutput, forward, right, up;
    VectorCopy(wPoints[target].origin, wTempOutput);

    wTemp[0] = 0.0f;
    wTemp[1] = wPoints[target].origin[1];
    wTemp[2] = 0.0f;

    gEngfuncs.pfnAngleVectors(wTemp, forward, right, up);

    wTempOutput[0] = wTempOutput[0] + forward[0] + up[0] + right[0] - me.pmEyePos[0];
    wTempOutput[1] = wTempOutput[1] + forward[1] + up[1] + right[1] - me.pmEyePos[1];
    wTempOutput[2] = wTempOutput[2] + forward[2] + up[2] + right[2] - me.pmEyePos[2];

    VectorAngles(wTempOutput, wBotAimingSpot);
    wBotAimingSpot[0] = 0.0f;

    if (wBotAimingSpot[1] > 180)
        wBotAimingSpot[1] -= 360;
}
2007-3-6 10:28#1
查看资料  Blog  发短消息  QQ  顶部
     


  可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题  


 


所有时间为 GMT+8, 现在时间是 2008-12-2 03:26 Powered by Discuz! 4.1.0 清除 Cookies - XiaoHui.Net 笑汇程序员论坛 - Archiver