void Slowing( int& gauge, // 슬로우 상태로 전환하기 위해 필요한 게이지 bool button // 슬로우 버튼을 눌렀는지 나타내는 플래그 ) { // 타이머: // 슬로우 상태일 때 행동회수를 조절하기 위해 사용함. static int time=1; // 적기와 탄을 이동시킴: // 보통 상태일 때는 매번 이동시키고 // 슬로우 상태일 때는 2번에 1번만 움직임. // 이동의 구체적인 처리는 // MoveEnemy, MoveBullet 함수에서 수행하기로 함. if (!button || (gauge>0 && time==0)) { MoveEnemy(); MoveBullet(); } // 페널티: // 게이지가 0인데 슬로우 버튼을 눌렀다면 // 페널티로서 탄을 1번 더 이동시킴. // 결과적으로 탄이 2배의 속도로 움직이게 됨. if (button && gauge==0) { MoveBullet(); } // 타이머의 갱신 if (time>0) time--; else time=1; }
int main() { app.window.create(sf::VideoMode(800,600,32),"Window"); app.window.setFramerateLimit(60); void ProcessInput(); void EndProgram(); void DrawBullet(int numOfBullets); void MoveBullet(int numOfBullets); while (app.window.isOpen()) { app.window.clear(); //Clear the screen app.window.draw(player.sprite); //Draw the player DrawBullet(app.totalBullets); //Draw the existing bullets app.window.display(); //Display the sprites ProcessInput(); //Process the user's input MoveBullet(app.totalBullets); //Move the existing bullets if (player.canShoot == false) app.CheckBulletClock(); //The player cannot shoot at any given time. There should EndProgram(); //Check if the user wishes to exit (it's separated from ProcessInput } return 0; }
void UpdateBullets( ) { UINT32 uiCount; LEVELNODE *pNode; BOOLEAN fDeletedSome = FALSE; for ( uiCount = 0; uiCount < guiNumBullets; uiCount++ ) { if ( gBullets[ uiCount ].fAllocated) { if (gBullets[ uiCount ].fReal && !( gBullets[ uiCount ].usFlags & BULLET_STOPPED ) ) { // there are duplicate checks for deletion in case the bullet is deleted by shooting // someone at point blank range, in the first MoveBullet call in the FireGun code if ( gBullets[ uiCount ].fToDelete ) { // Remove from old position gBullets[ uiCount ].fAllocated = FALSE; fDeletedSome = TRUE; continue; } //if ( !( gGameSettings.fOptions[ TOPTION_HIDE_BULLETS ] ) ) { // ALRIGHTY, CHECK WHAT TYPE OF BULLET WE ARE if ( gBullets[ uiCount ].usFlags & ( BULLET_FLAG_CREATURE_SPIT | BULLET_FLAG_KNIFE | BULLET_FLAG_MISSILE | BULLET_FLAG_SMALL_MISSILE | BULLET_FLAG_TANK_CANNON | BULLET_FLAG_FLAME /*| BULLET_FLAG_TRACER*/ ) ) { } else { RemoveStruct( gBullets[ uiCount ].sGridNo, BULLETTILE1 ); RemoveStruct( gBullets[ uiCount ].sGridNo, BULLETTILE2 ); } } //afp-start // remove old tail first if exists FIXEDPT lastX = gBullets[uiCount].qCurrX; FIXEDPT lastY = gBullets[uiCount].qCurrY; FIXEDPT lastZ = gBullets[uiCount].qCurrZ; for (int i = 0; i < BULLET_TRACER_MAX_LENGTH; i++) if (gBullets[uiCount].pNodes[i] != NULL) { RemoveStructFromLevelNode(gBullets[ uiCount ].sGridNo, gBullets[uiCount].pNodes[i]); gBullets[uiCount].pNodes[i] = NULL; } //afp-end MoveBullet( uiCount ); if ( gBullets[ uiCount ].fToDelete ) { // Remove from old position gBullets[ uiCount ].fAllocated = FALSE; fDeletedSome = TRUE; continue; } if ( gBullets[ uiCount ].usFlags & BULLET_STOPPED ) { continue; } // Display bullet //if ( !( gGameSettings.fOptions[ TOPTION_HIDE_BULLETS ] ) ) { if ( gBullets[ uiCount ].usFlags & ( BULLET_FLAG_KNIFE ) ) { if ( gBullets[ uiCount ].pAniTile != NULL ) { gBullets[ uiCount ].pAniTile->sRelativeX = (INT16) FIXEDPT_TO_INT32( gBullets[ uiCount ].qCurrX ); gBullets[ uiCount ].pAniTile->sRelativeY = (INT16) FIXEDPT_TO_INT32( gBullets[ uiCount ].qCurrY ); gBullets[ uiCount ].pAniTile->pLevelNode->sRelativeZ = (INT16) CONVERT_HEIGHTUNITS_TO_PIXELS( FIXEDPT_TO_INT32( gBullets[ uiCount ].qCurrZ ) ); if ( gBullets[ uiCount ].usFlags & ( BULLET_FLAG_KNIFE ) ) { gBullets[ uiCount ].pShadowAniTile->sRelativeX = (INT16) FIXEDPT_TO_INT32( gBullets[ uiCount ].qCurrX ); gBullets[ uiCount ].pShadowAniTile->sRelativeY = (INT16) FIXEDPT_TO_INT32( gBullets[ uiCount ].qCurrY ); } } } // Are we a missle? else if ( gBullets[ uiCount ].usFlags & ( BULLET_FLAG_MISSILE | BULLET_FLAG_SMALL_MISSILE | BULLET_FLAG_TANK_CANNON | BULLET_FLAG_FLAME | BULLET_FLAG_CREATURE_SPIT ) ) { } /* else if ( gBullets[ uiCount ].usFlags & ( BULLET_FLAG_TRACER ) ) { ManLooksForOtherTeams(gBullets[ uiCount ].pFirer); } */ /* else if (fTracer == TRUE) { ManLooksForOtherTeams(gBullets[ uiCount ].pFirer); } */ else { pNode = AddStructToTail( gBullets[ uiCount ].sGridNo, BULLETTILE1 ); pNode->ubShadeLevel=DEFAULT_SHADE_LEVEL; pNode->ubNaturalShadeLevel=DEFAULT_SHADE_LEVEL; pNode->uiFlags |= ( LEVELNODE_USEABSOLUTEPOS | LEVELNODE_IGNOREHEIGHT ); pNode->sRelativeX = (INT16) FIXEDPT_TO_INT32( gBullets[ uiCount ].qCurrX ); pNode->sRelativeY = (INT16) FIXEDPT_TO_INT32( gBullets[ uiCount ].qCurrY ); pNode->sRelativeZ = (INT16) CONVERT_HEIGHTUNITS_TO_PIXELS( FIXEDPT_TO_INT32( gBullets[ uiCount ].qCurrZ ) ); //afp-start - add new tail /tracer // HEADROCK HAM 5: No tail for fragments. if (gGameSettings.fOptions[TOPTION_ALTERNATE_BULLET_GRAPHICS] && gBullets[ uiCount ].fFragment == false) { if ((lastX != 0) || (lastY != 0)) { // qIncrX can be used to calculate slope and make the tracer longer if necessary PointsPath((INT16) FIXEDPT_TO_INT32( gBullets[ uiCount ].qCurrX), (INT16) FIXEDPT_TO_INT32( gBullets[ uiCount ].qCurrY), (INT16) FIXEDPT_TO_INT32( lastX), (INT16) FIXEDPT_TO_INT32( lastY)); // compute valid points allong the fire line int pointsCount = 0; for (int i = 0; i < BULLET_TRACER_MAX_LENGTH; i++) { pointsCount = i; if (gXPATH[i] == 0) if (gYPATH[i] == 0) break; } if (pointsCount <= 0) pointsCount = 30; for (int i = 0; i < BULLET_TRACER_MAX_LENGTH; i++) { if (gXPATH[i] == 0) if (gYPATH[i] == 0) break; // add all points along the path between bullets as bullets pNode = AddStructToTail( gBullets[ uiCount ].sGridNo, BULLETTILE1 ); pNode->ubShadeLevel=DEFAULT_SHADE_LEVEL; pNode->ubNaturalShadeLevel=DEFAULT_SHADE_LEVEL; pNode->uiFlags |= ( LEVELNODE_USEABSOLUTEPOS | LEVELNODE_IGNOREHEIGHT ); pNode->sRelativeX = gXPATH[i]; pNode->sRelativeY = gYPATH[i]; FIXEDPT relativeZ = lastZ - ((i + 1) * ((gBullets[ uiCount ].qCurrZ - lastZ) / (pointsCount))); pNode->sRelativeZ = (INT16) CONVERT_HEIGHTUNITS_TO_PIXELS( FIXEDPT_TO_INT32( relativeZ)); // store structure pointer to clear image at the next bullet position gBullets[uiCount].pNodes[i] = pNode; } } } //afp-end // Display shadow // afp - no more shadow if tracer enabled if (!gGameSettings.fOptions[TOPTION_ALTERNATE_BULLET_GRAPHICS]) { pNode = AddStructToTail( gBullets[ uiCount ].sGridNo, BULLETTILE2 ); pNode->ubShadeLevel=DEFAULT_SHADE_LEVEL; pNode->ubNaturalShadeLevel=DEFAULT_SHADE_LEVEL; pNode->uiFlags |= ( LEVELNODE_USEABSOLUTEPOS | LEVELNODE_IGNOREHEIGHT ); pNode->sRelativeX = (INT16) FIXEDPT_TO_INT32( gBullets[ uiCount ].qCurrX ); pNode->sRelativeY = (INT16) FIXEDPT_TO_INT32( gBullets[ uiCount ].qCurrY ); pNode->sRelativeZ = (INT16)gpWorldLevelData[ gBullets[ uiCount ].sGridNo ].sHeight; } } } } else { if ( gBullets[ uiCount ].fToDelete ) { gBullets[ uiCount ].fAllocated = FALSE; fDeletedSome = TRUE; } } } } if ( fDeletedSome ) { RecountBullets( ); } }