| Предыдущая тема :: Следующая тема   | 
	
	
	
		| Автор | 
		Сообщение | 
	
	
		Otto Baynes
  Постоялец
 
  Пол:    Возраст: 38 Зарегистрирован: 19.01.2012 Сообщения: 42
  Группы: Нет
 
  | 
		
			
			 
			
				
  | 
			 
			
				Пробую портировать игру, компилирую так:
 
 
 	  | Код: | 	 		  $cmake . -DCMAKE_CC_COMPILER=arm-gph-linux-gnueabi-gcc -DCMAKE_CXX_COMPILER=arm-gph-linux-gnueabi-g++
 
 | 	  
 
Затем:
 
 	  | Код: | 	 		  $make
 
...
 
...
 
...
 
Scanning dependencies of target meandmyshadow
 
Linking CXX executable meandmyshadow
 
/home/mashin/dev/GPH_SDK/tools/gcc-4.2.4-glibc-2.7-eabi/bin/../lib/gcc/arm-gph-linux-gnueabi/4.2.4/../../../../arm-gph-linux-gnueabi/bin/ld: cannot find -lSDLmain
 
collect2: ld returned 1 exit status
 
make[2]: *** [meandmyshadow] Ошибка 1
 
make[1]: *** [CMakeFiles/meandmyshadow.dir/all] Ошибка 2
 
make: *** [all] Ошибка 2
 
 | 	  
 
 
Компилируется нормально, но на стадии сборки ld не находит некий SDLmain.
 
Не подскажите что тут можно сделать? _________________ Мой блог
 
Мой эмулятор CHIP-8 и Super CHIP
  Последний раз редактировалось: Otto Baynes (Сб Янв 28, 2012 3:33 pm), всего редактировалось 1 раз | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		Hahahoj
  Site Admin
  
  Пол:    Возраст: 52 Зарегистрирован: 08.10.2008 Сообщения: 1848
  Группы:  
 
  | 
		
			
			 
			
				
  | 
			 
			
				SDLMain это специфическая либа SDL-а под Кену и Виз.
 
Добавить параметром компиляции вместе с SDL и добавить альтернативный каталог для поиска либ. Относительно корня СДК он лежит в подпапке DGE/lib/target при компиляции для консоли и DGE/lib/host при компиляции для компа. _________________ Просто Вовк | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		Otto Baynes
  Постоялец
 
  Пол:    Возраст: 38 Зарегистрирован: 19.01.2012 Сообщения: 42
  Группы: Нет
 
  | 
		
			
			 
			
				
  | 
			 
			
				Спасибо.
 
Как это сделать в cmake я не понял, но получилось скомпилировать игру написав свой makefile  
 
 
Игра уже запускается на caanoo, теперь надо переделать управление на кнопки и разобраться почему изображение слишком сильно мерцает. _________________ Мой блог
 
Мой эмулятор CHIP-8 и Super CHIP | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		Otto Baynes
  Постоялец
 
  Пол:    Возраст: 38 Зарегистрирован: 19.01.2012 Сообщения: 42
  Группы: Нет
 
  | 
		 | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		Hahahoj
  Site Admin
  
  Пол:    Возраст: 52 Зарегистрирован: 08.10.2008 Сообщения: 1848
  Группы:  
 
  | 
		
			
			 
			
				
  | 
			 
			
				 	  | Otto Baynes писал(а): | 	 		  Спасибо.
 
теперь надо переделать управление на кнопки | 	  
 
