2016-12-23 2 views
0

Я новичок в кодировании и нуждаюсь в некоторой помощи. Я сортирую случаи из меню Moda GTA и пытаюсь добавить новый из SDK. Когда я пытаюсь добавить его и добавлю кейс для него, чтобы он знал, что делать, я получаю ошибку в названии. Я кодирую в C++.«Метка корпуса может использоваться только в коммутаторе»

int activeLineIndexVeh = 0; 

void process_veh_menu() 
{ 
    const float lineWidth = 230.0; 
    const int lineCount = 9; 

    std::string caption = "Vehicle Options"; 

    static struct { 
     LPCSTR  text; 
     bool  *pState; 
     bool  *pUpdated; 
    } lines[lineCount] = { 
     { "Car Spawner", NULL, NULL }, 
     { "Random Paint", NULL, NULL }, 
     { "Fix", NULL, NULL }, 
     { "Custom Plate", NULL, NULL }, 
     { "Seat Belt", &featureVehSeatbelt, &featureVehSeatbeltUpdated }, 
     { "Wrap In Spawned", &featureVehWrapInSpawned, NULL }, 
     { "Invincible", &featureVehInvincible, &featureVehInvincibleUpdated }, 
     { "Strong Wheels", &featureVehInvincibleWheels, &featureVehInvincibleWheelsUpdated }, 
     { "Speed Boost", &featureVehSpeedBoost, NULL } 
    }; 

    DWORD waitTime = 150; 
    while (true) 
    { 
     // timed menu draw, used for pause after active line switch 
     DWORD maxTickCount = GetTickCount() + waitTime; 
     do 
     { 
      // draw menu 
      draw_menu_line(caption, lineWidth, 7.9, 14.0, 4.0, 4.0, false, true); 
      for (int i = 0; i < lineCount; i++) 
       if (i != activeLineIndexVeh) 
        draw_menu_line(line_as_str(lines[i].text, lines[i].pState), 
        lineWidth, 4.0, 60.0 + i * 22.8, 4.0, 9.0, false, false); 
      draw_menu_line(line_as_str(lines[activeLineIndexVeh].text, lines[activeLineIndexVeh].pState), 
       lineWidth + 0.0, 2.0, 60.0 + activeLineIndexVeh * 22.9, 4.0, 7.0, true, false); 

      update_features(); 
      WAIT(0); 
     } while (GetTickCount() < maxTickCount); 
     waitTime = 0; 

     // process buttons 
     bool bSelect, bBack, bUp, bDown; 
     get_button_state(&bSelect, &bBack, &bUp, &bDown, NULL, NULL); 
     if (bSelect) 
     { 
      menu_beep(); 

      // common variables 
      BOOL bPlayerExists = ENTITY::DOES_ENTITY_EXIST(PLAYER::PLAYER_PED_ID()); 
      Player player = PLAYER::PLAYER_ID(); 
      Ped playerPed = PLAYER::PLAYER_PED_ID(); 

      switch (activeLineIndexVeh) 
      { 
      case 0: 
       if (process_carspawn_menu()) return; 
       break; 
      case 1: 
       if (bPlayerExists) 
       { 
        if (PED::IS_PED_IN_ANY_VEHICLE(playerPed, 0)) 
        { 
         Vehicle veh = PED::GET_VEHICLE_PED_IS_USING(playerPed); 
         VEHICLE::SET_VEHICLE_CUSTOM_PRIMARY_COLOUR(veh, rand() % 255, rand() % 255, rand() % 255); 
         if (VEHICLE::GET_IS_VEHICLE_PRIMARY_COLOUR_CUSTOM(veh)) 
          VEHICLE::SET_VEHICLE_CUSTOM_SECONDARY_COLOUR(veh, rand() % 255, rand() % 255, rand() % 255); 
        } 
        else 
        { 
         set_status_text("player isn't in a vehicle"); 
        } 
       } 
       break; 
      case 2: 
       if (bPlayerExists) 
        if (PED::IS_PED_IN_ANY_VEHICLE(playerPed, 0)) 
         VEHICLE::SET_VEHICLE_FIXED(PED::GET_VEHICLE_PED_IS_USING(playerPed)); 
        else 
         set_status_text("player isn't in a vehicle"); 
       break; 
       // switchable features 
      default: 
       if (lines[activeLineIndexVeh].pState) 
        *lines[activeLineIndexVeh].pState = !(*lines[activeLineIndexVeh].pState); 
       if (lines[activeLineIndexVeh].pUpdated) 
        *lines[activeLineIndexVeh].pUpdated = true; 
      } 
      waitTime = 200; 
     } 
     else 
      if (bBack || trainer_switch_pressed()) 
      { 
       menu_beep(); 
       break; 
      } 
      else 
       if (bUp) 
       { 
        menu_beep(); 
        if (activeLineIndexVeh == 0) 
         activeLineIndexVeh = lineCount; 
        activeLineIndexVeh--; 
        waitTime = 150; 
       } 
       else 
        if (bDown) 
        { 
         menu_beep(); 
         activeLineIndexVeh++; 
         if (activeLineIndexVeh == lineCount) 
          activeLineIndexVeh = 0; 
         waitTime = 150; 
        } 
     case 3: // error starts here 
      Ped playerPed = PLAYER::PLAYER_PED_ID(); 

      // No point in displaying the keyboard if they aren't in a vehicle 
      if (!PED::IS_PED_IN_ANY_VEHICLE(playerPed, false)) return; 

      // Invoke keyboard 
      GAMEPLAY::DISPLAY_ONSCREEN_KEYBOARD(true, "", "", VEHICLE::GET_VEHICLE_NUMBER_PLATE_TEXT(PED::GET_VEHICLE_PED_IS_IN(playerPed, false)), "", "", "", 9); 

      // Wait for the user to edit 
      while (GAMEPLAY::UPDATE_ONSCREEN_KEYBOARD() == 0) WAIT(0); 

      // Make sure they didn't exit without confirming their change, and that they're still in a vehicle 
      if (!GAMEPLAY::GET_ONSCREEN_KEYBOARD_RESULT() || !PED::IS_PED_IN_ANY_VEHICLE(playerPed, false)) return; 

      // Update the licenseplate 
      VEHICLE::SET_VEHICLE_NUMBER_PLATE_TEXT(PED::GET_VEHICLE_PED_IS_IN(playerPed, false), GAMEPLAY::GET_ONSCREEN_KEYBOARD_RESULT()); 
    } 
} 
+1

