ソースをコピー | HTMLをコピー//クロック:FREQ-ロジック、FPS-レンダリングconst int FREQ = 1000/40; // 1000 / FPSconst int MAX_FPS = 1000/180;
ソースをコピー | HTMLをコピーwhile( true ){qint64 time_cur_tick = QDateTime :: currentMSecsSinceEpoch();int numLoops = 0 ;bool ft = true;while( time_prev_tick <time_cur_tick && numLoops <MAX_LOOPS ){//呼び出しロジックw-> UpdateLogic( 1 / FREQ );numLoops ++;if( ft ){ft = false;last_freq = time_cur_tick;}time_prev_tick + = FREQ;//より正確なタイミングのためにtime_cur_tickを更新しますtime_cur_tick = QDateTime :: currentMSecsSinceEpoch();}time_tmp = QDateTime :: currentMSecsSinceEpoch();w-> SimulateConsistLogic( (float )( time_tmp-last_freq )/ FREQ);time_tmp = QDateTime :: currentMSecsSinceEpoch();if( time_tmp-time_lastrender> = MAX_FPS &&w-> paint_mx.tryLock( )){time_lastrender = time_tmp;float freq_bit = 0 ;if( time_tmp!= last_freq )freq_bit =( float )( time_tmp-last_freq )/ FREQ;signalGUI( freq_bit )を発行します。w-> paint_mx.unlock();}}
ソースをコピー | HTMLをコピーvoid MainWindow :: UpdateLogic( float ftime ){フロート速度= 2 ;for( int i = 0; i <m_dir.size( ); i ++){if( m_dir [i] == MainWindow :: UP )actor1.adjust Direction ( QVector2D(0、-speed ));if( m_dir [i] == MainWindow :: DOWN )actor1.adjust Direction ( QVector2D(0、speed ));if( m_dir [i] == MainWindow :: LEFT )actor1.adjust Direction ( QVector2D(-speed、0 ));if( m_dir [i] == MainWindow :: RIGHT )actor1.adjust Direction ( QVector2D(speed、0 ));if( m_dir [i] == MainWindow :: SPACE &&m_allowbullet == 0 ){m_bullets.push_back( CBullet(actor1.getX( )、actor1.getY()- 1 、QVector2D( 0、-15 )));qDebug( QString( "追加された箇条書き 。Pos %1" ).arg( m_bullets.size( )- 1 ).toAscii());m_allowbullet = 5 ;解雇++;}}actor1.step Direction ();bool dir_touched = false;for( int i = 0; i <m_dir.size( ); i ++){if( m_dir [i]!= MainWindow :: SPACE ){dir_touched = true;休憩;}}if( !dir_touched ){m_allowmove = 0 ;フロート慣性= 0 。 5 ;if( actor1.getSpeed( )< 0。5 )慣性= 1 ;actor1.adjustSpeed( 慣性 );}for( int i = 0; i <m_bullets.size( ); i ++)m_bullets [ i ] .step Direction ();for( int x = 0; x <m_enemies1.size( ); x ++)m_enemies1 [x] .step Direction ();CheckGameRules();if( m_enemies1.size( )<max_enemies){CMeteorite meteo( mrand(field_ident + CMeteorite :: meteo_size、field_ident + field_w-CMeteorite :: meteo_size )、-mrand(0、20)、QVector2D( 0、1 ));while( true ){int i = 0 ;while( i <m_enemies1.size( )){if( meteo.getBoundsT( ).intersects( m_enemies1 [i] .getBoundsT( )))休憩;i ++;}if( i == m_enemies1.size( ))休憩;meteo = CMeteorite(mrand( 1、100 )、-mrand(0、20)、QVector2D( 0、1 ));}m_enemies1.push_back( meteo );}UpdateBullet();}
ソースをコピー | HTMLをコピーvoid MainWindow :: CheckGameRules( const float ftime ){QRect field_rect( field_ident、field_ident、field_wfield_h );for( int i = 0; i <m_bullets.size( ); i ++){CBullet blt = m_bullets [ i ];float tx = 0 、ty = 0 ;blt.getTickCoords( ftime、tx、ty );blt.setX( tx );blt.setY( ty );if( !field_rect.contains(m_bullets [i] .getX( )、m_bullets [ i ] .getY())){m_bullets.remove( i-- );}他に{for( int j = 0; j <m_enemies1.size( ); j ++){CMeteorite enm = m_enemies1 [j];フロート etx = 0 、ety = 0 ;enm.getTickCoords( ftime、etx、ety );enm.setX( etx );enm.setY(ety);if( blt.checkCollision(enm.getBodyT( ))){m_enemies1.remove( j-- );m_bullets.remove( i-- );スコア++;休憩;}} // for}}for( int j = 0; j <m_enemies1.size( ); j ++){CMeteorite enm = m_enemies1 [j];if( !field_rect.contains(enm.getBoundsT( ))&&field_rect。 bottomRight ().y()<enm.getBoundsT()。 topLeft (). y ()){m_enemies1.remove( j-- );}if( actor1.checkCollision(enm.getBodyT( ))){m_enemies1.remove( j-- );ヒット++;}}if( !field_rect.contains(actor1.getBoundsT( )、true)){while( field_rect.x( )> = actor1.getBoundsT()。 left ())actor1.setX( actor1.getX( )+ 1 );while( field_rect.x( )* 2 + field_rect。width()<= actor1.getBoundsT()。x()+ actor1.getBoundsT()。 width ())actor1.setX( actor1.getX( )- 1 );while( field_rect.top( )> = actor1.getBoundsT()。 top ())actor1.setY( actor1.getY( )+ 1 );while( field_rect.y( )* 2 + field_rect。height()<= actor1.getBoundsT()。y()+ actor1.getBoundsT()。 height ())actor1.setY( actor1.getY( )- 1 );actor1.s top ();}}
ソースをコピー | HTMLをコピーvoid MainWindow :: SimulateConsistLogic( float ftime ){for( float bt = 0; bt <ftime; bt = bt + 0.1 ){CheckGameRules( bt );}}
ソースをコピー | HTMLをコピーvoid MainWindow :: Render(){QPainter qpainter( これ );const int bgw = 2 ;qpainter.setPen( QPen(Qt :: black、bgw ));qpainter.setBrush( QBrush(Qt :: darkGray ));qpainter.drawRect( field_ident、field_ident、field_w + field_ident、field_h + field_ident );for( int i = 0; i <m_bullets.size( ); i ++){CBullet blt = m_bullets [ i ];blt.Draw( qpainter、freq_bit );}for( int i = 0; i <m_enemies1.size( ); i ++){CMeteorite enm = m_enemies1 [ i ];enm.Draw( qpainter、freq_bit );}actor1.Draw( qpainter、freq_bit );QPalette pal;qpainter.setBrush( pal.brush(QPalette :: Window ));qpainter.setPen( QPen(pal.color(QPalette :: Window )、 1 ));qpainter.drawRect( field_ident-bgw / 2、0、field_w + field_ident + bgw / 2field_ident-bgw );qpainter.setPen( QPen(Qt :: black、bgw ));qpainter.setBrush( QBrush(Qt :: darkGray、Qt :: NoBrush ));qpainter.drawRect( field_ident、field_ident、field_w + field_ident、field_h + field_ident );ui-> label_freq-> setText( QString( "%1" ).arg( freq ).toAscii());ui-> label_fps-> setText( QString( "%1" ).arg( fps ).toAscii());ui-> label_speed-> setText( QString( "%1" ).arg( actor1.getSpeed( )).toAscii());ui-> label_score-> setText( QString( "%1" ).arg( score ).toAscii());ui-> label_fired-> setText( QString( "%1" ).arg(発生).toAscii());ui-> label_hits-> setText( QString( "%1" ).arg( ヒット ).toAscii());}
Source: https://habr.com/ru/post/J124495/More articles:イノベーションゲームRussiAコミュニティの立ち上げAdsenseがオンラインゲームに登場.NET Remotingによるリモートマウスコントロール適切なDDoS DeflateセットアップTruecryptは150,000ドルを調達しますが、なぜですか?DHTネットワークでトレントを検索W3Cダイジェスト。 CSS3の新機能。 課題2GoogleがImageAmericaを買収して、マッピングサービスを開発テスター向けの予算トレーニングの7つの方法講演「SilverLightの紹介」All Articles