亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? player.cpp

?? Demo Source for a doom like engine using raycasting and voxel
?? CPP
字號:
#include "ray.h"
#include "globals.h"
#include "rayspr.h"
#include "rayfile.h"
#include "sprfunc.h"
#include "sfvars.h"
#include "defobj.h"
#include "playint.h"
#include "keyinfo.h"
#include "sprtypes.h"
#include "voxinter.h"
#include "message.h"
#include "classes.h"
#include "quit.h"
#include "inventor.h"
#include "tags.h"
#include "shot.h"

#define GUN_HEIGHT cur_obj->type->eye_height-20
#define MAX_TIME_TO_GUN 5
#define MAX_FALL_PER_UPDATE 8
#define NO_INPUT 0

short default_input[MAX_TRACKED_INPUTS]={0,0,0,0,0,0,0};
PSHORT cur_input_buffer=default_input;

typedef struct PLAYER_INFO * pplayer_info;
typedef struct PLAYER_INFO {
   PSHORT input_buffer;
   SHORT tracked_inputs[MAX_TRACKED_INPUTS];
   BOOL fly_mode;
   MYFIXED base_fixed_z, cur_fixed_z;
   angle_type z_move_angle;
   SHORT dis_to_fall;
   LONG time_to_gun;
   angle_type vert_angle;
   pobject_node inventory;
} player_info;

void Setup_Player_Inputs(pplayer_info cur_extra);
void Player_Update(pobject cur_obj, long update_num);
void Player_Update_Z(pobject cur_obj, psector new_sec);
void Player_Load(pobject cur_obj, long offset);
void Z_Correct_Move(pobject cur_obj);
void Reset_Player_Z(pplayer_info cur_extra);
pobject Scan_Inventory(pobject_node inventory, ULONG search_class);
ULONG Player_Message(pobject send_obj, pobject receive_obj, ULONG message, pdata extra_data);

void Init_Player_Obj(func_index index)
{
update_funcs[index]=Player_Update;
update_z_funcs[index]=Player_Update_Z;
load_extra_funcs[index]=Player_Load;
message_funcs[index]=Player_Message;
}

void Player_Load(pobject cur_obj, long offset)
{

   pplayer_info new_info;
   new_info=(pplayer_info)NewPtr(sizeof(player_info));

   for (short cur_input=0; cur_input < MAX_TRACKED_INPUTS; cur_input++) {
      new_info->tracked_inputs[cur_input]=0;
   }
   new_info->fly_mode=FALSE;
   new_info->base_fixed_z=cur_obj->z << SHIFT;
   new_info->cur_fixed_z=new_info->base_fixed_z;
   new_info->z_move_angle=ANGLE_0;
   new_info->dis_to_fall=0;
   new_info->input_buffer=cur_input_buffer;
   new_info->vert_angle=ANGLE_0;
   new_info->inventory=NULL;
   cur_obj->extra_data=new_info;
 
}

void Player_Update_Z(pobject cur_obj, psector new_sec)
{
   pplayer_info cur_extra=(pplayer_info)cur_obj->extra_data;
   short height_dif;

   if (!(new_sec->flags & VOXEL_SECTOR)) {
      height_dif=cur_obj->cur_sec->floor_height-new_sec->floor_height;
   } else {
      height_dif=cur_obj->cur_sec->floor_height-
        Get_Voxel_Alt((PUCHAR)new_sec->extra_data, cur_obj->x, cur_obj->y);
   }

   // if in fly mode, changing sectors has no effect on overall z, so we must alter
   // z for difference in floor height
   if (cur_extra->fly_mode) {
      cur_obj->z+=height_dif;
      cur_extra->base_fixed_z=cur_obj->z<<SHIFT;
      cur_extra->cur_fixed_z=cur_extra->base_fixed_z;
   } else {
      if (height_dif>0) {
         cur_obj->z+=height_dif;
         cur_extra->base_fixed_z+=(height_dif<<SHIFT);
         cur_extra->cur_fixed_z+=(height_dif<<SHIFT);
         cur_extra->dis_to_fall+=height_dif;
      } else {
         if (cur_extra->dis_to_fall>0) {
           cur_obj->z-=cur_extra->dis_to_fall;
           cur_extra->base_fixed_z-=(cur_extra->dis_to_fall << SHIFT);
           cur_extra->cur_fixed_z-=(cur_extra->dis_to_fall << SHIFT);
           cur_extra->dis_to_fall=0;
         }
      }
   } /* endif */
}

