* chg: New build system that uses the officially distributed binaries, bumped version to 8.0.0, simplified git workflow, removed deprecated OpenGL 1.1 functionality. * chg: Modernize CI workflow, enable SourceLink - Bump workflow actions to latest majors (Node 24); drop deprecated softprops/action-gh-release@v1 - Trigger push builds on main instead of master - Create local nuget feed dir before pack (fixes NU1301) - Enable Microsoft.SourceLink.GitHub for debugging symbols (ref PR #340) * fix: centralized version data in Directory.build.props, and fixed various interop details that had incorrect function signatures * chore: updated readme * fix: version the native extract marker and chain download via DependsOnTargets The .extracted marker now includes the raylib package name, so bumping TargetRaylibTag re-extracts the new archive instead of silently keeping (and packing/copying) the previous version's files. _PrepareNativeLibrary and _StageWasmNative now depend directly on _DownloadAndExtractInternal instead of CallTarget-ing it; dependency targets run in the same project instance, so the resolved properties (RaylibPackageName etc.) propagate naturally. * fix: let the binding build for browser-wasm on both net8.0 and net10.0 The net8-era wasm workload (Microsoft.NET.Runtime.WebAssembly.Sdk 8.0.x, auto-imported for RID browser-wasm) treats every browser-wasm project as a wasm app: it forces OutputType=Exe after project evaluation (CS5001 for a classlib) and hooks its app-bundle build after Build, which errors because a library has no assemblies to bundle. Opt Raylib-cs out via DisableAutoWasmBuildApp (props time, before the workload defaults its trigger) and pin OutputType back to Library in Directory.Build.targets (evaluated after the workload props, so the assignment wins). net10's wasm SDK needs neither workaround. * chore: readme updated * chg: simplifying build logic - a simple line in the documentation should save us the code here * fix: Wrong signature of FrameBufferComplete * chore: readme update * feat: samples default to local project reference, and can optionally use the nuget package * feat: backporting existing raylib-cs examples and new official raylib examples to WASM, adopting raylib's original code style * chore: readme, gitignore, and targets backport. * fix: Examples.csproj runs the download task when building locally * feat: backporting existing raylib-cs examples and new official raylib examples to WASM, adopting raylib's original code style * chore: readme, gitignore, and targets backport. * chore: clean up linter warnings * feat: html harness focuses the example and allows quick navigation with J/K instead. * chore: readme mentions the property to use nuget vs. the local project reference * feat: replaced the J/K navigation with good old HTML buttons * chore: run dotnet format scoped default (was previously scoped to just 'style')
510 lines
20 KiB
C#
510 lines
20 KiB
C#
/*******************************************************************************************
|
|
*
|
|
* raylib [core] example - keyboard testbed
|
|
*
|
|
* Example complexity rating: [★★☆☆] 2/4
|
|
*
|
|
* NOTE: raylib defined keys refer to ENG-US Keyboard layout,
|
|
* mapping to other layouts is up to the user
|
|
*
|
|
* Example originally created with raylib 5.6, last time updated with raylib 5.6
|
|
*
|
|
* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
|
|
* BSD-like license that allows static linking with closed source software
|
|
*
|
|
* Copyright (c) 2026 Ramon Santamaria (@raysan5)
|
|
*
|
|
********************************************************************************************/
|
|
|
|
namespace Examples.Core;
|
|
|
|
public partial class KeyboardTestbed : IExample
|
|
{
|
|
private const int KeyRecSpacing = 4; // Space in pixels between key rectangles
|
|
|
|
private const int screenWidth = 800;
|
|
private const int screenHeight = 450;
|
|
|
|
public string Name => "Core / Keyboard Testbed";
|
|
|
|
public string Title => "raylib [core] example - keyboard testbed";
|
|
|
|
private int[] line01KeyWidths;
|
|
private int[] line01Keys;
|
|
private int[] line02KeyWidths;
|
|
private int[] line02Keys;
|
|
private int[] line03KeyWidths;
|
|
private int[] line03Keys;
|
|
private int[] line04KeyWidths;
|
|
private int[] line04Keys;
|
|
private int[] line05KeyWidths;
|
|
private int[] line05Keys;
|
|
private int[] line06KeyWidths;
|
|
private int[] line06Keys;
|
|
|
|
private Vector2 keyboardOffset;
|
|
|
|
public void Init()
|
|
{
|
|
SetExitKey(KeyboardKey.Null); // Avoid exit on KEY_ESCAPE
|
|
|
|
// Keyboard line 01
|
|
line01KeyWidths = new int[15];
|
|
for (int i = 0; i < 15; i++)
|
|
{
|
|
line01KeyWidths[i] = 45;
|
|
}
|
|
|
|
line01KeyWidths[13] = 62; // PRINTSCREEN
|
|
line01Keys = new int[]
|
|
{
|
|
(int)KeyboardKey.Escape, (int)KeyboardKey.F1, (int)KeyboardKey.F2, (int)KeyboardKey.F3, (int)KeyboardKey.F4, (int)KeyboardKey.F5,
|
|
(int)KeyboardKey.F6, (int)KeyboardKey.F7, (int)KeyboardKey.F8, (int)KeyboardKey.F9, (int)KeyboardKey.F10, (int)KeyboardKey.F11,
|
|
(int)KeyboardKey.F12, (int)KeyboardKey.PrintScreen, (int)KeyboardKey.Pause
|
|
};
|
|
|
|
// Keyboard line 02
|
|
line02KeyWidths = new int[15];
|
|
for (int i = 0; i < 15; i++)
|
|
{
|
|
line02KeyWidths[i] = 45;
|
|
}
|
|
|
|
line02KeyWidths[0] = 25; // GRAVE
|
|
line02KeyWidths[13] = 82; // BACKSPACE
|
|
line02Keys = new int[]
|
|
{
|
|
(int)KeyboardKey.Grave, (int)KeyboardKey.One, (int)KeyboardKey.Two, (int)KeyboardKey.Three, (int)KeyboardKey.Four,
|
|
(int)KeyboardKey.Five, (int)KeyboardKey.Six, (int)KeyboardKey.Seven, (int)KeyboardKey.Eight, (int)KeyboardKey.Nine,
|
|
(int)KeyboardKey.Zero, (int)KeyboardKey.Minus, (int)KeyboardKey.Equal, (int)KeyboardKey.Backspace, (int)KeyboardKey.Delete
|
|
};
|
|
|
|
// Keyboard line 03
|
|
line03KeyWidths = new int[15];
|
|
for (int i = 0; i < 15; i++)
|
|
{
|
|
line03KeyWidths[i] = 45;
|
|
}
|
|
|
|
line03KeyWidths[0] = 50; // TAB
|
|
line03KeyWidths[13] = 57; // BACKSLASH
|
|
line03Keys = new int[]
|
|
{
|
|
(int)KeyboardKey.Tab, (int)KeyboardKey.Q, (int)KeyboardKey.W, (int)KeyboardKey.E, (int)KeyboardKey.R, (int)KeyboardKey.T, (int)KeyboardKey.Y,
|
|
(int)KeyboardKey.U, (int)KeyboardKey.I, (int)KeyboardKey.O, (int)KeyboardKey.P, (int)KeyboardKey.LeftBracket,
|
|
(int)KeyboardKey.RightBracket, (int)KeyboardKey.Backslash, (int)KeyboardKey.Insert
|
|
};
|
|
|
|
// Keyboard line 04
|
|
line04KeyWidths = new int[14];
|
|
for (int i = 0; i < 14; i++)
|
|
{
|
|
line04KeyWidths[i] = 45;
|
|
}
|
|
|
|
line04KeyWidths[0] = 68; // CAPS
|
|
line04KeyWidths[12] = 88; // ENTER
|
|
line04Keys = new int[]
|
|
{
|
|
(int)KeyboardKey.CapsLock, (int)KeyboardKey.A, (int)KeyboardKey.S, (int)KeyboardKey.D, (int)KeyboardKey.F, (int)KeyboardKey.G,
|
|
(int)KeyboardKey.H, (int)KeyboardKey.J, (int)KeyboardKey.K, (int)KeyboardKey.L, (int)KeyboardKey.Semicolon,
|
|
(int)KeyboardKey.Apostrophe, (int)KeyboardKey.Enter, (int)KeyboardKey.PageUp
|
|
};
|
|
|
|
// Keyboard line 05
|
|
line05KeyWidths = new int[14];
|
|
for (int i = 0; i < 14; i++)
|
|
{
|
|
line05KeyWidths[i] = 45;
|
|
}
|
|
|
|
line05KeyWidths[0] = 80; // LSHIFT
|
|
line05KeyWidths[11] = 76; // RSHIFT
|
|
line05Keys = new int[]
|
|
{
|
|
(int)KeyboardKey.LeftShift, (int)KeyboardKey.Z, (int)KeyboardKey.X, (int)KeyboardKey.C, (int)KeyboardKey.V, (int)KeyboardKey.B,
|
|
(int)KeyboardKey.N, (int)KeyboardKey.M, (int)KeyboardKey.Comma, (int)KeyboardKey.Period, /*KEY_MINUS*/
|
|
(int)KeyboardKey.Slash, (int)KeyboardKey.RightShift, (int)KeyboardKey.Up, (int)KeyboardKey.PageDown
|
|
};
|
|
|
|
// Keyboard line 06
|
|
line06KeyWidths = new int[11];
|
|
for (int i = 0; i < 11; i++)
|
|
{
|
|
line06KeyWidths[i] = 45;
|
|
}
|
|
|
|
line06KeyWidths[0] = 80; // LCTRL
|
|
line06KeyWidths[3] = 208; // SPACE
|
|
line06KeyWidths[7] = 60; // RCTRL
|
|
line06Keys = new int[]
|
|
{
|
|
(int)KeyboardKey.LeftControl, (int)KeyboardKey.LeftSuper, (int)KeyboardKey.LeftAlt,
|
|
(int)KeyboardKey.Space, (int)KeyboardKey.RightAlt, 162, (int)KeyboardKey.Null,
|
|
(int)KeyboardKey.RightControl, (int)KeyboardKey.Left, (int)KeyboardKey.Down, (int)KeyboardKey.Right
|
|
};
|
|
|
|
keyboardOffset = new Vector2(26, 80);
|
|
}
|
|
|
|
public void Update()
|
|
{
|
|
// Update
|
|
//----------------------------------------------------------------------------------
|
|
int key = GetKeyPressed(); // Get pressed keycode
|
|
if (key > 0)
|
|
{
|
|
TraceLog(TraceLogLevel.Info, $"KEYBOARD TESTBED: KEY PRESSED: {key}");
|
|
}
|
|
|
|
int ch = GetCharPressed(); // Get pressed char for text input, using OS mapping
|
|
if (ch > 0)
|
|
{
|
|
TraceLog(TraceLogLevel.Info, $"KEYBOARD TESTBED: CHAR PRESSED: {(char)ch} ({ch})");
|
|
}
|
|
//----------------------------------------------------------------------------------
|
|
|
|
// Draw
|
|
//----------------------------------------------------------------------------------
|
|
BeginDrawing();
|
|
|
|
ClearBackground(Color.RayWhite);
|
|
|
|
DrawText("KEYBOARD LAYOUT: ENG-US", 26, 38, 20, Color.LightGray);
|
|
|
|
// Keyboard line 01 - 15 keys
|
|
// ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, IMP, CLOSE
|
|
for (int i = 0, recOffsetX = 0; i < 15; i++)
|
|
{
|
|
GuiKeyboardKey(new Rectangle(keyboardOffset.X + recOffsetX, keyboardOffset.Y, (float)line01KeyWidths[i], 30.0f), line01Keys[i]);
|
|
recOffsetX += line01KeyWidths[i] + KeyRecSpacing;
|
|
}
|
|
|
|
// Keyboard line 02 - 15 keys
|
|
// `, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, -, =, BACKSPACE, DEL
|
|
for (int i = 0, recOffsetX = 0; i < 15; i++)
|
|
{
|
|
GuiKeyboardKey(new Rectangle(keyboardOffset.X + recOffsetX, keyboardOffset.Y + 30 + KeyRecSpacing, (float)line02KeyWidths[i], 38.0f), line02Keys[i]);
|
|
recOffsetX += line02KeyWidths[i] + KeyRecSpacing;
|
|
}
|
|
|
|
// Keyboard line 03 - 15 keys
|
|
// TAB, Q, W, E, R, T, Y, U, I, O, P, [, ], \, INS
|
|
for (int i = 0, recOffsetX = 0; i < 15; i++)
|
|
{
|
|
GuiKeyboardKey(new Rectangle(keyboardOffset.X + recOffsetX, keyboardOffset.Y + 30 + 38 + KeyRecSpacing * 2, (float)line03KeyWidths[i], 38.0f), line03Keys[i]);
|
|
recOffsetX += line03KeyWidths[i] + KeyRecSpacing;
|
|
}
|
|
|
|
// Keyboard line 04 - 14 keys
|
|
// MAYUS, A, S, D, F, G, H, J, K, L, ;, ', ENTER, REPAG
|
|
for (int i = 0, recOffsetX = 0; i < 14; i++)
|
|
{
|
|
GuiKeyboardKey(new Rectangle(keyboardOffset.X + recOffsetX, keyboardOffset.Y + 30 + 38 * 2 + KeyRecSpacing * 3, (float)line04KeyWidths[i], 38.0f), line04Keys[i]);
|
|
recOffsetX += line04KeyWidths[i] + KeyRecSpacing;
|
|
}
|
|
|
|
// Keyboard line 05 - 14 keys
|
|
// LSHIFT, Z, X, C, V, B, N, M, ,, ., /, RSHIFT, UP, AVPAG
|
|
for (int i = 0, recOffsetX = 0; i < 14; i++)
|
|
{
|
|
GuiKeyboardKey(new Rectangle(keyboardOffset.X + recOffsetX, keyboardOffset.Y + 30 + 38 * 3 + KeyRecSpacing * 4, (float)line05KeyWidths[i], 38.0f), line05Keys[i]);
|
|
recOffsetX += line05KeyWidths[i] + KeyRecSpacing;
|
|
}
|
|
|
|
// Keyboard line 06 - 11 keys
|
|
// LCTRL, WIN, LALT, SPACE, ALTGR, \, FN, RCTRL, LEFT, DOWN, RIGHT
|
|
for (int i = 0, recOffsetX = 0; i < 11; i++)
|
|
{
|
|
GuiKeyboardKey(new Rectangle(keyboardOffset.X + recOffsetX, keyboardOffset.Y + 30 + 38 * 4 + KeyRecSpacing * 5, (float)line06KeyWidths[i], 38.0f), line06Keys[i]);
|
|
recOffsetX += line06KeyWidths[i] + KeyRecSpacing;
|
|
}
|
|
|
|
EndDrawing();
|
|
//----------------------------------------------------------------------------------
|
|
}
|
|
|
|
public void Unload()
|
|
{
|
|
}
|
|
|
|
//------------------------------------------------------------------------------------
|
|
// Module Functions Definition
|
|
//------------------------------------------------------------------------------------
|
|
// Get keyboard keycode as text (US keyboard)
|
|
// NOTE: Mapping for other keyboard layouts can be done here
|
|
private static string GetKeyText(int key)
|
|
{
|
|
switch ((KeyboardKey)key)
|
|
{
|
|
case KeyboardKey.Apostrophe:
|
|
return "'"; // Key: '
|
|
case KeyboardKey.Comma:
|
|
return ","; // Key: ,
|
|
case KeyboardKey.Minus:
|
|
return "-"; // Key: -
|
|
case KeyboardKey.Period:
|
|
return "."; // Key: .
|
|
case KeyboardKey.Slash:
|
|
return "/"; // Key: /
|
|
case KeyboardKey.Zero:
|
|
return "0"; // Key: 0
|
|
case KeyboardKey.One:
|
|
return "1"; // Key: 1
|
|
case KeyboardKey.Two:
|
|
return "2"; // Key: 2
|
|
case KeyboardKey.Three:
|
|
return "3"; // Key: 3
|
|
case KeyboardKey.Four:
|
|
return "4"; // Key: 4
|
|
case KeyboardKey.Five:
|
|
return "5"; // Key: 5
|
|
case KeyboardKey.Six:
|
|
return "6"; // Key: 6
|
|
case KeyboardKey.Seven:
|
|
return "7"; // Key: 7
|
|
case KeyboardKey.Eight:
|
|
return "8"; // Key: 8
|
|
case KeyboardKey.Nine:
|
|
return "9"; // Key: 9
|
|
case KeyboardKey.Semicolon:
|
|
return ";"; // Key: ;
|
|
case KeyboardKey.Equal:
|
|
return "="; // Key: =
|
|
case KeyboardKey.A:
|
|
return "A"; // Key: A | a
|
|
case KeyboardKey.B:
|
|
return "B"; // Key: B | b
|
|
case KeyboardKey.C:
|
|
return "C"; // Key: C | c
|
|
case KeyboardKey.D:
|
|
return "D"; // Key: D | d
|
|
case KeyboardKey.E:
|
|
return "E"; // Key: E | e
|
|
case KeyboardKey.F:
|
|
return "F"; // Key: F | f
|
|
case KeyboardKey.G:
|
|
return "G"; // Key: G | g
|
|
case KeyboardKey.H:
|
|
return "H"; // Key: H | h
|
|
case KeyboardKey.I:
|
|
return "I"; // Key: I | i
|
|
case KeyboardKey.J:
|
|
return "J"; // Key: J | j
|
|
case KeyboardKey.K:
|
|
return "K"; // Key: K | k
|
|
case KeyboardKey.L:
|
|
return "L"; // Key: L | l
|
|
case KeyboardKey.M:
|
|
return "M"; // Key: M | m
|
|
case KeyboardKey.N:
|
|
return "N"; // Key: N | n
|
|
case KeyboardKey.O:
|
|
return "O"; // Key: O | o
|
|
case KeyboardKey.P:
|
|
return "P"; // Key: P | p
|
|
case KeyboardKey.Q:
|
|
return "Q"; // Key: Q | q
|
|
case KeyboardKey.R:
|
|
return "R"; // Key: R | r
|
|
case KeyboardKey.S:
|
|
return "S"; // Key: S | s
|
|
case KeyboardKey.T:
|
|
return "T"; // Key: T | t
|
|
case KeyboardKey.U:
|
|
return "U"; // Key: U | u
|
|
case KeyboardKey.V:
|
|
return "V"; // Key: V | v
|
|
case KeyboardKey.W:
|
|
return "W"; // Key: W | w
|
|
case KeyboardKey.X:
|
|
return "X"; // Key: X | x
|
|
case KeyboardKey.Y:
|
|
return "Y"; // Key: Y | y
|
|
case KeyboardKey.Z:
|
|
return "Z"; // Key: Z | z
|
|
case KeyboardKey.LeftBracket:
|
|
return "["; // Key: [
|
|
case KeyboardKey.Backslash:
|
|
return "\\"; // Key: '\'
|
|
case KeyboardKey.RightBracket:
|
|
return "]"; // Key: ]
|
|
case KeyboardKey.Grave:
|
|
return "`"; // Key: `
|
|
case KeyboardKey.Space:
|
|
return "SPACE"; // Key: Space
|
|
case KeyboardKey.Escape:
|
|
return "ESC"; // Key: Esc
|
|
case KeyboardKey.Enter:
|
|
return "ENTER"; // Key: Enter
|
|
case KeyboardKey.Tab:
|
|
return "TAB"; // Key: Tab
|
|
case KeyboardKey.Backspace:
|
|
return "BACK"; // Key: Backspace
|
|
case KeyboardKey.Insert:
|
|
return "INS"; // Key: Ins
|
|
case KeyboardKey.Delete:
|
|
return "DEL"; // Key: Del
|
|
case KeyboardKey.Right:
|
|
return "RIGHT"; // Key: Cursor right
|
|
case KeyboardKey.Left:
|
|
return "LEFT"; // Key: Cursor left
|
|
case KeyboardKey.Down:
|
|
return "DOWN"; // Key: Cursor down
|
|
case KeyboardKey.Up:
|
|
return "UP"; // Key: Cursor up
|
|
case KeyboardKey.PageUp:
|
|
return "PGUP"; // Key: Page up
|
|
case KeyboardKey.PageDown:
|
|
return "PGDOWN"; // Key: Page down
|
|
case KeyboardKey.Home:
|
|
return "HOME"; // Key: Home
|
|
case KeyboardKey.End:
|
|
return "END"; // Key: End
|
|
case KeyboardKey.CapsLock:
|
|
return "CAPS"; // Key: Caps lock
|
|
case KeyboardKey.ScrollLock:
|
|
return "LOCK"; // Key: Scroll down
|
|
case KeyboardKey.NumLock:
|
|
return "NUMLOCK"; // Key: Num lock
|
|
case KeyboardKey.PrintScreen:
|
|
return "PRINTSCR"; // Key: Print screen
|
|
case KeyboardKey.Pause:
|
|
return "PAUSE"; // Key: Pause
|
|
case KeyboardKey.F1:
|
|
return "F1"; // Key: F1
|
|
case KeyboardKey.F2:
|
|
return "F2"; // Key: F2
|
|
case KeyboardKey.F3:
|
|
return "F3"; // Key: F3
|
|
case KeyboardKey.F4:
|
|
return "F4"; // Key: F4
|
|
case KeyboardKey.F5:
|
|
return "F5"; // Key: F5
|
|
case KeyboardKey.F6:
|
|
return "F6"; // Key: F6
|
|
case KeyboardKey.F7:
|
|
return "F7"; // Key: F7
|
|
case KeyboardKey.F8:
|
|
return "F8"; // Key: F8
|
|
case KeyboardKey.F9:
|
|
return "F9"; // Key: F9
|
|
case KeyboardKey.F10:
|
|
return "F10"; // Key: F10
|
|
case KeyboardKey.F11:
|
|
return "F11"; // Key: F11
|
|
case KeyboardKey.F12:
|
|
return "F12"; // Key: F12
|
|
case KeyboardKey.LeftShift:
|
|
return "LSHIFT"; // Key: Shift left
|
|
case KeyboardKey.LeftControl:
|
|
return "LCTRL"; // Key: Control left
|
|
case KeyboardKey.LeftAlt:
|
|
return "LALT"; // Key: Alt left
|
|
case KeyboardKey.LeftSuper:
|
|
return "WIN"; // Key: Super left
|
|
case KeyboardKey.RightShift:
|
|
return "RSHIFT"; // Key: Shift right
|
|
case KeyboardKey.RightControl:
|
|
return "RCTRL"; // Key: Control right
|
|
case KeyboardKey.RightAlt:
|
|
return "ALTGR"; // Key: Alt right
|
|
case KeyboardKey.RightSuper:
|
|
return "RSUPER"; // Key: Super right
|
|
case KeyboardKey.KeyboardMenu:
|
|
return "KBMENU"; // Key: KB menu
|
|
case KeyboardKey.Kp0:
|
|
return "KP0"; // Key: Keypad 0
|
|
case KeyboardKey.Kp1:
|
|
return "KP1"; // Key: Keypad 1
|
|
case KeyboardKey.Kp2:
|
|
return "KP2"; // Key: Keypad 2
|
|
case KeyboardKey.Kp3:
|
|
return "KP3"; // Key: Keypad 3
|
|
case KeyboardKey.Kp4:
|
|
return "KP4"; // Key: Keypad 4
|
|
case KeyboardKey.Kp5:
|
|
return "KP5"; // Key: Keypad 5
|
|
case KeyboardKey.Kp6:
|
|
return "KP6"; // Key: Keypad 6
|
|
case KeyboardKey.Kp7:
|
|
return "KP7"; // Key: Keypad 7
|
|
case KeyboardKey.Kp8:
|
|
return "KP8"; // Key: Keypad 8
|
|
case KeyboardKey.Kp9:
|
|
return "KP9"; // Key: Keypad 9
|
|
case KeyboardKey.KpDecimal:
|
|
return "KPDEC"; // Key: Keypad .
|
|
case KeyboardKey.KpDivide:
|
|
return "KPDIV"; // Key: Keypad /
|
|
case KeyboardKey.KpMultiply:
|
|
return "KPMUL"; // Key: Keypad *
|
|
case KeyboardKey.KpSubtract:
|
|
return "KPSUB"; // Key: Keypad -
|
|
case KeyboardKey.KpAdd:
|
|
return "KPADD"; // Key: Keypad +
|
|
case KeyboardKey.KpEnter:
|
|
return "KPENTER"; // Key: Keypad Enter
|
|
case KeyboardKey.KpEqual:
|
|
return "KPEQU"; // Key: Keypad =
|
|
default:
|
|
return "";
|
|
}
|
|
}
|
|
|
|
// Draw keyboard key
|
|
private static void GuiKeyboardKey(Rectangle bounds, int key)
|
|
{
|
|
if (key == (int)KeyboardKey.Null)
|
|
{
|
|
DrawRectangleLinesEx(bounds, 2.0f, Color.LightGray);
|
|
}
|
|
else
|
|
{
|
|
if (IsKeyDown((KeyboardKey)key))
|
|
{
|
|
DrawRectangleLinesEx(bounds, 2.0f, Color.Maroon);
|
|
DrawText(GetKeyText(key), (int)(bounds.X + 4), (int)(bounds.Y + 4), 10, Color.Maroon);
|
|
}
|
|
else
|
|
{
|
|
DrawRectangleLinesEx(bounds, 2.0f, Color.DarkGray);
|
|
DrawText(GetKeyText(key), (int)(bounds.X + 4), (int)(bounds.Y + 4), 10, Color.DarkGray);
|
|
}
|
|
}
|
|
|
|
if (CheckCollisionPointRec(GetMousePosition(), bounds))
|
|
{
|
|
DrawRectangleRec(bounds, Fade(Color.Red, 0.2f));
|
|
DrawRectangleLinesEx(bounds, 3.0f, Color.Red);
|
|
}
|
|
}
|
|
|
|
public static int Main()
|
|
{
|
|
// Initialization
|
|
//--------------------------------------------------------------------------------------
|
|
InitWindow(screenWidth, screenHeight, "raylib [core] example - keyboard testbed");
|
|
|
|
SetTargetFPS(60);
|
|
//--------------------------------------------------------------------------------------
|
|
|
|
var game = new KeyboardTestbed();
|
|
game.Init();
|
|
|
|
// Main game loop
|
|
while (!WindowShouldClose()) // Detect window close button or ESC key
|
|
{
|
|
game.Update();
|
|
}
|
|
|
|
game.Unload();
|
|
|
|
// De-Initialization
|
|
//--------------------------------------------------------------------------------------
|
|
CloseWindow(); // Close window and OpenGL context
|
|
//--------------------------------------------------------------------------------------
|
|
|
|
return 0;
|
|
}
|
|
}
|