//-------------------補助関数--------------------------------- int Next(){ if( GetInputEvent( INP_B0 )) return 1; if( GetInputEvent( INP_B2 )) return 1; if( GetInputState( INP_B6 )) return 1; return 0; }
/********************************************************************** * 函数名称: AutoPlayThreadFunction * 功能描述: "连播页面"的主线程函数: 用于读取输入数据 * 输入参数: ptParentPageParams - 内含上一个页面(父页面)的参数 * 输出参数: 无 * 返 回 值: 无 * 修改日期 版本号 修改人 修改内容 * ----------------------------------------------- * 2013/02/08 V1.0 韦东山 创建 ***********************************************************************/ static void AutoPageRun(PT_PageParams ptParentPageParams) { T_InputEvent tInputEvent; int iRet; char *pcTmp; g_bAutoPlayThreadShouldExit = 0; /* 获得配置值: 显示哪一个目录下的文件, 显示图片的间隔 */ GetPageCfg(&g_tPageCfg); /* 如果ptParentPageParams.strCurPictureFile[0] != '\0' * 自动播放这个目录下的图片: ptParentPageParams.strCurPictureFile */ if (ptParentPageParams->strCurPictureFile[0] != '\0') { strcpy(g_tPageCfg.strSeletedDir, ptParentPageParams->strCurPictureFile); pcTmp = strrchr(g_tPageCfg.strSeletedDir, '/'); *pcTmp = '\0'; } /* 1. 启动一个线程来连续显示图片 */ pthread_create(&g_tAutoPlayThreadID, NULL, AutoPlayThreadFunction, NULL); /* 2. 当前线程等待触摸屏输入, 先做简单点: 如果点击了触摸屏, 让线程退出 */ while (1) { iRet = GetInputEvent(&tInputEvent); if (0 == iRet) { pthread_mutex_lock(&g_tAutoPlayThreadMutex); g_bAutoPlayThreadShouldExit = 1; /* AutoPlayThreadFunction线程检测到这个变量为1后会退出 */ pthread_mutex_unlock(&g_tAutoPlayThreadMutex); pthread_join(g_tAutoPlayThreadID, NULL); /* 等待子线程退出 */ return; } } }
int CPlayer::StepFrame() { int i; VECT former = m_pos; switch(m_state) { case 0://通常状態 //移動処理 if(GetInputState(INP_RIGHT) && GetRight() < SCREEN_WIDTH) m_pos.x += PLAYER_SPEED; while(CollTikei()) { m_pos.x --; if(m_pos.x < 0 && m_muteki==0) { Damage(); break; } } if(GetInputState(INP_LEFT) && GetLeft() > 0) m_pos.x -= PLAYER_SPEED; if(CollTikei()) m_pos.x = former.x; if(GetInputState(INP_DOWN) && GetBottom() < SCREEN_HEIGHT) m_pos.y += PLAYER_SPEED; if(GetInputState(INP_UP) && GetTop() > 0) m_pos.y -= PLAYER_SPEED; if(CollTikei()) m_pos.y = former.y; //ショット if(GetInputState(INP_B0)) { m_shottime++; if(m_shottime%(8-m_power/2) == 0) { g_pResource->sndShot.Play(0); g_pshot.Add(new CPlayerShot(&g_pResource->imgPlayerShot, m_surasuta.GetPos()-VECT(10,5), VECT(20,0))); g_pshot.Add(new CPlayerShot(&g_pResource->imgPlayerShot, m_surasuta.GetPos()+VECT(-10,5), VECT(20,0))); } if(m_shottime%(10) == 0) { if(m_power>0) { g_pshot.Add(new CPlayerShot(&g_pResource->imgSubShot2, GetCenter()+VECT(0,5), VECT(10,3))); g_pshot.Add(new CPlayerShot(&g_pResource->imgSubShot1, GetCenter()-VECT(0,5), VECT(10,-3))); } if(m_power>3) { g_pshot.Add(new CPlayerShot(&g_pResource->imgSubShot2, GetCenter()+VECT(0,5), VECT(10,1.5))); g_pshot.Add(new CPlayerShot(&g_pResource->imgSubShot1, GetCenter()-VECT(0,5), VECT(10,-1.5))); } if(m_power>5) { g_pshot.Add(new CPlayerShot(&g_pResource->imgSubShot2, GetCenter()+VECT(0,5), VECT(10,7))); g_pshot.Add(new CPlayerShot(&g_pResource->imgSubShot1, GetCenter()-VECT(0,5), VECT(10,-7))); } if(m_power>7) { g_pshot.Add(new CPlayerShot(&g_pResource->imgSubShot2, GetCenter()+VECT(0,5), VECT(10,5))); g_pshot.Add(new CPlayerShot(&g_pResource->imgSubShot1, GetCenter()-VECT(0,5), VECT(10,-5))); } } } //無敵処理 if(m_muteki>0) m_muteki--; //吸い込み if(GetInputState(INP_B1)) { for(i=0; i<ITEM_NUM; ++i) if(g_item[i]) g_item[i]->Pull(); for(i=0; i<ENEMYSHOT_NUM; ++i) if(g_enemyShot[i]) g_enemyShot[i]->Pull(GetCenter()); } //当たり判定:アイテム if(m_anmtime%2) for(i=0; i<ITEM_NUM; ++i){ if(g_item[i]){ if(this->IsColl(g_item[i])){ g_pResource->sndItem.Play(0); g_pScore->item ++; g_pScore->score += SCORE_ITEM; m_item++; if(m_item%(80+150*m_power) == 0 && m_power<10) m_power++; SAFE_DELETE(g_item[i]); break; } } } //当たり判定:敵 if(m_muteki==0){ for(i=0; i<ENEMY_NUM; ++i){ if(g_enemy[i]&&g_enemy[i]->GetHP()!=20){ if(this->IsColl2(g_enemy[i])){ Damage(); break; } } } } //当たり判定:敵弾 if(m_muteki==0){ for(i=0; i<ENEMYSHOT_NUM; ++i){ if(g_enemyShot[i]){ if(this->IsColl2(g_enemyShot[i])){ Damage(); break; } } } } //アニメ処理 m_anmtime++; if(m_anmtime==PLAYER_ANMCYCLE) m_anmtime=0; //描画 //本体(無敵でない・無敵中点滅オン・ポーズ寸前) if(m_muteki==0||m_anmtime%5||GetInputEvent(INP_B3)) m_pimg->Draw2(100, m_pos.x, m_pos.y, m_anmtime*3/PLAYER_ANMCYCLE, GetInputState(INP_LEFT)); //スラスタ if(GetInputState(INP_B0) && GetInputState(INP_B1)) //吸い込み+ショット m_surasuta.StepFrame(m_pos,3); else if(GetInputState(INP_B0))//ショット(変形 m_surasuta.StepFrame(m_pos,2); else if(GetInputState(INP_B1))//吸い込み m_surasuta.StepFrame(m_pos,1); else//なんもなし m_surasuta.StepFrame(m_pos,0); break; case 1://出現モーション中 m_anmtime++; m_pos.x += (30.0-m_anmtime)/5; m_pimg->Draw2(100, m_pos); //本体 m_surasuta.StepFrame(m_pos,4); if(m_anmtime > 40) { m_anmtime = 0; m_muteki = PLAYER_MUTEKI; m_state = 0;//通常状態に戻す } break; case 2://死亡モーション(墜落)中 m_anmtime++; m_pos.y += (double)m_anmtime/5; m_pimg->Draw2(100, m_pos, 0, 2); m_surasuta.StepFrame(m_pos,4); if(m_anmtime > 40) { //ゲームオーバーチェックは墜落が終わってから if(m_zanki<0) return 0; m_pos = VECT(-40,105); m_anmtime = 0; m_state = 1; } break; } //残機数描画 for(i=0;i<m_zanki;++i) g_pResource->imgZanki.Draw2(70,130+i*20,215); return 1; }
/* ./show_file [-s Size] [-f freetype_font_file] [-h HZK] <text_file> */ int main(int argc, char **argv) { int iError; unsigned int dwFontSize = 16; char acHzkFile[128]; char acFreetypeFile[128]; char acTextFile[128]; char acDisplay[128]; char cOpr; int bList = 0; T_InputEvent tInputEvent; acHzkFile[0] = '\0'; acFreetypeFile[0] = '\0'; acTextFile[0] = '\0'; strcpy(acDisplay, "fb"); while ((iError = getopt(argc, argv, "ls:f:h:d:")) != -1) { switch(iError) { case 'l': { bList = 1; break; } case 's': { dwFontSize = strtoul(optarg, NULL, 0); break; } case 'f': { strncpy(acFreetypeFile, optarg, 128); acFreetypeFile[127] = '\0'; break; } case 'h': { strncpy(acHzkFile, optarg, 128); acHzkFile[127] = '\0'; break; } case 'd': { strncpy(acDisplay, optarg, 128); acDisplay[127] = '\0'; break; } default: { printf("Usage: %s [-s Size] [-d display] [-f font_file] [-h HZK] <text_file>\n", argv[0]); printf("Usage: %s -l\n", argv[0]); return -1; break; } } } if (!bList && (optind >= argc)) { printf("Usage: %s [-s Size] [-d display] [-f font_file] [-h HZK] <text_file>\n", argv[0]); printf("Usage: %s -l\n", argv[0]); return -1; } iError = DisplayInit(); if (iError) { printf("DisplayInit error!\n"); return -1; } iError = FontsInit(); if (iError) { printf("FontsInit error!\n"); return -1; } iError = EncodingInit(); if (iError) { printf("EncodingInit error!\n"); return -1; } iError = InputInit(); if (iError) { printf("InputInit error!\n"); return -1; } if (bList) { printf("supported display:\n"); ShowDispOpr(); printf("supported font:\n"); ShowFontOpr(); printf("supported encoding:\n"); ShowEncodingOpr(); printf("supported input:\n"); ShowInputOpr(); return 0; } strncpy(acTextFile, argv[optind], 128); acTextFile[127] = '\0'; iError = OpenTextFile(acTextFile); if (iError) { printf("OpenTextFile error!\n"); return -1; } iError = SetTextDetail(acHzkFile, acFreetypeFile, dwFontSize); if (iError) { printf("SetTextDetail error!\n"); return -1; } DBG_PRINTF("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__); iError = SelectAndInitDisplay(acDisplay); if (iError) { printf("SelectAndInitDisplay error!\n"); return -1; } iError = AllInputDevicesInit(); if (iError) { DBG_PRINTF("Error AllInputDevicesInit\n"); return -1; } DBG_PRINTF("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__); iError = ShowNextPage(); DBG_PRINTF("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__); if (iError) { printf("Error to show first page\n"); return -1; } printf("Enter 'n' to show next page, 'u' to show previous page, 'q' to exit: "); while (1) { if (0 == GetInputEvent(&tInputEvent)) { if (tInputEvent.iVal == INPUT_VALUE_DOWN) { ShowNextPage(); } else if (tInputEvent.iVal == INPUT_VALUE_UP) { ShowPrePage(); } else if (tInputEvent.iVal == INPUT_VALUE_EXIT) { return 0; } } } return 0; }