void Player_Update(pobject cur_obj, long update_num) {
     MYFIXED dx, dy;
     vector2 delta_vec;
     SHORT amount_up, amount_down, amount_left, amount_right, amount_look_up, 
        amount_look_down, raw_input, gun_shot;

     pplayer_info cur_extra=(pplayer_info)cur_obj->extra_data;
     Setup_Player_Inputs(cur_extra);     
     amount_up=cur_extra->tracked_inputs[INDEX_UP];
     amount_down=cur_extra->tracked_inputs[INDEX_DOWN];
     amount_left=cur_extra->tracked_inputs[INDEX_LEFT];
     amount_right=cur_extra->tracked_inputs[INDEX_RIGHT];
     amount_look_up=cur_extra->tracked_inputs[LOOK_UP];
     amount_look_down=cur_extra->tracked_inputs[LOOK_DOWN];
     gun_shot=cur_extra->tracked_inputs[INDEX_GUN];
     raw_input=cur_extra->tracked_inputs[RAW_INPUT];

     cur_extra->time_to_gun--;
     // do gravity for sector change
     if (cur_extra->dis_to_fall>0) {
        if (cur_extra->dis_to_fall>MAX_FALL_PER_UPDATE) {
           cur_extra->dis_to_fall-=MAX_FALL_PER_UPDATE;
           cur_obj->z-=MAX_FALL_PER_UPDATE;
           cur_extra->base_fixed_z-=(MAX_FALL_PER_UPDATE << SHIFT);
           cur_extra->cur_fixed_z-=(MAX_FALL_PER_UPDATE << SHIFT);
        } else {
           cur_obj->z-=cur_extra->dis_to_fall;
           cur_extra->base_fixed_z-=(cur_extra->dis_to_fall << SHIFT);
           cur_extra->cur_fixed_z-=(cur_extra->dis_to_fall << SHIFT);
           cur_extra->dis_to_fall=0;
        }
     }

        // reset deltas

        dx=dy=0;

        // what is user doing

        if (amount_right)
           {
           // rotate player right

           cur_obj->angle=Get_Angle_Difference(cur_obj->angle, amount_right);

           } // end if right
        else
        if (amount_left)
           {
           // rotate player to left

           cur_obj->angle=Get_Angle_Sum(cur_obj->angle, amount_left);

           } // end if left

        if (amount_up)
           {
           // move player along view vector foward

           dx=(rcos_table[cur_obj->angle] * amount_up);
           dy=(rsin_table[cur_obj->angle] * amount_up);

           if (cur_extra->fly_mode) {

              // move player z based on vertical view angle

              cur_extra->base_fixed_z+=(tan_table[cur_extra->vert_angle]*amount_up);
              cur_extra->cur_fixed_z=cur_extra->base_fixed_z;

              Z_Correct_Move(cur_obj);
           } else {

              if (cur_obj->cur_sec->flags & VOXEL_SECTOR) {
                 if (!cur_extra->fly_mode) {
                    Reset_Player_Z(cur_extra);
                 }
              } else {

                 // Adjust player z position along a sin wave to simulate walking motion

                 cur_extra->z_move_angle=Get_Angle_Sum(cur_extra->z_move_angle, Z_ANGLE_INC);     
                 cur_extra->cur_fixed_z=(cur_extra->base_fixed_z+(rsin_table[cur_extra->z_move_angle]*Z_MOVE_MAX));

              } /* endif */

           } /* endif */

           } // end if up
        else
        if (amount_down)
           {
           // move player along view vector backward

            dx=(-rcos_table[cur_obj->angle]* amount_down);
            dy=(-rsin_table[cur_obj->angle] * amount_down);

            if (cur_extra->fly_mode) {

               // Move player z base on his vertical view angle

               cur_extra->base_fixed_z-=(tan_table[cur_extra->vert_angle]* amount_down);
               cur_extra->cur_fixed_z=cur_extra->base_fixed_z;

               Z_Correct_Move(cur_obj);
            } else {

              if (cur_obj->cur_sec->flags & VOXEL_SECTOR) {
                 if (!cur_extra->fly_mode) {
                    Reset_Player_Z(cur_extra);
                 }
              } else {

                 // Adjust player z position along a sin wave to simulate walking motion

                 cur_extra->z_move_angle=Get_Angle_Difference(cur_extra->z_move_angle, Z_ANGLE_INC);     
                 cur_extra->cur_fixed_z=(cur_extra->base_fixed_z+(rsin_table[cur_extra->z_move_angle]*Z_MOVE_MAX));

              } /* endif */

            } /* endif */

           } // end if down
       else
          {
             if (!cur_extra->fly_mode) {
                Reset_Player_Z(cur_extra);
             }
          }

        if (gun_shot) {
           if (cur_extra->time_to_gun<=0) {
           Create_Object(cur_obj->x, cur_obj->y, GUN_HEIGHT+cur_obj->z, cur_obj->angle, BULLET_TYPE, cur_obj, cur_obj->team);
           cur_extra->time_to_gun=MAX_TIME_TO_GUN;
           }
        }

        // move player
        delta_vec.x=dx;
        delta_vec.y=dy;
        Move_Object_Vec(cur_obj, &delta_vec);

        // check change in vertical angle
        cur_extra->vert_angle=Get_Angle_Sum(cur_extra->vert_angle, amount_look_up);
        cur_extra->vert_angle=Get_Angle_Difference(cur_extra->vert_angle, amount_look_down);

        switch (raw_input) {
        case U_KEY:
           cur_extra->base_fixed_z+=ONE;
           cur_extra->cur_fixed_z+=ONE;
           Z_Correct_Move(cur_obj);
           break;
        case D_KEY:
           cur_extra->base_fixed_z-=ONE;
           cur_extra->cur_fixed_z-=ONE;
           Z_Correct_Move(cur_obj);
           break;
        case F_KEY:
           cur_extra->fly_mode=(cur_extra->fly_mode == TRUE ? FALSE : TRUE);
           cur_extra->z_move_angle=ANGLE_0;
           cur_extra->cur_fixed_z=cur_extra->base_fixed_z;
           break;
        default: 
           break;
        }
        
        // test non-motion keys

if ( (cur_obj->cur_sec->tag == (HOME_SECTOR+cur_obj->team)) && 
      (Scan_Inventory(cur_extra->inventory, FLAG_CLASS)!=NULL) ) {
         Post_Quit(WINNING_GAME);

}

cur_obj->z=cur_extra->cur_fixed_z>>SHIFT;
}