Дела идут наперекосяк вокруг заявления 'WaitTime = 200;', в основном из-за неуместные скобки. – Bathsheba

+1

@ Батшеба: Я не думаю, что это имеет какое-то отношение к неуместным брекетам, главным образом потому, что я не могу найти их. Вместо этого сам «случай» дико неуместен. –

+0

Что вы собираетесь делать год спустя, когда вам нужно поддерживать этот нечитаемый код? Функции записи; сохраняйте код в каждом «случае» маленьким. –

ответ

0

Вы пытаетесь добавить кейс, и вы должны сделать это в правильном положении. Попробуйте добавить в случае 3 между корпусом 2 и корпусом по умолчанию, например, так:

switch (activeLineIndexVeh) 
    { 
    case 0: 
     if (process_carspawn_menu()) return; 
     break; 
    case 1: 
     if (bPlayerExists) 
     { 
      if (PED::IS_PED_IN_ANY_VEHICLE(playerPed, 0)) 
      { 
       Vehicle veh = PED::GET_VEHICLE_PED_IS_USING(playerPed); 
       VEHICLE::SET_VEHICLE_CUSTOM_PRIMARY_COLOUR(veh, rand() % 255,rand() % 255, rand() % 255); 
        if (VEHICLE::GET_IS_VEHICLE_PRIMARY_COLOUR_CUSTOM(veh)) 
         VEHICLE::SET_VEHICLE_CUSTOM_SECONDARY_COLOUR(veh, rand() % 255, rand() % 255, rand() % 255); 
       } 
       else 
       { 
        set_status_text("player isn't in a vehicle"); 
       } 
      } 
      break; 
    case 2: 
     if (bPlayerExists) 
      if (PED::IS_PED_IN_ANY_VEHICLE(playerPed, 0)) 
        VEHICLE::SET_VEHICLE_FIXED(PED::GET_VEHICLE_PED_IS_USING(playerPed)); 
      else 
       set_status_text("player isn't in a vehicle"); 
      break; 
      // switchable features 
    case 3: 
     Ped playerPed = PLAYER::PLAYER_PED_ID(); 

     // No point in displaying the keyboard if they aren't in a vehicle 
     if (!PED::IS_PED_IN_ANY_VEHICLE(playerPed, false)) return; 

     // Invoke keyboard 
     GAMEPLAY::DISPLAY_ONSCREEN_KEYBOARD(true, "", "", VEHICLE::GET_VEHICLE_NUMBER_PLATE_TEXT(PED::GET_VEHICLE_PED_IS_IN(playerPed, false)), "", "", "", 9); 

     // Wait for the user to edit 
     while (GAMEPLAY::UPDATE_ONSCREEN_KEYBOARD() == 0) WAIT(0); 

     // Make sure they didn't exit without confirming their change, and that they're still in a vehicle 
     if (!GAMEPLAY::GET_ONSCREEN_KEYBOARD_RESULT() || !PED::IS_PED_IN_ANY_VEHICLE(playerPed, false)) return; 

     // Update the licenseplate 
     VEHICLE::SET_VEHICLE_NUMBER_PLATE_TEXT(PED::GET_VEHICLE_PED_IS_IN(playerPed, false), GAMEPLAY::GET_ONSCREEN_KEYBOARD_RESULT()); 
     default: 
      if (lines[activeLineIndexVeh].pState) 
       *lines[activeLineIndexVeh].pState = !(*lines[activeLineIndexVeh].pState); 
      if (lines[activeLineIndexVeh].pUpdated) 
       *lines[activeLineIndexVeh].pUpdated = true; 
     } 
    default: 
     if (lines[activeLineIndexVeh].pState) 
      *lines[activeLineIndexVeh].pState = !(*lines[activeLineIndexVeh].pState); 
     if (lines[activeLineIndexVeh].pUpdated) 
      *lines[activeLineIndexVeh].pUpdated = true; 
    } 
