From e749bb55ec455b811ceefd377a305532e19b3ff5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Asr=C4=B1n=20Do=C4=9Fan?= <33391270+Syntriax@users.noreply.github.com> Date: Fri, 13 Sep 2019 17:55:44 +0300 Subject: [PATCH] Added Timer and Settings File There's a timer at the bottom and you can change the resolution or fullscreen mode now --- Images/Numbers.png | Bin 258 -> 3532 bytes README.md | 6 ++ SynGame.c | 239 +++++++++++++++++++++++++++++++++------------ 3 files changed, 184 insertions(+), 61 deletions(-) diff --git a/Images/Numbers.png b/Images/Numbers.png index 20fd34510e7c127977b50e7dd9d0673de49d18e1..cae5a9cc5cd7d54cc623dfc03a19c3140c0d0d8b 100644 GIT binary patch delta 3486 zcmV;P4Po+v0?ZqKiBL{Q4GJ0x0000DNk~Le0000t000052nGNE0O4tL-~a#&w0cxn zbW&k=AaHVTW@&6?Aar?fWgumEX=VTbc-pO)YjWf`4ut>n6ng|d0rEI}M(hpt`1^s9 z-EB`#&ur{eg-d0X#0N5wNXYH~{QJ0n@k-fymy1?uBA!=&Zn?$Im+GHazn{V9`*~kU z-`~R5^Ujy|hsdd9S3dt%dCzaoN3M_W`T361IbVJnsO|TM@%4xP4ixJ^D<~``BoOctQV9~g#^^Kz0$Bm5v-Fs9 z9KaGviHk+XoRRJxTIi13IbNn1^#HRaHyA5aw$cMmRefr zlEgAhM8y=fYtpPmMOCXd?XISpYpGJT*4k=+Z?Pp5w>0vx)z(_?OxhW_b9d*0-bWm1 zc z`4-8F5?N$1a8@wHKrrtR%L$*@{Xnj`B>xO<4j|$`ft)kw{swY?#O+t8t$qt#x(Hbs zT2Or=`%W1r^i!ASMZ|Vpe%pF-P(^OynsJTZSMQD$dWn6mmPSJrldn2XFR0x)2+i7v z;xQW_do=r|I|e&$wx*ja&WZWBlRNZx(ulCT-d&BM1^s4 z;tc201-OP`v0A5Arm3vpPbuMlJ~>fFuw6D*Gj<3IN(~Pxxk17ech9xv$r@LkkuM}a zeka#ickg;!eEGvgV|&pvPv3X`7(s^ONW|Ax$US9rIn^JWj22SJ_S(8{vV*v_3PcK} z)r4lqY->)ORLyCf6^HGSY~JS*ouZnw%p27c{H3xnGq3E%jsqLlmk3OMU5A;ntcXP< zOZEsx-_&$@JXNpuTptOWI>x__a50tBy zHFi6F_IY40ksKrjiWj^q_*5)NNEKgTMC_sOn}5;}hSrMlWnYwpK$X_>sUvN_$}>6_ zsw{`sTp6@#MTPRz9tSpmv}KG(t8!wMmB`Dvv%~=_Nk&iBFFCU_1M4AW*n?}66g;F5 z?pBde%a85t;L)!~1ay+ayN$#y1A>Tb17i&x$#hGKa5Q9dw1B$ZJLaE6fBuJi@GhP~VtFRyC$4P^@K= zj3je2U}f#u_r_pQZX`QhX)h8qz+3!84y|UEno`7N;Lqx{D5=5{76I)e!<7sA+|RK> zY;kI3a^Eyj$h*yv>OQ6}XAC)OZtZ7i>89eu5G13v4*6HbwqKf3C|$X^_K}IVS$Q(? zk!DN6o0e?43;?8mMC#SS45=wSET&MS)CD-810s#k37#L=R8O3!$;^?mY$`ZG+HKZu zto=h$vNzJwJ-Khqr2bHlZ~DQddnx-7y@hF^yIxo=Ly)(HDi|G!O=famtni39)`SoW z(LP|OX~Ps85HhqTISGYSdWyF$_so)bm4F+emSPJ=_`A+$W0=~PHH_H)U-}2Z-Ex!?m-)fF6d13GrlM- zsF;S4OHyioRu>5_YrTVi$e#QCYTg}j=If52waTz;4j2l*`XSdS?n!VbAuByfFm~bH zriM=HX59Jh&4P6iI5mn|H?M$L{7qic77STO_m8MX%Sy-`tfMQ82XDXP?WEa{x zXjPd@=URPc3G^94v7;y52~%e*aZgSCtT-QWf1=JWMEzu34gyGXNCjUz%z<68#>Zue+#SRgK(t3D4S(pwu}O_`S{}SQkumc0vuvT^E6T%Scti3rjSZW zn99I^HnK)k*Vw}jy$ufFJ0?>w7LW6%8evDTgH3p|K~7+8CQjKL?V!6Q>H{SRE193G z=U2gSU!pP7`cEht#U8eQnEeZQzjCNalovwwQ`H_>2Af?0++BfL4PK2}uGa zq?VRsGk&rxwC8QWk8>ptgKd!n=rm!1vjIvnjTN?R&XI^s>X|*Fq1QteQNxq^Q)_p~ z^lNza>rjJU`HV^>GY4BjHltf`$ySkZNt8vf;j-k2XQOH>Pjc+|xd|kQmq3%$$tI+yfvs7$FDRziuPmQLv z&NyPP2-Ja4bQbtF0_pMYMilQ@sMWcJKNy>iMjJ~p)wHyuvn6^I>ofzR!Da)0W?5)B z8~2k)WbM9={5Z4ZxD8xXR+{Zntiy-|mS(-d_ByRvCaR@8qEA@pVQvM<@t9&laSS`K zv(@WaEcj3CpUA&)x61!|mfyt7S-`B=Vh>5uh^g*%4Wl1j+Ge2zGmOzD^h9uCCQ$lL zChD{&1oV`K3Oqt&pxGvyJrz-ZZq}17sJj@u=@S#J5sIXAkhtu!5!T%)Olw-Dln1+M znvJTIgJ?=zFVRu_VYyMnT)z>3n1BUIprSI>x!~Vr|fKfO~RwGqX}3T3T371 z^mSQjnoS;tgh#CW8j#7wISpdH{^)HDni{-aMzxTKBs3+p+6pmB6oI*a0DU4(<|93J z)H1PPl05TT4DV_grh*!c=R*(rH6#@iK`o;--Dan_T04PiPro+fd|HVnw_`&9tD;oB zSBEeUdjy0&n4)E*X!tQJzSc@sH9|H#6CxLC@G}`Po9D`hHT!8CgZrS)uhRB0KPb1Y zbJ7S4)nNL?w#?1;>wWfr>6w|FP<9Q_`5n-0{@0|xflatvF=M^&WQcab zX19L35J+pb+xuW6-coIe{kQVkeNXIXIZtQ!4WI{}Yo}XT*;*T$gPofAFLSF{RjO;I zdV)<}<1}2hiI&7opwahc+eT&2s{qrU(0%4F3FJQ0*J|zTf04R>Mo(0~4zxfHT0^?6 zyrG5TqG*jE#RwA~vI(UvyOWyKxkkZ5NBXf=j+U7oWLlGD@X@ixy%FA$TgTO|?tkR; zrp(sxft*Pgj1_y(XWrMm#5i7u`T7bs#8Mi`;keWwB7PSXI-5zFr;)j-NdBW8Q|y6%O%Cdz`(%k>ERLtq>X@>m4gjPvODZwGWj8o5eKJ`zSz|=k #include #include @@ -11,14 +23,18 @@ #include "allegro\include\allegro5\allegro_acodec.h" #include "allegro\include\allegro5\allegro_image.h" #include "allegro\include\allegro5\allegro_primitives.h" -#define playerSpeed 7.5 +#define playerSpeed 0.75 +#define enemySpeed 0.1 #define initialPlayerHealth 4 -#define bulletSpeed 25 +#define bulletSpeed 2.5 #define numberImageSize 5 #define scoreDigitLimit 11 +#define timerDigitLimit 4 #define enemyLimiter 8 #define initialEnemyLimit 3 #define sampleCount 3 +#define colon 10 +#define numbersLength 11 typedef struct { @@ -78,16 +94,18 @@ void MoveEnemies(); void InitializeEnemies(); void DestroyGame(); void DrawObject(Vector2D position, ALLEGRO_BITMAP *image, int flag); -void DrawSizedObject(Vector2D position, ALLEGRO_BITMAP *image, int flag, float objectSizeMultiplier); +void DrawSizedObject(Vector2D position, ALLEGRO_BITMAP *image, int flag, float objectscreenSizeMultiplier); void DrawScreen(); void DrawScore(); void DrawHighScore(); +void DrawTimer(); void CheckHighScore(); void GetHighScore(); +void GetSettings(); void DrawNumber(Vector2D position, int number); void Inputs(); void PlayerMovement(); -void ClampPlayerPositionToScreen(); +void ClampPlayerPositionToScreenDimensions(); void BulletMovement(); void ShootSoundEffect(); void DieSoundEffect(); @@ -97,7 +115,7 @@ void BulletCollisions(); void Update(); void DestroyGameWindow(); float VectorMagnitude(Vector2D vector); -float VectorDistance(Vector2D vectorFirst, Vector2D vectorSecond); +float VectorDistanceBetween(Vector2D vectorFirst, Vector2D vectorSecond); byte isVectorExceedingLimits(Vector2D vector, Vector2D limits); byte CheckCollision(Vector2D *firstPos, Vector2D *secondPos, ALLEGRO_BITMAP *firstMap, ALLEGRO_BITMAP *secondMap); char InitializeGameWindow(); @@ -106,40 +124,46 @@ char DealDamage(char *health); Vector2D NormalizeVector(Vector2D vector); ALLEGRO_KEYBOARD_STATE keyboardState; -ALLEGRO_DISPLAY *display; ALLEGRO_DISPLAY_MODE disp_data; -ALLEGRO_EVENT_QUEUE *event_queue = NULL; -ALLEGRO_TIMER *timer = NULL; ALLEGRO_COLOR backgroundColor; -ALLEGRO_BITMAP *gameOverImage; +ALLEGRO_DISPLAY *display = NULL; +ALLEGRO_EVENT_QUEUE *event_queue = NULL; +ALLEGRO_TIMER *timer = NULL; +ALLEGRO_BITMAP *gameOverImage = NULL; -ALLEGRO_SAMPLE *BGM; +ALLEGRO_SAMPLE *BGM = NULL; -ALLEGRO_SAMPLE *shootSound; +ALLEGRO_SAMPLE *shootSound = NULL; ALLEGRO_SAMPLE_ID shootSoundID; -ALLEGRO_BITMAP *enemyImage; -ALLEGRO_BITMAP *enemyBulletImage; -ALLEGRO_SAMPLE *enemyDieSound; +ALLEGRO_BITMAP *enemyImage = NULL; +ALLEGRO_BITMAP *enemyBulletImage = NULL; +ALLEGRO_SAMPLE *enemyDieSound = NULL; ALLEGRO_SAMPLE_ID enemyDieSoundID; -ALLEGRO_BITMAP *numberTable; +ALLEGRO_BITMAP *numberTable = NULL; const char *displayName = "Syn Game"; const char *savePath = "Save.syn"; +const char *settingsPath = "Settings.syn"; +const char *settingsFormat = "%d\n%d\n%d"; +int isFullscreen = 1; +int settingsWidth = 1600; +int settingsHeight = 900; const Vector2D referenceScreenDimensions = {160, 90}; -Vector2D screenDimensions = {0, 0}; -Vector2D scorePosition = {0, 0}; -Vector2D highScorePosition = {0, 0}; -float sizeMultiplier; -float timeFromStart; +Vector2D screenDimensions = {0, 0}; +Vector2D scorePosition = {0, 0}; +Vector2D highScorePosition = {0, 0}; +Vector2D timerPosition = {0, 0}; +float screenSizeMultiplier; +float timeSinceStart; const float FPS = 60; double deltaTime; unsigned int enemyRespawnCounter = 0; unsigned int highScore = 0; Vector2D input; -byte isRestart = 0; -byte isRunning = 1; +byte isRestart = 0; +byte isRunning = 1; byte isGameOver = 0; void Update() @@ -176,13 +200,13 @@ void Update() else player.shootCooldown -= deltaTime; - timeFromStart += deltaTime; - player.score = (int)(timeFromStart * timeFromStart) * (player.killedEnemyCount + 1); + timeSinceStart += deltaTime; + player.score = (int)(timeSinceStart * timeSinceStart) * (player.killedEnemyCount + 1); /* To limit enemies on the screen */ if(enemies.enemyLimit != enemyLimiter) { - enemies.enemyLimit = initialEnemyLimit + (int)(timeFromStart / 10); + enemies.enemyLimit = initialEnemyLimit + (int)(timeSinceStart / 10); if(enemies.enemyCount > enemyLimiter) enemies.enemyLimit = enemyLimiter; @@ -215,12 +239,20 @@ void Update() int main(int argc, char **argv) { if(InitializeGameWindow() == 0) + { + DestroyGameWindow(); + getchar(); return 0; + } do { if(InitializeGame() == 0) + { + DestroyGame(); + getchar(); return 0; + } while (isRunning && !isRestart) { @@ -262,7 +294,7 @@ float VectorMagnitude(Vector2D vector) return sqrt(vector.x * vector.x + vector.y * vector.y); } -float VectorDistance(Vector2D vectorFirst, Vector2D vectorSecond) +float VectorDistanceBetween(Vector2D vectorFirst, Vector2D vectorSecond) { Vector2D difference; difference.x = abs(vectorFirst.x - vectorSecond.x); @@ -296,9 +328,9 @@ byte CheckCollision(Vector2D *firstPos, Vector2D *secondPos, ALLEGRO_BITMAP *fir minDistance = firstImageSize.x > firstImageSize.y ? firstImageSize.y : firstImageSize.x; minDistance += secondImageSize.x > secondImageSize.y ? secondImageSize.y : secondImageSize.x; - minDistance *= sizeMultiplier * 0.5f; + minDistance *= screenSizeMultiplier * 0.5f; - distance = VectorDistance(*firstPos, *secondPos); + distance = VectorDistanceBetween(*firstPos, *secondPos); result = distance <= minDistance; return result; @@ -317,18 +349,28 @@ char InitializeGameWindow() !al_reserve_samples(sampleCount)) return 0; - al_get_display_mode(al_get_num_display_modes() - 1, &disp_data); - al_set_new_display_flags(ALLEGRO_FULLSCREEN); + GetSettings(); - x = disp_data.width; - y = disp_data.height; - /* x = 1600; */ - /* y = 900; */ + if(isFullscreen == 1) + { + al_get_display_mode(al_get_num_display_modes() - 1, &disp_data); + al_set_new_display_flags(ALLEGRO_FULLSCREEN); - screenDimensions = (Vector2D){x, y}; - scorePosition = (Vector2D){x * (float)0.05, y * (float)0.05}; - highScorePosition = (Vector2D){x * (float)0.95, y * (float)0.05}; - sizeMultiplier = screenDimensions.x / referenceScreenDimensions.x; + x = disp_data.width; + y = disp_data.height; + } + else + { + x = settingsWidth; + y = settingsHeight; + } + + screenDimensions = (Vector2D){x, y}; + scorePosition = (Vector2D){x * (float)0.05, y * (float)0.05}; + highScorePosition = (Vector2D){x * (float)0.95, y * (float)0.05}; + timerPosition = (Vector2D){x * (float)0.5 , y * (float)0.95}; + + screenSizeMultiplier = screenDimensions.x / referenceScreenDimensions.x; display = al_create_display(screenDimensions.x, screenDimensions.y); if(display == NULL) @@ -368,8 +410,8 @@ char InitializeGameWindow() char InitializeGame() { - shootSound = al_load_sample("Sounds/Shoot.wav"); - enemyDieSound = al_load_sample("Sounds/Die.wav"); + shootSound = al_load_sample("Sounds/Shoot.wav"); + enemyDieSound = al_load_sample("Sounds/Die.wav"); InitializeEnemies(); GetHighScore(); @@ -377,22 +419,25 @@ char InitializeGame() /* Player Initialization */ player.position.x = screenDimensions.x / 2; player.position.y = screenDimensions.y / 2; - player.moveSpeed = playerSpeed; + player.moveSpeed = playerSpeed * screenSizeMultiplier; player.shootPerSecond = 10; player.health = initialPlayerHealth; player.playerImage = al_load_bitmap("Images/Player.png"); - bullets.bulletCount = 0; - bullets.bulletArray = (Bullet *) malloc(sizeof(Bullet) * bullets.bulletCount); + if(player.playerImage == NULL || shootSound == NULL || enemyDieSound == NULL) return 0; + + bullets.bulletCount = 0; + bullets.bulletArray = (Bullet *) malloc(sizeof(Bullet) * bullets.bulletCount); + /* Game Initialization */ isRunning = 1; isRestart = 0; isGameOver = 0; - timeFromStart = 0; + timeSinceStart = 0; player.killedEnemyCount = 0; return 1; } @@ -434,10 +479,10 @@ void SpawnEnemies() enemyVelocity.x *= randomNumber % 2 == 0 ? -1 : 1; enemyVelocity.y *= randomNumber % 4 >= 2 ? -1 : 1; - speed = (float)(randomNumber % 500 / 100 + 2); + speed = (float)(randomNumber % 500 / 100 + 2) * enemySpeed; enemy = (enemies.enemyArray + enemies.enemyCount - 1); enemy -> velocity = NormalizeVector(enemyVelocity); - enemy -> moveSpeed = speed; + enemy -> moveSpeed = speed * screenSizeMultiplier; enemySpawnVector.x = enemyVelocity.x > 0 ? 0 : screenDimensions.x; enemySpawnVector.y = enemyVelocity.y > 0 ? 0 : screenDimensions.y; @@ -522,8 +567,8 @@ void DrawObject(Vector2D position, ALLEGRO_BITMAP *image, int flag) al_draw_scaled_bitmap(image, 0, 0, InstantiateSize.x, InstantiateSize.y, - position.x - InstantiateSize.x / 2 * sizeMultiplier, position.y - InstantiateSize.y / 2 * sizeMultiplier, - InstantiateSize.x * sizeMultiplier, InstantiateSize.y * sizeMultiplier, flag); + position.x - InstantiateSize.x / 2 * screenSizeMultiplier, position.y - InstantiateSize.y / 2 * screenSizeMultiplier, + InstantiateSize.x * screenSizeMultiplier, InstantiateSize.y * screenSizeMultiplier, flag); } void DrawNumber(Vector2D position, int number) @@ -532,18 +577,18 @@ void DrawNumber(Vector2D position, int number) float numberFactor; InstantiateSize.x = (float)al_get_bitmap_width(numberTable); InstantiateSize.y = (float)al_get_bitmap_height(numberTable); - numberFactor = InstantiateSize.x / 10.0; + numberFactor = InstantiateSize.x / numbersLength; al_draw_scaled_bitmap(numberTable, numberFactor * number, 0, numberFactor, InstantiateSize.y, - position.x - numberFactor / 2 * sizeMultiplier, position.y - InstantiateSize.y / 2 * sizeMultiplier, - numberFactor * sizeMultiplier, InstantiateSize.y * sizeMultiplier, 0); + position.x - numberFactor / 2 * screenSizeMultiplier, position.y - InstantiateSize.y / 2 * screenSizeMultiplier, + numberFactor * screenSizeMultiplier, InstantiateSize.y * screenSizeMultiplier, 0); } -void DrawSizedObject(Vector2D position, ALLEGRO_BITMAP *image, int flag, float objectSizeMultiplier) +void DrawSizedObject(Vector2D position, ALLEGRO_BITMAP *image, int flag, float objectscreenSizeMultiplier) { Vector2D InstantiateSize; - float sizeFactor = sizeMultiplier * objectSizeMultiplier; + float sizeFactor = screenSizeMultiplier * objectscreenSizeMultiplier; InstantiateSize.x = (float)al_get_bitmap_width(image); InstantiateSize.y = (float)al_get_bitmap_height(image); @@ -574,6 +619,7 @@ void DrawScreen() DrawScore(); DrawHighScore(); + DrawTimer(); } void DrawScore() @@ -588,7 +634,7 @@ void DrawScore() { spawnPosition = scorePosition; /* numberImageSize + 1 is because 1 pixel space between digits */ - spawnPosition.x += sizeMultiplier * (numberImageSize + 1) * i; + spawnPosition.x += screenSizeMultiplier * (numberImageSize + 1) * i; digit = processedScore % 10; processedScore = (int)(processedScore / 10); DrawNumber(spawnPosition, digit); @@ -608,7 +654,7 @@ void DrawHighScore() { spawnPosition = highScorePosition; /* numberImageSize + 1 is because 1 pixel space between digits */ - spawnPosition.x -= sizeMultiplier * (numberImageSize + 1) * i; + spawnPosition.x -= screenSizeMultiplier * (numberImageSize + 1) * i; digit = processedScore % 10; processedScore = (int)(processedScore / 10); DrawNumber(spawnPosition, digit); @@ -616,6 +662,55 @@ void DrawHighScore() } } +void DrawTimer() +{ + int seconds = (int)timeSinceStart % 60; + int minutes = (timeSinceStart - seconds) / 60; + char digit; + Vector2D spawnPosition; + int i = -timerDigitLimit / 2; + + /* while (processedScore >= 1 && i > 0) */ + while (i < 0) + { + + spawnPosition = timerPosition; + /* numberImageSize + 1 is because 1 pixel space between digits */ + spawnPosition.x -= screenSizeMultiplier * (numberImageSize + 1) * i; + + digit = seconds % 10; + seconds = (int)(seconds / 10); + DrawNumber(spawnPosition, digit); + i++; + } + + spawnPosition = timerPosition; + /* numberImageSize + 1 is because 1 pixel space between digits */ + spawnPosition.x -= screenSizeMultiplier * (numberImageSize + 1) * i; + DrawNumber(spawnPosition, colon); + i++; + + while (i < (timerDigitLimit / 2) + 1) + { + + spawnPosition = timerPosition; + /* numberImageSize + 1 is because 1 pixel space between digits */ + spawnPosition.x -= screenSizeMultiplier * (numberImageSize + 1) * i; + + if(i == 0) + { + DrawNumber(spawnPosition, colon); + i++; + continue; + } + + digit = minutes % 10; + minutes = (int)(minutes / 10); + DrawNumber(spawnPosition, digit); + i++; + } +} + void CheckHighScore() { FILE *saveFile; @@ -649,7 +744,28 @@ void GetHighScore() fread(&highScore, sizeof(highScore), 1, saveFile); fclose(saveFile); - printf("Get Highscore = %d\n", highScore); +} + +void GetSettings() +{ + printf("Getting Settings\n"); + FILE *settingsFile = fopen(settingsPath, "r"); + if(settingsFile == NULL) + { + printf("!!!!Error Reading Settings!!!!\n"); + settingsFile = fopen(settingsPath, "w"); + if(settingsFile == NULL) + printf("!!!!Error Creating Settings!!!!\n"); + else + { + fprintf(settingsFile, settingsFormat, isFullscreen, settingsWidth, settingsHeight); + fclose(settingsFile); + } + return; + } + + fscanf(settingsFile, settingsFormat, &isFullscreen, &settingsWidth, &settingsHeight); + fclose(settingsFile); } void Inputs() @@ -682,10 +798,10 @@ void PlayerMovement() player.position.x += input.x * player.moveSpeed; player.position.y += input.y * player.moveSpeed; - ClampPlayerPositionToScreen(); + ClampPlayerPositionToScreenDimensions(); } -void ClampPlayerPositionToScreen() +void ClampPlayerPositionToScreenDimensions() { if(player.position.x < 0) player.position.x = 0; @@ -733,12 +849,13 @@ void PlayerShoot() { Vector2D shootDir; Bullet *newBullet; - float offset = (al_get_bitmap_width(player.playerImage) + al_get_bitmap_width(enemyBulletImage) * 2.0 * sizeMultiplier); + float offset = (al_get_bitmap_width(player.playerImage) + al_get_bitmap_width(enemyBulletImage) * 2.0 * screenSizeMultiplier); if(player.lookDirection != 1) offset = -offset; shootDir.x = player.lookDirection == 1 ? bulletSpeed : -bulletSpeed; + shootDir.x *= screenSizeMultiplier; shootDir.y = 0; player.shootCooldown = 1 / (float)player.shootPerSecond; @@ -760,7 +877,7 @@ void EnemyShoot() Enemy *enemy; Bullet *bullet; int i; - float offset = (al_get_bitmap_width(player.playerImage) + al_get_bitmap_width(enemyBulletImage) * 2.0 * sizeMultiplier); + float offset = (al_get_bitmap_width(player.playerImage) + al_get_bitmap_width(enemyBulletImage) * 2.0 * screenSizeMultiplier); for (i = 0; i < enemies.enemyCount; i++) { @@ -774,7 +891,7 @@ void EnemyShoot() shootDir = NormalizeVector(shootDir); normalizedVec = shootDir; - shootDir = (Vector2D){shootDir.x * bulletSpeed, shootDir.y * bulletSpeed}; + shootDir = (Vector2D){shootDir.x * bulletSpeed * screenSizeMultiplier, shootDir.y * bulletSpeed * screenSizeMultiplier}; enemy -> fireCooldown = 1.0 / (rand() % 5) + 2.0; bullets.bulletCount++;