mirror of
https://gitlab.com/drummyfish/anarch.git
synced 2024-12-21 23:08:49 -05:00
Continue menu
This commit is contained in:
parent
a0a25b1373
commit
67ab3f0fba
24
constants.h
24
constants.h
@ -128,6 +128,16 @@
|
||||
*/
|
||||
#define SFG_DAMAGE_RANDOMNESS 64
|
||||
|
||||
/**
|
||||
Specifies key repeat delay, in ms.
|
||||
*/
|
||||
#define SFG_KEY_REPEAT_DELAY 500
|
||||
|
||||
/**
|
||||
Specifies key repeat period, in ms.
|
||||
*/
|
||||
#define SFG_KEY_REPEAT_PERIOD 150
|
||||
|
||||
/**
|
||||
Angle in which multiple projectiles are spread, RCL_Units.
|
||||
*/
|
||||
@ -169,6 +179,20 @@
|
||||
#define SFG_MS_PER_FRAME 1
|
||||
#endif
|
||||
|
||||
#define SFG_KEY_REPEAT_DELAY_FRAMES \
|
||||
(SFG_KEY_REPEAT_DELAY / SFG_MS_PER_FRAME)
|
||||
|
||||
#if SFG_KEY_REPEAT_DELAY_FRAMES == 0
|
||||
#define SFG_KEY_REPEAT_DELAY_FRAMES 1
|
||||
#endif
|
||||
|
||||
#define SFG_KEY_REPEAT_PERIOD_FRAMES \
|
||||
(SFG_KEY_REPEAT_PERIOD / SFG_MS_PER_FRAME)
|
||||
|
||||
#if SFG_KEY_REPEAT_PERIOD_FRAMES == 0
|
||||
#define SFG_KEY_REPEAT_PERIOD_FRAMES 1
|
||||
#endif
|
||||
|
||||
#define SFG_WEAPON_IMAGE_SCALE \
|
||||
(SFG_GAME_RESOLUTION_X / (SFG_TEXTURE_SIZE * 5))
|
||||
|
||||
|
119
main.c
119
main.c
@ -126,6 +126,7 @@ void SFG_init();
|
||||
|
||||
#include "raycastlib.h"
|
||||
|
||||
#include "texts.h"
|
||||
#include "images.h"
|
||||
#include "levels.h"
|
||||
#include "palette.h"
|
||||
@ -219,6 +220,15 @@ typedef struct
|
||||
#define SFG_GAME_STATE_MENU 0
|
||||
#define SFG_GAME_STATE_PLAYING 1
|
||||
|
||||
#define SFG_MENU_ITEM_CONTINUE 0
|
||||
#define SFG_MENU_ITEM_MAP 1
|
||||
#define SFG_MENU_ITEM_PLAY 2
|
||||
#define SFG_MENU_ITEM_LOAD 3
|
||||
#define SFG_MENU_ITEM_SOUND 4
|
||||
#define SFG_MENU_ITEM_EXIT 5
|
||||
|
||||
#define SFG_MENU_ITEM_NONE 255
|
||||
|
||||
/*
|
||||
GLOBAL VARIABLES
|
||||
===============================================================================
|
||||
@ -520,6 +530,26 @@ uint8_t SFG_keyJustPressed(uint8_t key)
|
||||
return (SFG_game.keyStates[key]) == 1;
|
||||
}
|
||||
|
||||
/**
|
||||
Says whether a key is being repeated after being held for certain time.
|
||||
*/
|
||||
uint8_t SFG_keyRepeated(uint8_t key)
|
||||
{
|
||||
if (SFG_game.keyStates[key] >= SFG_KEY_REPEAT_DELAY_FRAMES)
|
||||
{
|
||||
if (SFG_game.keyStates[key] == 255)
|
||||
{
|
||||
SFG_game.keyStates[key] -= SFG_KEY_REPEAT_PERIOD_FRAMES;
|
||||
return 1;
|
||||
}
|
||||
|
||||
return ((SFG_game.keyStates[key] - SFG_KEY_REPEAT_DELAY_FRAMES) %
|
||||
SFG_KEY_REPEAT_PERIOD_FRAMES) == 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if SFG_RESOLUTION_SCALEDOWN == 1
|
||||
#define SFG_setGamePixel SFG_setPixel
|
||||
#else
|
||||
@ -1181,7 +1211,7 @@ void SFG_init()
|
||||
|
||||
SFG_game.backgroundScroll = 0;
|
||||
|
||||
SFG_setAndInitLevel(&SFG_level0);
|
||||
SFG_currentLevel.levelPointer = 0;
|
||||
|
||||
SFG_game.lastFrameTimeMs = SFG_getTimeMs();
|
||||
|
||||
@ -2755,6 +2785,48 @@ void SFG_gameStepPlaying()
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t SFG_getMenuItem(uint8_t index)
|
||||
{
|
||||
if (index <= SFG_MENU_ITEM_EXIT)
|
||||
return index;
|
||||
|
||||
return SFG_MENU_ITEM_NONE;
|
||||
}
|
||||
|
||||
void SFG_gameStepMenu()
|
||||
{
|
||||
uint8_t menuItems = 0;
|
||||
|
||||
while (SFG_getMenuItem(menuItems) != SFG_MENU_ITEM_NONE)
|
||||
menuItems++;
|
||||
|
||||
if ((SFG_keyJustPressed(SFG_KEY_DOWN) || SFG_keyRepeated(SFG_KEY_DOWN)) &&
|
||||
SFG_game.selectedMenuItem < menuItems - 1)
|
||||
{
|
||||
SFG_game.selectedMenuItem++;
|
||||
SFG_playSoundSafe(3,64);
|
||||
}
|
||||
else if ((SFG_keyJustPressed(SFG_KEY_UP) || SFG_keyRepeated(SFG_KEY_UP))
|
||||
&& SFG_game.selectedMenuItem > 0)
|
||||
{
|
||||
SFG_game.selectedMenuItem--;
|
||||
SFG_playSoundSafe(3,64);
|
||||
}
|
||||
else if (SFG_keyJustPressed(SFG_KEY_A))
|
||||
{
|
||||
switch (SFG_getMenuItem(SFG_game.selectedMenuItem))
|
||||
{
|
||||
case SFG_MENU_ITEM_PLAY:
|
||||
SFG_setAndInitLevel(&SFG_level0);
|
||||
SFG_game.state = SFG_GAME_STATE_PLAYING;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
Performs one game step (logic, physics, menu, ...), happening SFG_MS_PER_FRAME
|
||||
after previous frame.
|
||||
@ -2773,7 +2845,6 @@ void SFG_gameStep()
|
||||
SFG_SPRITE_ANIMATION_FRAME_DURATION == 0)
|
||||
SFG_game.spriteAnimationFrame++;
|
||||
|
||||
|
||||
switch (SFG_game.state)
|
||||
{
|
||||
case SFG_GAME_STATE_PLAYING:
|
||||
@ -2781,11 +2852,7 @@ void SFG_gameStep()
|
||||
break;
|
||||
|
||||
case SFG_GAME_STATE_MENU:
|
||||
if (SFG_keyJustPressed(SFG_KEY_DOWN))
|
||||
SFG_game.selectedMenuItem++;
|
||||
else if (SFG_keyJustPressed(SFG_KEY_UP))
|
||||
SFG_game.selectedMenuItem--;
|
||||
|
||||
SFG_gameStepMenu();
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -3063,8 +3130,6 @@ void SFG_drawMenu()
|
||||
#define SCROLL_PIXELS_PER_FRAME 1
|
||||
#endif
|
||||
|
||||
#define MAX_ITEMS 8
|
||||
|
||||
#define CHAR_SIZE (SFG_FONT_SIZE_MEDIUM * (SFG_FONT_CHARACTER_SIZE + 1))
|
||||
|
||||
#define SELECTION_START_X (SFG_GAME_RESOLUTION_X / 5)
|
||||
@ -3078,36 +3143,27 @@ void SFG_drawMenu()
|
||||
SFG_getTexel(SFG_backgroundImages[0],((x + scroll) / BACKGROUND_SCALE)
|
||||
% SFG_TEXTURE_SIZE,y / BACKGROUND_SCALE));
|
||||
|
||||
char *itemTexts[MAX_ITEMS];
|
||||
|
||||
for (uint8_t i = 0; i < MAX_ITEMS; ++i)
|
||||
itemTexts[i] = 0;
|
||||
|
||||
itemTexts[0] = "continue";
|
||||
itemTexts[1] = "map";
|
||||
itemTexts[2] = "play level 1";
|
||||
itemTexts[3] = "load";
|
||||
itemTexts[4] = "sound on";
|
||||
itemTexts[5] = "exit";
|
||||
|
||||
|
||||
uint16_t y = CHAR_SIZE;
|
||||
|
||||
|
||||
SFG_blitImage(SFG_logoImage, SFG_GAME_RESOLUTION_X / 2 - 16 * SFG_FONT_SIZE_MEDIUM,
|
||||
y,SFG_FONT_SIZE_MEDIUM );
|
||||
|
||||
y += 32 * SFG_FONT_SIZE_MEDIUM + CHAR_SIZE;
|
||||
|
||||
for (uint8_t i = 0; i < MAX_ITEMS; ++i)
|
||||
{
|
||||
uint8_t i = 0;
|
||||
|
||||
if (itemTexts[i] == 0)
|
||||
while (1)
|
||||
{
|
||||
uint8_t item = SFG_getMenuItem(i);
|
||||
|
||||
if (item == SFG_MENU_ITEM_NONE)
|
||||
break;
|
||||
|
||||
const char *text = SFG_menuItemTexts[item];
|
||||
|
||||
uint8_t textLen = 0;
|
||||
|
||||
while (itemTexts[i][textLen] != 0)
|
||||
while (text[textLen] != 0)
|
||||
textLen++;
|
||||
|
||||
|
||||
@ -3115,11 +3171,13 @@ SFG_blitImage(SFG_logoImage, SFG_GAME_RESOLUTION_X / 2 - 16 * SFG_FONT_SIZE_ME
|
||||
|
||||
|
||||
|
||||
//SFG_drawText(itemTexts[i],drawX - 1,y - 1,SFG_FONT_SIZE_MEDIUM,63);
|
||||
|
||||
|
||||
|
||||
|
||||
if (i != SFG_game.selectedMenuItem)
|
||||
{
|
||||
SFG_drawText(itemTexts[i],drawX,y,SFG_FONT_SIZE_MEDIUM,23);
|
||||
SFG_drawText(text,drawX,y,SFG_FONT_SIZE_MEDIUM,23);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -3128,11 +3186,12 @@ else
|
||||
for (uint16_t k = SELECTION_START_X; k < SFG_GAME_RESOLUTION_X - SELECTION_START_X; ++k)
|
||||
SFG_setGamePixel(k,l,2);
|
||||
|
||||
SFG_drawText(itemTexts[i],drawX,y,SFG_FONT_SIZE_MEDIUM,7);
|
||||
SFG_drawText(text,drawX,y,SFG_FONT_SIZE_MEDIUM,7);
|
||||
}
|
||||
|
||||
|
||||
y += CHAR_SIZE + SFG_FONT_SIZE_MEDIUM;
|
||||
i++;
|
||||
}
|
||||
|
||||
|
||||
|
27
texts.h
Normal file
27
texts.h
Normal file
@ -0,0 +1,27 @@
|
||||
/**
|
||||
@file assets.h
|
||||
|
||||
This file contains texts to be used in the game.
|
||||
|
||||
by Miloslav Ciz (drummyfish), 2019
|
||||
|
||||
Released under CC0 1.0 (https://creativecommons.org/publicdomain/zero/1.0/)
|
||||
plus a waiver of all other intellectual property. The goal of this work is
|
||||
be and remain completely in the public domain forever, available for any use
|
||||
whatsoever.
|
||||
*/
|
||||
|
||||
#ifndef _SFG_TEXTS_H
|
||||
#define _SFG_TEXTS_H
|
||||
|
||||
SFG_PROGRAM_MEMORY char *SFG_menuItemTexts[] =
|
||||
{
|
||||
"continue",
|
||||
"map",
|
||||
"play level",
|
||||
"load",
|
||||
"sound",
|
||||
"exit"
|
||||
};
|
||||
|
||||
#endif // gaurd
|
Loading…
Reference in New Issue
Block a user