+0

это похоже почти на работу, но на VEHICLE :: SET_VEHICLE_CUSTOM_PRIMARY_COLOUR (veh, rand()% 255, d()% 255, rand()% 255); строка, d получает ошибку неопределенного идентификатора. – Aidan

+0

Кажется, я сделал опечатку, d должен быть rand(). Я отредактировал мой ответ – TeaMonkie

+0

Спасибо большое, что это сработало! – Aidan

2

Это то, что он говорит. У вас есть лейбл case, который даже не на той же улице, что и ваш switch!

Произошло ли потерянное на обратном пути из паба case 3:?

+0

Хорошо, я добавил переключатель над корпусом, и он сработал. Теперь появилась новая ошибка. В этой строке playerPed выдает ошибку: Ошибка: идентификатор «playerPed» не определен. Перед добавлением коммутатора был определен playerPed, но потом он дал мне ошибку. Извините, если мне кажется, что я мало что знаю об этом. – Aidan

+0

if (! PED :: IS_PED_IN_ANY_VEHICLE (playerPed, false)) return; – Aidan

+0

Вы не можете просто случайно добавить строку 'switch' в середине программы. Вы должны думать о том, куда должна идти логика кода. Мы не можем сказать вам, где это: _you_ - программист, поэтому вам нужно определить, как ваша программа должна работать! –

Смежные вопросы