void Reset_Player_Z(pplayer_info cur_extra)
{
   // reset player z if they aren't moving
   if ((cur_extra->z_move_angle % ANGLE_180) >= Z_ANGLE_DELTA) {

      if (cur_extra->z_move_angle % ANGLE_180 < ANGLE_90) {

         cur_extra->z_move_angle=
            Get_Angle_Difference(cur_extra->z_move_angle, Z_ANGLE_INC);

      } else {

         cur_extra->z_move_angle=
            Get_Angle_Sum(cur_extra->z_move_angle, Z_ANGLE_INC);

      } /* endif */

      cur_extra->cur_fixed_z=(cur_extra->base_fixed_z+
         (rsin_table[cur_extra->z_move_angle]*Z_MOVE_MAX));

   } /* endif */
}

void Z_Correct_Move(pobject cur_obj)
{
  pplayer_info cur_extra=(pplayer_info)cur_obj->extra_data;
  if (cur_extra->base_fixed_z < (STEP_LENGTH<<SHIFT) ) {
    cur_extra->base_fixed_z=STEP_LENGTH<<SHIFT;
    cur_extra->cur_fixed_z=cur_extra->base_fixed_z;
    }
  long sec_height=cur_obj->cur_sec->ceil_height-cur_obj->cur_sec->floor_height;
  MYFIXED max_height=(sec_height-STEP_LENGTH)<<SHIFT;
  if (cur_extra->base_fixed_z > max_height) {
     cur_extra->base_fixed_z=max_height;
     cur_extra->cur_fixed_z=cur_extra->base_fixed_z;
  }
}

void Setup_Player_Inputs(pplayer_info cur_extra)
{
memcpy(cur_extra->tracked_inputs, cur_extra->input_buffer, MAX_TRACKED_INPUTS * sizeof(short));
}