Кусочек кода из yeti с идеей отлова осей как кнопок:
 
 
 	  | Код: | 	 		     while(done==0){
 
      sdl3d_flip();
 
      keys = SDL_GetKeyState(NULL);
 
      if ( SDL_PollEvent(&event) ) {
 
         switch (event.type) {
 
         case SDL_JOYAXISMOTION:
 
            switch(event.jaxis.axis) {
 
            case 0:
 
               if(event.jaxis.value<-16000) {
 
                  yeti.keyboard.left = 1;
 
                  yeti.keyboard.right = 0;
 
               } else if(event.jaxis.value>16000) {
 
                  yeti.keyboard.left = 0;
 
                  yeti.keyboard.right = 1;
 
               } else {
 
                  yeti.keyboard.left = 0;
 
                  yeti.keyboard.right = 0;
 
               }
 
               break;
 
            case 1:
 
                                       if(event.jaxis.value<-16000) {
 
                                                yeti.keyboard.up = 1;
 
                                                yeti.keyboard.down = 0;
 
                                        } else if(event.jaxis.value>16000) {
 
                                                yeti.keyboard.up = 0;
 
                                                yeti.keyboard.down = 1;
 
                                        } else {
 
                                                yeti.keyboard.up = 0;
 
                                                yeti.keyboard.down = 0;
 
                                        }
 
               break;
 
            }
 
            break;
 
         } | 	  
 
 
Дальше всё много проще:
 
 	  | Код: | 	 		  #ifdef _CAANOO
 
/* CAANOO button mapping */
 
enum MAP_KEY
 
{
 
    VK_FA        ,
 
    VK_FX        ,
 
    VK_FB        ,
 
    VK_FY        ,
 
    VK_FL        ,//=4
 
    VK_FR        ,//=5
 
    VK_START     ,//=6 HOME
 
    VK_HOLD     ,//=7
 
    VK_SELECT    ,//=8 HELP1
 
    VK_HELP2    ,//=9
 
    VK_CLICK    ,//=10
 
};
 
#endif
 
 
#ifdef _WIZ
 
/* WIZ button mapping */
 
enum MAP_KEY
 
{
 
   VK_UP         , // 0
 
   VK_UP_LEFT    , // 1
 
   VK_LEFT       , // 2
 
   VK_DOWN_LEFT  , // 3
 
   VK_DOWN       , // 4
 
   VK_DOWN_RIGHT , // 5
 
   VK_RIGHT      , // 6
 
   VK_UP_RIGHT   , // 7
 
   VK_SELECT     , // 8
 
   VK_START      , // 9
 
   VK_FL         , // 10
 
   VK_FR         , // 11
 
   VK_FA         , // 12
 
   VK_FB         , // 13
 
   VK_FX         , // 14
 
   VK_FY         , // 15
 
   VK_VOL_UP     , // 16
 
   VK_VOL_DOWN   , // 17
 
   VK_CLICK     // 18
 
};
 
#endif | 	  
 
Ну и обработка - вроде этого стандартного куска кода:
 
 	  | Код: | 	 		        SDL_Event event;
 
 
      /* Check for events */
 
      while (SDL_PollEvent (&event))
 
      {
 
         switch (event.type)
 
         {
 
            case SDL_KEYDOWN:
 
               /* if press Ctrl + C, terminate program */
 
               if ( (event.key.keysym.sym == SDLK_c) && (event.key.keysym.mod & (KMOD_LCTRL | KMOD_RCTRL)) )
 
                  done = 1;
 
               break;
 
            case SDL_KEYUP:
 
               break;
 
            case SDL_JOYBUTTONDOWN:
 
               /* if press Start button, terminate program */
 
               if ( event.jbutton.button == VK_START )
 
                  done = 1;
 
               break;
 
            case SDL_JOYBUTTONUP:
 
               break;
 
            case SDL_QUIT:
 
               done = 1;
 
               break;
 
            default:
 
               break;
 
         }
 
      } | 	 
  _________________ Просто Вовк | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		Otto Baynes
  Постоялец
 
  Пол:    Возраст: 38 Зарегистрирован: 19.01.2012 Сообщения: 42
  Группы: Нет
 
  | 
		
			
			 
			
				
  | 
			 
			
				Спасибо, я примерно так и делаю.
 
С осями есть такая проблема: когда джойстик выжат "до упора" в какую нибудь сторону, насколько я понял должно выдавать значение близкое к 32767, но реально похоже выдается  намного меньшее. То есть пишу так:
 
 	  | Код: | 	 		  if(event.jaxis.value > 16000) { 
 
   смещаем координату спрайта | 	  
 
 
жму вправо не до упора - спрайт движется, если нажать до упора - останавливается. Может есть готовая программа выдающая значения наклона оси?
 
 
И еще у меня пока не получается сделать прыжок глав.героя в беге, он тупо останавливается и прыгает вертикально вверх, а в оригинале он прыгает вперед.
 
Мой код бега-прыжка:
 
 	  | Код: | 	 		     xVel=0;
 
 
   //Check if a key has been released.
 
   if(event.type==SDL_JOYBUTTONUP){
 
      //It has so downKeyPressed can't be true.
 
      downKeyPressed=false;
 
   }
 
 
   switch(event.type){
 
   case SDL_JOYAXISMOTION:
 
      if ( ( event.jaxis.value < -16000 ) || (event.jaxis.value > 16000 ) ) 
 
      {
 
         if( event.jaxis.axis == 0) 
 
         {
 
            /* Left-right movement code goes here */
 
            if(event.jaxis.value < 0)
 
               xVel-=4;
 
            else
 
               xVel+=4;
 
         }
 
 
         if( event.jaxis.axis == 1) 
 
         {
 
            /* Up-Down movement code goes here */
 
         if(event.jaxis.value < -16000 && inAir==false){
 
               isJump=true;
 
            }
 
         }
 
      }
 
      break;
 
   case SDL_JOYBUTTONDOWN:
 
      //Switch which key is pressed.
 
      switch(event.jbutton.button){
 
         case CAANOO_BUTTON_B:
 
            //The up key, if we aren't in the air we start jumping.
 
            if(inAir==false){
 
               isJump=true;
 
            }
 
            break;
 
 | 	  
 
 
Оригинал:
 
 	  | Код: | 	 		     //Get the current keystate.
 
   Uint8* keyState=SDL_GetKeyState(NULL);
 
   
 
   //Reset horizontal velocity.
 
   xVel=0;
 
   if(keyState[SDLK_RIGHT]){
 
      //Walking to the right.
 
      xVel+=4;
 
   }
 
   if(keyState[SDLK_LEFT]){
 
      //Walking to the left.
 
      xVel-=4;
 
   }
 
   
 
   //Check if a key has been released.
 
   if(event.type==SDL_KEYUP){
 
      //It has so downKeyPressed can't be true.
 
      downKeyPressed=false;
 
   }
 
 
   //Check if a key is pressed (down).
 
   if(event.type==SDL_KEYDOWN){
 
      //Switch which key is pressed.
 
      switch(event.key.keysym.sym){
 
         case SDLK_UP:
 
            //The up key, if we aren't in the air we start jumping.
 
            if(inAir==false){
 
               isJump=true;
 
            }
 
            break;
 
 | 	 
  _________________ Мой блог
 
Мой эмулятор CHIP-8 и Super CHIP | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		Hahahoj
  Site Admin
  
  Пол:    Возраст: 52 Зарегистрирован: 08.10.2008 Сообщения: 1848
  Группы:  
 
  | 
		
			
			 
			
				
  | 
			 
			
				Ну, судя по приведенному коду у тебя за один игровой цикл обрабатывается либо джойстик, либо кнопки. Поэтому одновременно и не работают.
 
 
Приведу пример из того же йети - вот его полный игровой цикл в отношении к вводу/выводу:
 
 
 	  | Код: | 	 		  SDL_Joystick* caanooController;
 
 
...
 
 
while(done==0){
 
      keys = SDL_GetKeyState(NULL);
 
      if ( SDL_PollEvent(&event) ) {
 
         switch (event.type) {
 
         case SDL_JOYAXISMOTION:
 
            switch(event.jaxis.axis) {
 
            case 0:
 
               if(event.jaxis.value<-16000) {
 
                  yeti.keyboard.left = 1;
 
                  yeti.keyboard.right = 0;
 
               } else if(event.jaxis.value>16000) {
 
                  yeti.keyboard.left = 0;
 
                  yeti.keyboard.right = 1;
 
               } else {
 
                  yeti.keyboard.left = 0;
 
                  yeti.keyboard.right = 0;
 
               }
 
               break;
 
            case 1:
 
                                       if(event.jaxis.value<-16000) {
 
                                                yeti.keyboard.up = 1;
 
                                                yeti.keyboard.down = 0;
 
                                        } else if(event.jaxis.value>16000) {
 
                                                yeti.keyboard.up = 0;
 
                                                yeti.keyboard.down = 1;
 
                                        } else {
 
                                                yeti.keyboard.up = 0;
 
                                                yeti.keyboard.down = 0;
 
                                        }
 
               break;
 
            }
 
            break;
 
         }
 
 
            }
 
        #ifdef GP2XWIZ
 
      yeti.keyboard.up     = SDL_JoystickGetButton(caanooController,KEY_UP);//WIZ_UP;//keys[SDLK_UP];
 
      yeti.keyboard.down   = SDL_JoystickGetButton(caanooController,KEY_DOWN);//WIZ_DOWN;//keys[SDLK_DOWN];
 
      yeti.keyboard.left   = SDL_JoystickGetButton(caanooController,KEY_LEFT);//WIZ_LEFT;//keys[SDLK_LEFT];
 
      yeti.keyboard.right  = SDL_JoystickGetButton(caanooController,KEY_RIGHT);//WIZ_RIGHT;//keys[SDLK_RIGHT];
 
      #endif
 
      #ifdef GP2X
 
      yeti.keyboard.a      = SDL_JoystickGetButton(caanooController,KEY_B);//WIZ_B;//keys[SDLK_RETURN];
 
      yeti.keyboard.b      = SDL_JoystickGetButton(caanooController,KEY_X);//WIZ_X;//keys[SDLK_SPACE];
 
      yeti.keyboard.l      = SDL_JoystickGetButton(caanooController,KEY_L);//WIZ_R;//keys[SDLK_a];
 
      yeti.keyboard.r      = SDL_JoystickGetButton(caanooController,KEY_R);//WIZ_L;//keys[SDLK_y];
 
      yeti.keyboard.select = SDL_JoystickGetButton(caanooController,KEY_SELECT);//WIZ_SELECT;//keys[SDLK_ESCAPE];
 
      done = SDL_JoystickGetButton(caanooController,KEY_START);
 
      #endif
 
        #ifdef _PC
 
      yeti.keyboard.up     = keys[SDLK_UP];
 
      yeti.keyboard.down   = keys[SDLK_DOWN];
 
      yeti.keyboard.left   = keys[SDLK_LEFT];
 
      yeti.keyboard.right  = keys[SDLK_RIGHT];
 
      yeti.keyboard.a      = keys[SDLK_RETURN];
 
      yeti.keyboard.b      = keys[SDLK_SPACE];
 
      yeti.keyboard.l      = keys[SDLK_a];
 
      yeti.keyboard.r      = keys[SDLK_y];
 
      yeti.keyboard.select = keys[SDLK_ESCAPE];
 
      done = keys[SDLK_e];
 
      #endif
 
   }
 
 
   //cierre ordenado
 
   SDL_JoystickClose(caanooController); | 	  
 
 
Потом при необходимости проверить нажатия анализируются уже виртуальные кнопки yeti.keyboard.кнопка и их комбинации. _________________ Просто Вовк | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		Hahahoj
  Site Admin
  
  Пол:    Возраст: 52 Зарегистрирован: 08.10.2008 Сообщения: 1848
  Группы:  
 
  | 
		
			
			 
			
				
  | 
			 
			
				Otto Baynes ну как, получилось? _________________ Просто Вовк | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		Otto Baynes
  Постоялец
 
  Пол:    Возраст: 38 Зарегистрирован: 19.01.2012 Сообщения: 42
  Группы: Нет
 
  | 
		 | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		Hahahoj
  Site Admin
  
  Пол:    Возраст: 52 Зарегистрирован: 08.10.2008 Сообщения: 1848
  Группы:  
 
  | 
		
			
			 
			
				
  | 
			 
			
				12345 _________________ Просто Вовк | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		Otto Baynes
  Постоялец
 
  Пол:    Возраст: 38 Зарегистрирован: 19.01.2012 Сообщения: 42
  Группы: Нет
 
  | 
		
			
			 
			
				
  | 
			 
			
				Сделал почти как в Yeti, все равно у меня не совсем адекватно на джойстик реагирует, иногда глав.герой останавливается при отжатии кнопки, иногда нет. Если например нажать резко вправо и сразу отпустить он будет бежать не останавливаясь.
 
 
На случай если кому-то интересно как это сейчас выглядит выкложил бинарники для кену (для тех у кого дорогой трафик: осторожно, игра весит 6.5 мегабайт, при том что она еще не рабочая)
 
http://wiz.rusbase.net/forum/files/otto/meandmyshadow.zip _________________ Мой блог
 
Мой эмулятор CHIP-8 и Super CHIP | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
	
	
	
		 |