LEVELS.CPP
上传用户:abcdshs
上传日期:2007-01-07
资源大小:1858k
文件大小:6k
源码类别:

游戏

开发平台:

Visual C++

  1. // (C) Copyright 1996 by Anthony J. Carin.  All Rights Reserved.
  2. #include "stdafx.h"
  3. #include "levels.h"
  4. #include <io.h>
  5. #include <fcntl.h>
  6. #include <sys/stat.h>
  7. const short mincamdist = VIEWRANGE/4;
  8. const short maxcamdist = VIEWRANGE/2;
  9. static void getnew(CString& path, short level, CString& filename);
  10. levels::levels()
  11. {
  12.     Game->SetLevelNum(1);
  13.     if (Game->Hero()->gender() == MALE)
  14.         guy = new dude(Game->Hero());
  15.     else
  16.         guy = new girl(Game->Hero());
  17.     Game->DrawQueue()->add(guy);
  18.     coordinate tmp(0.0f,0.0f,0.0f);
  19.     guy->setto((view) tmp);
  20.     camdist = mincamdist;
  21.     camrise = 0.0f;
  22.     camangle = 0;
  23.     camstep = 0.05f;
  24.     camrstep = 0.02f;
  25.     usercontrol = new control(guy);
  26.     tmp.setto(0.0f,15.0f,0.0f);
  27.     camera.stepto(tmp,15.0f);
  28.     mcompleted = FALSE;
  29. #ifdef EDITOR
  30.     selection = 0;
  31.     selectionstep = 1.0f;
  32.     selectioncolor = RGB(250,250,250);
  33. #endif
  34. }
  35. levels::~levels()
  36. {
  37.     delete usercontrol;
  38. }
  39. void levels::draw()
  40. {
  41.     Game->DrawQueue()->run();
  42. #ifdef EDITOR
  43.     if (selection)
  44.     {
  45.         selection->setcolor(RGB(random(256), random(256), random(256)));
  46.     }
  47. #endif
  48.     usercontrol->issuecommands();
  49.     if (!Game->Motionless() && guy->isdead())
  50.     {
  51.         Game->NowMotionless();
  52.         usercontrol->falldown();
  53.     }
  54.     runcamera();
  55. }
  56. void levels::runcamera()
  57. {
  58.     float tmpval = 0.0f;
  59.     switch (Game->Viewmode())
  60.     {
  61.     case CIRCLING:
  62.        camangle = camangle + (direction) 1;
  63.        nextcam.setx(guy->location().x()+tcsin(camangle,camdist));
  64.        nextcam.setz(guy->location().z()+tccos(camangle,camdist));
  65.        nextcam.sety(guy->location().y()+camrise);
  66.        camdist += camstep;
  67.        camrise += camrstep;
  68.        if (camrise > 10.0f)
  69.            camrstep = (float)-fabs(camrstep);
  70.        if (camrise < 2.0f)
  71.            camrstep = (float)fabs(camrstep);
  72.        if (camdist > maxcamdist)
  73.            camstep = (float)-fabs(camstep);
  74.        if (camdist < mincamdist)
  75.            camstep = (float)fabs(camstep);
  76.        camera.stepto(nextcam, .1f, FALSE);
  77.        break;
  78.     case DUDEVIEW:
  79.     case DUDEVIEWHIGH:
  80.     case DUDEVIEWLOW:
  81.        switch (Game->Viewmode())
  82.        {
  83.        case DUDEVIEW:
  84.            camrise = 0.0f;
  85.            break;
  86.        case DUDEVIEWHIGH:
  87.            camrise = -1.4f;
  88.            break;
  89.        case DUDEVIEWLOW:
  90.            camrise = 1.4f;
  91.            break;
  92.        }
  93.        camdist = 3.0f;
  94.        nextcam.setx(guy->location().x()+tcsin(guy->location().ydirection(),-3.0f));
  95.        nextcam.setz(guy->location().z()+tccos(guy->location().ydirection(),-3.0f));
  96.        nextcam.sety(guy->location().y()+camrise);
  97.        camera.stepto(nextcam, .4f, FALSE);
  98.        break;
  99.     case AERIAL:
  100. #ifdef EDITOR
  101.        camrise = 10.0f;
  102. #else
  103.        camrise = 4.0f;
  104. #endif
  105.        camdist = 3.0f;
  106.        nextcam.setx(guy->location().x()+tcsin(guy->location().ydirection(),-1.3f));
  107.        nextcam.setz(guy->location().z()+tccos(guy->location().ydirection(),-1.3f));
  108.        nextcam.sety(guy->location().y()+camrise);
  109.        camera.stepto(nextcam, .3f, FALSE);
  110.        break;
  111.     case HIGHANGLE:
  112.        camrise = 2.0f;
  113.        camangle = camangle + (direction) 1;
  114.        nextcam.setx(guy->location().x()+tcsin(camangle,camdist));
  115.        nextcam.setz(guy->location().z()+tccos(camangle,camdist));
  116.        nextcam.sety(guy->location().y()+camrise);
  117.        camdist += camstep;
  118.        if (camdist > maxcamdist)
  119.            camstep = (float)-fabs(camstep);
  120.        if (camdist < mincamdist)
  121.            camstep = (float)fabs(camstep);
  122.        camera.stepto(nextcam, .5f, FALSE);
  123.        break;
  124.     case RIGHTSIDE:
  125.        tmpval = 3.5f;
  126.        camdist += camstep;
  127.        if (camdist > maxcamdist)
  128.            camstep = (float)-fabs(camstep);
  129.        if (camdist < mincamdist)
  130.            camstep = (float)fabs(camstep);
  131.        nextcam.setx(guy->location().x()-camdist);
  132.        nextcam.setz(guy->location().z());
  133.        nextcam.sety(guy->location().y()+tmpval);
  134.        camera.stepto(nextcam, .5f, FALSE);
  135.        break;
  136.     case LEFTSIDE:
  137.        tmpval = 3.5f;
  138.        camdist += camstep;
  139.        if (camdist > maxcamdist)
  140.            camstep = (float)-fabs(camstep);
  141.        if (camdist < mincamdist)
  142.            camstep = (float)fabs(camstep);
  143.        nextcam.setx(guy->location().x()+camdist);
  144.        nextcam.setz(guy->location().z());
  145.        nextcam.sety(guy->location().y()+tmpval);
  146.        camera.stepto(nextcam, .5f, FALSE);
  147.        break;
  148.     case FRONTSIDE:
  149.        tmpval = 3.5f;
  150.        camdist += camstep;
  151.        if (camdist > maxcamdist)
  152.            camstep = (float)-fabs(camstep);
  153.        if (camdist < mincamdist)
  154.            camstep = (float)fabs(camstep);
  155.        nextcam.setx(guy->location().x());
  156.        nextcam.setz(guy->location().z()+camdist);
  157.        nextcam.sety(guy->location().y()+tmpval);
  158.        camera.stepto(nextcam, .5f, FALSE);
  159.        break;
  160.     case BACKSIDE:
  161.        tmpval = 3.5f;
  162.        camdist += camstep;
  163.        if (camdist > maxcamdist)
  164.            camstep = (float)-fabs(camstep);
  165.        if (camdist < mincamdist)
  166.            camstep = (float)fabs(camstep);
  167.        nextcam.setx(guy->location().x());
  168.        nextcam.setz(guy->location().z()-camdist);
  169.        nextcam.sety(guy->location().y()+tmpval);
  170.        camera.stepto(nextcam, .5f, FALSE);
  171.        break;
  172.     }
  173.     Game->Aim() = guy->location();
  174. }
  175. char exist(LPCTSTR path)
  176. {
  177.     FILE *fp = fopen(path, "r");
  178.     if (fp <= 0)
  179.         return FALSE;
  180.     fclose(fp);
  181.     return TRUE;
  182. }
  183. static void getnew(CString& path, short level, CString& filename)
  184. {
  185.     char tmpbuf[7];
  186.     if (level == 0)
  187.     {
  188.         path = "dudes";
  189.     }
  190.     else
  191.     {
  192.         sprintf(tmpbuf, "%d", level);
  193.         path = "level";
  194.         path += tmpbuf;
  195.     }
  196.     path += '\';
  197.     path += filename;
  198.     if (!exist((LPCTSTR)path) && level > 0)
  199.         getnew(path, --level, filename);
  200. }
  201. CString& getpath(CString& filename)
  202. {
  203.     static CString path;
  204.     getnew(path, Game->LevelNum(), filename);
  205.     return path;
  206. }