void Set_Player_Input_Buffer(PSHORT input_buffer)
{
  cur_input_buffer=input_buffer;
}

angle_type Get_Player_Vert_Angle(pobject cur_obj)
{
   return ((pplayer_info)cur_obj->extra_data)->vert_angle;
}

BOOL Is_Flying(pobject test_obj) {
   return ((pplayer_info)test_obj->extra_data)->fly_mode;
}

ULONG Player_Message(pobject send_obj, pobject receive_obj, ULONG message, pdata extra_data) {

   pplayer_info player_data=(pplayer_info)receive_obj->extra_data;

   switch (message) {
   case HIT_OBJ:
   case HIT_BY_OBJ:
         if ((send_obj->type->obj_class==FLAG_CLASS)&&(send_obj->team!=receive_obj->team)) {
            pobject_node new_node=(pobject_node)NewPtr(sizeof(object_node));
            new_node->data=send_obj;
            new_node->back=NULL;
            new_node->front=NULL;
            OL_Push_Node(new_node, player_data->inventory);
            Create_Inventory_Object(send_obj, receive_obj);
            Do_Shot("flag.pcx", "groovy.wav", 20, TRUE);
         }
         break;
   default: 
      break;
   } /* endswitch */
   return Default_Message(send_obj, receive_obj, message, extra_data);
}

