====== Part 20 - Text and Game Over ====== For our last hurrah, we'll add a score object in the top left corner of the screen and increase it for each monster shot and when the star is collected. First the score text, graphic and object: [ScoreText] String = 000 [ScoreGraphic] Text = ScoreText Pivot = top left [ScoreObject] Graphic = ScoreGraphic Position = (-380, -280, 0) Scale = 2 Interesting to note the special ''Text'' definition. ''ScoreGraphic'' uses this instead of a texture from file. And the ''ScoreObject'' uses the graphic section as others before. Now, in code, add a score variable and a scoreObject at the top of the file: orxOBJECT *hero; orxOBJECT *herosGun; orxOBJECT *scoreObject; orxS16 score = 0; Next, create a score object and assign it to the scoreObject variable in the Init() function: hero = orxObject_CreateFromConfig("HeroObject"); herosGun = (orxOBJECT*)orxObject_GetChild(hero); scoreObject = orxObject_CreateFromConfig("ScoreObject"); Add a little function to increase the score and update the ScoreObject: void UpdateScore(int increase){ score += increase; orxCHAR formattedScore[6]; orxString_NPrint(formattedScore, sizeof(formattedScore), "%d", score); orxObject_SetTextString(scoreObject, formattedScore); } Add 250 points whenever a monster is hit with a bullet. Add UpdateScore() function calls to: if (orxString_Compare(senderObjectName, "BulletObject") == 0){ CreateExplosionAtObject(pstRecipientObject, "JellyExploder"); orxObject_SetLifeTime(pstSenderObject, 0); orxObject_SetLifeTime(pstRecipientObject, 0); UpdateScore(250); } if (orxString_Compare(recipientObjectName, "BulletObject") == 0){ CreateExplosionAtObject(pstSenderObject, "JellyExploder"); orxObject_SetLifeTime(pstSenderObject, 0); orxObject_SetLifeTime(pstRecipientObject, 0); UpdateScore(250); } And of course, 1000 points bonus if the star is reached. Add the following code: if (orxString_Compare(senderObjectName, "StarObject") == 0){ orxObject_SetLifeTime(pstSenderObject, 0); UpdateScore(1000); } if (orxString_Compare(recipientObjectName, "StarObject") == 0){ orxObject_SetLifeTime(pstRecipientObject, 0); UpdateScore(1000); } Compile and run it. Shoot some monsters and collect the star and observe the score increasing. That takes care of having an active score object. A final thing for the game will be to add a game over panel when the hero dies. For this, we'll have an object that gets created using a timeline track after a two second delay. First, a game over asset: {{ tutorials:tracks:gameover.png?nolink |}} Save this into the ''data/texture'' folder as ''gameover.png''. Create a simple gameover graphic and object: [GameOverGraphic] Texture = gameover.png Pivot = center [GameOverObject] Graphic = GameOverGraphic Position = (0, 0, -0.1) Create a timeline track with a single command to create the ''GameOverObject'': [PopUpGameOverTrack] 2 = Object.Create GameOverObject Then finally, change the physics handler code, so that when the hero is destroyed, create the timeline track. After a two second delay, the ''GameOverObject'' will be created on screen: if (orxString_Compare(recipientObjectName, "HeroObject") == 0 && orxString_Compare(senderObjectName, "MonsterObject") == 0 ){ CreateExplosionAtObject(pstRecipientObject, "HeroExploder"); orxObject_SetLifeTime(pstSenderObject, 0); orxObject_Enable(pstRecipientObject, orxFALSE); orxObject_AddTimeLineTrack(scene, "PopUpGameOverTrack"); } if (orxString_Compare(senderObjectName, "HeroObject") == 0 && orxString_Compare(recipientObjectName, "MonsterObject") == 0 ){ CreateExplosionAtObject(pstSenderObject, "HeroExploder"); orxObject_SetLifeTime(pstRecipientObject, 0); orxObject_Enable(pstSenderObject, orxFALSE); orxObject_AddTimeLineTrack(scene, "PopUpGameOverTrack"); } Because we never had a reference to the ''scene'' before in order to add the PopUpGameOverTrack, we'll need to make a variable reference to it at the top of the code: orxOBJECT *hero; orxOBJECT *herosGun; orxOBJECT *scene; orxOBJECT *scoreObject; orxS16 score = 0; And then set the ''scene'' variable on the orxObject_CreateFromConfig("Scene") in the ''init()'' function: scoreObject = orxObject_CreateFromConfig("ScoreObject"); orxObject_Enable(herosGun, orxFALSE); scene = orxObject_CreateFromConfig("Scene"); Compile and run. Kill your hero and wait two seconds. The game over panel will appear: {{:guides:beginners:beginners-47-game-over.png?nolink|}} Well friends, that's game over. If you reached the end here, great job! You've learned many of the major features of Orx. If you need more help, go to the [[en:tutorials:main|tutorials]] section where many of these concepts are covered in greater detail. If you need quick examples, you can visit the [[en:examples:]] section and search by subject. If you get stuck, please post over on our [[https://orx-project.org/discord|Discord]]. Hope to see you there. {{section>en:guides:beginners:toc&noheader&nofooter&noeditbutton}}