Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > C++

Ответ
 
Опции темы
Старый 24.06.2011, 06:31   #1
maxturbo
Разработчик
 
Аватар для maxturbo
 
Регистрация: 19.05.2009
Адрес: Россия Иркутская область
Сообщений: 350
Написано 51 полезных сообщений
(для 66 пользователей)
Оператор switch

Собственно вопрос
Перевожу код с Blitz3D на C++ и вот проблема:
Код на Blitz3D:
CamPick=xCameraPick(cam,xMouseX(),xMouseY())
If 
xAnimating(Menu)=False
If CamPick
Name
$=xEntityName(CamPick)
If 
xMouseHit(1)
Select Name$
    Case 
"#Game"
        
If st_options_menu=And st_about_menu=0
        st_game_menu
=1-st_game_menu
        
If st_game_menu=1
        st_game
=1
        xAnimate Menu
,3,1.5,1
        
Else If st_game_menu=0
        st_game
=2
        
EndIf
        EndIf
    Case 
"#Options"
        
If st_game_menu=And st_about_menu=0
        st_options_menu
=1-st_options_menu
        
If st_options_menu=1
        st_options
=1
        xAnimate Menu
,3,1.5,5
        
Else If st_options_menu=0
        st_options
=2
        
EndIf
        EndIf
    Case 
"#About"
        
If st_options_menu=And st_game_menu=0
        st_about_menu
=1-st_about_menu
        
If st_about_menu=1
        st_about
=1
        xAnimate Menu
,3,1.5,9
        
Else If st_about_menu=0
        st_about
=2
        
EndIf
        EndIf
    Case 
"#Exit"
        
End
End Select
EndIf
EndIf
Else
xFlushMouse
EndIf 
В коде на Blitz3D видно что когда мышкой указываешь на какой либо объект(entity) то в переменную Name возвращается имя entity ну и по структуре
Select
End Select 
понятно что там происходит(вызов каких либо событий)
Вопрос такой:
Как мне на C++ перевести структуру Select(Blitz3D) на switch(C++)
Пробовал так:
if(CamPick)
{
   
Name xEntityName(CamPick);
   if(
xMouseHit(1))
   {
     switch(
Name)
     {
          case 
"#Game":

          break;
          case 
"#Options":

          break;
          case 
"#About":

          break;
          case 
"#Exit":

          break;
     }
   }

Переменная Name записана const char* Name = "";
Но почему то компилятор ругается на такую запись структуры... Может, что еще и не осилил в С++ подскажите...
За ранее Спасибо...
__________________
(Offline)
 
Ответить с цитированием
Старый 24.06.2011, 09:17   #2
YellowAfterlife
ПроЭктировщик
 
Аватар для YellowAfterlife
 
Регистрация: 19.02.2011
Сообщений: 134
Написано 81 полезных сообщений
(для 219 пользователей)
Ответ: Оператор switch

Вы имеете в виду эту ошибку?

Только переменные перечисляемого типа могут быть использованы в switch().
Если вы хотите делать switch по значению строки, можно использовать следующие способы:
1. Заменить switch() на блок if-then-else. Тут: не забывайте, что в С++ сравнение строк нужно делать через <string.h> -> strcmp(char*, char*).
2. Использовать числовое значение строки. То есть написать (или взять с интернета) функцию, которая бы возращала для каждой строки более или менее уникальный int. Следовательно сравнения будут проводится над результатом такой функции.
3. Дать объектам дополнительную переменную (аля Tag в Delphi) по которой и определять, какой объект был клацнут.

Хорошего дня.
__________________

Мой сайт-блог. Игры, обновления, примеры для Haxe, JavaScript(+HTML5), GameMaker, Love2d...
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо YellowAfterlife за это полезное сообщение:
maxturbo (24.06.2011), St_AnGer (24.06.2011)
Старый 24.06.2011, 11:51   #3
maxturbo
Разработчик
 
Аватар для maxturbo
 
Регистрация: 19.05.2009
Адрес: Россия Иркутская область
Сообщений: 350
Написано 51 полезных сообщений
(для 66 пользователей)
Ответ: Оператор switch

Спасибо
Накатал такую функцию с возвращением int при сравнение строк:
int GetNameMenu(const charstring)
{
    if(
strcmp(string"#Game") == 0)
    {
        return 
1;
    }
    if(
strcmp(string"#Options") == 0)
    {
        return 
2;
    }
    if(
strcmp(string"#About") == 0)
    {
        return 
3;
    }
    if(
strcmp(string"#Exit") == 0)
    {
        return 
4;
    }

switch(GetNameMenu(Name))
                {
                case 
1:
                    break;
                case 
2:
                    break;
                case 
3:
                    break;
                case 
4:
                    return 
0;
                    break;
                } 
Если есть поправочки, пишите не стесняйтесь
__________________
(Offline)
 
Ответить с цитированием
Старый 24.06.2011, 12:56   #4
falcon
Разработчик
 
Аватар для falcon
 
Регистрация: 12.07.2008
Сообщений: 523
Написано 196 полезных сообщений
(для 470 пользователей)
Ответ: Оператор switch

нафига так извращаться?
>> Может, что еще и не осилил в С++ подскажите...
уверяю тебя, там дофига чего можно осиливать на протяжении лет)))
открой для себя STL, старайся не использовать C-строки, юзай std::string.
там спешл фо ю перегрузили оператор сравнения.
но вообще хранить пункты меню в виде строк - кашмар. Их можно полностью определять в виде константного числа.
а ещё лучше мб заюзать паттерн state для реализации меню.. ведь объект приложение меняет своё состояние при выборе пункта меню.. так каждый пункт будет инкапсулирован в объект со своим поведением..
(Offline)
 
Ответить с цитированием
Эти 4 пользователя(ей) сказали Спасибо falcon за это полезное сообщение:
HolyDel (24.06.2011), maxturbo (24.06.2011), moka (24.06.2011), St_AnGer (24.06.2011)
Старый 27.06.2011, 03:16   #5
maxturbo
Разработчик
 
Аватар для maxturbo
 
Регистрация: 19.05.2009
Адрес: Россия Иркутская область
Сообщений: 350
Написано 51 полезных сообщений
(для 66 пользователей)
Ответ: Оператор switch

Сообщение от falcon Посмотреть сообщение
нафига так извращаться?
>> Может, что еще и не осилил в С++ подскажите...
уверяю тебя, там дофига чего можно осиливать на протяжении лет)))
открой для себя STL, старайся не использовать C-строки, юзай std::string.
там спешл фо ю перегрузили оператор сравнения.
но вообще хранить пункты меню в виде строк - кашмар. Их можно полностью определять в виде константного числа.
а ещё лучше мб заюзать паттерн state для реализации меню.. ведь объект приложение меняет своё состояние при выборе пункта меню.. так каждый пункт будет инкапсулирован в объект со своим поведением..
В виде строк у меня не пункты меню идут, а просто идет 3D модель и таким методом я вызываю ту или иную функцию То есть пиками проверяю имена и при нажатие на мышь вызываю функцию в операторе switch
__________________
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 09:54.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com