pobject Scan_Inventory(pobject_node inventory, ULONG search_class) {
   pobject_node cur_node;
   cur_node=inventory;
   while (!OL_Empty_Node(cur_node)) {
      if ( ((pinventory_data)cur_node->data->extra_data)->old_type->obj_class==search_class) {
         return cur_node->data;
      }
      cur_node=OL_Next_Node(cur_node);
   }
   return NULL;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本电影亚洲天堂一区| 蜜桃一区二区三区在线| 久久香蕉国产线看观看99| 在线播放国产精品二区一二区四区| 91色视频在线| 91福利视频网站| 欧美三区免费完整视频在线观看| 欧美三级日韩在线| 欧美日本一区二区| 日韩一区二区影院| 久久综合九色综合欧美亚洲| 久久久不卡网国产精品二区| 国产日韩高清在线| 日韩毛片在线免费观看| 尤物视频一区二区| 日韩av高清在线观看| 精品一区二区三区免费毛片爱| 国产一区二区三区观看| 成人av在线播放网站| 色婷婷精品大视频在线蜜桃视频| 欧美色精品天天在线观看视频| 日韩精品一区国产麻豆| 国产精品欧美一区喷水| 亚洲综合色视频| 国产综合一区二区| 91在线观看免费视频| 欧美一区午夜精品| 久久精品水蜜桃av综合天堂| 亚洲欧美一区二区久久| 青青草国产精品97视觉盛宴| 国产真实乱对白精彩久久| 一本色道久久综合亚洲91| 欧美一级理论片| 亚洲免费观看高清完整版在线观看| 亚欧色一区w666天堂| 国产成人精品免费看| 欧美视频一区二区在线观看| 国产欧美日韩卡一| 午夜精品久久久久久久99水蜜桃 | 亚洲欧美一区二区三区极速播放 | 91精品国产色综合久久不卡电影 | 91在线小视频| 欧美一区二区三区在| 国产精品成人一区二区艾草 | 日韩高清不卡一区二区三区| 国产盗摄女厕一区二区三区| 欧美日韩美女一区二区| 中文在线资源观看网站视频免费不卡| 亚洲最色的网站| 成人激情免费电影网址| 日韩欧美国产高清| 亚洲成人在线观看视频| 91在线一区二区三区| 欧美激情中文不卡| 免费看欧美美女黄的网站| 在线视频国内自拍亚洲视频| 日本一二三不卡| 国产在线精品一区二区三区不卡 | 一区二区三区中文字幕| 成人激情综合网站| 久久综合狠狠综合| 麻豆一区二区99久久久久| 91久久国产最好的精华液| 中文字幕在线一区免费| 国产成人福利片| 国产三级三级三级精品8ⅰ区| 精久久久久久久久久久| 日韩欧美视频一区| 日本成人中文字幕在线视频| 欧美日韩在线电影| 亚洲午夜久久久久中文字幕久| 99天天综合性| 日韩一区中文字幕| 一本久久a久久免费精品不卡| 亚洲男人的天堂网| 色婷婷香蕉在线一区二区| 一区二区三区加勒比av| 欧洲一区在线电影| 亚洲动漫第一页| 欧美一区二区视频网站| 久久精品免费看| 欧美电视剧在线观看完整版| 国产在线播放一区二区三区| 国产日韩精品一区| 91麻豆自制传媒国产之光| 亚洲精品日韩一| 9191久久久久久久久久久| 日日夜夜精品免费视频| 精品国产一二三| 国产不卡在线一区| 亚洲免费av高清| 欧美日韩二区三区| 久久不见久久见中文字幕免费| 精品99999| 成人av综合在线| 亚洲精品国产a| 5566中文字幕一区二区电影| 久草这里只有精品视频| 中文字幕第一区| 欧美天天综合网| 蜜桃久久av一区| 国产精品久久二区二区| 欧美日韩一区在线观看| 国产呦萝稀缺另类资源| 一区二区三区免费网站| 日韩一级片在线观看| 国产激情视频一区二区在线观看 | 日韩精品成人一区二区在线| www久久精品| 日本精品视频一区二区三区| 蜜桃视频在线一区| 中文字幕一区二区三区四区| 欧美日韩一区二区三区四区 | 亚洲欧美在线另类| 日韩美女在线视频| 色先锋资源久久综合| 久久99国产精品久久99| 一区二区三区四区在线免费观看| 日韩欧美的一区二区| 日本国产一区二区| 国产一区不卡精品| 日本成人在线电影网| 亚洲色图另类专区| 久久久精品国产免费观看同学| 69堂精品视频| 欧洲精品一区二区三区在线观看| 国产中文字幕精品| 日产国产欧美视频一区精品| 国产精品视频在线看| 亚洲精品一区二区在线观看| 91高清视频免费看| 成人福利视频在线看| 捆绑变态av一区二区三区| 亚洲成在线观看| 一区二区三区日本| 1000部国产精品成人观看| 精品久久久久av影院| 欧美一级xxx| 欧美日韩一卡二卡| 成人午夜碰碰视频| 国内精品国产三级国产a久久| 免费亚洲电影在线| 视频在线在亚洲| 亚洲一区二区欧美激情| 亚洲欧美在线高清| 亚洲视频一区二区在线| 中文字幕一区二区视频| 国产精品美女久久久久aⅴ| 久久免费偷拍视频| 久久精品免视看| 久久影院午夜片一区| 欧美v亚洲v综合ⅴ国产v| 91精品国产高清一区二区三区| 欧美日韩亚洲国产综合| 欧美日韩一区国产| 9191久久久久久久久久久| 7777精品久久久大香线蕉| 日韩一区二区电影| 久久伊人蜜桃av一区二区| 久久影院午夜片一区| 欧美经典一区二区| 中文字幕日本不卡| 亚洲精品网站在线观看| 亚洲成人黄色影院| 日韩一区精品视频| 日韩电影在线一区二区三区| 久久99在线观看| 大尺度一区二区| 91色porny在线视频| 欧美日韩免费一区二区三区| 在线不卡欧美精品一区二区三区| 日韩欧美激情一区| 久久众筹精品私拍模特| 亚洲视频在线一区二区| 天天av天天翘天天综合网| 另类综合日韩欧美亚洲| 成人黄色片在线观看| 色呦呦国产精品| 欧美一区二区三区免费| 欧美激情一区二区三区蜜桃视频 | 亚洲国产综合色| 日韩1区2区3区| 国产98色在线|日韩| 色综合久久久久综合体| 欧美一区二区不卡视频| 国产女主播视频一区二区| 一区二区高清免费观看影视大全 | 亚洲一区在线观看免费观看电影高清| 亚洲成人www| 国产91精品精华液一区二区三区 | 欧美大片一区二区| 亚洲欧洲日本在线| 免费xxxx性欧美18vr| 粉嫩高潮美女一区二区三区| 欧美妇女性影城| 国产精品夫妻自拍| 国产一区二区不卡在线| 欧美人xxxx| 一区二区在线电影| 国产精品一区在线|