clean up, bugfixes and snes controller

This commit is contained in:
Baipyrus 2022-10-20 14:28:10 +02:00
parent 014a843268
commit b960445e1f

View File

@ -1,9 +1,20 @@
using System;
using System.IO;
using System.Threading;
using rpi_rgb_led_matrix_sharp;
namespace RPI_Matrix {
public static class RPI_Matrix {
private static bool hasSelected = false;
private static int selectionIndex = 0;
private static bool selection = true;
private static bool isInGame = false;
private static bool isTetris = false;
private static bool isFlappy = false;
private static bool isSnake = false;
private static int keypressFrame = 0;
private static int frameCount = 0;
public static void Main() {
RGBLedMatrix matrix = new(
new RGBLedMatrixOptions {
@ -21,51 +32,74 @@ namespace RPI_Matrix {
SnakeGame.SnakeGame.Init(matrix, canvas);
FlappyBird.FlappyBird.Init(matrix, canvas);
Tetris.Tetris.Init(matrix, canvas);
(new Thread(InterpretGamepadInput)).Start();
RGBLedFont font = new("fonts/5x8.bdf");
Color col = new(255, 255, 255);
bool startover = true;
while (startover) {
while (true) {
Console.Clear();
canvas.Clear();
canvas.DrawText(font, 0, 8, col, "Spielauswahl:");
canvas.DrawText(font, 0, 24, col, "0) Beenden");
canvas.DrawText(font, 0, 32, col, "1) SnakeGame");
canvas.DrawText(font, 0, 40, col, "2) FlappyBird");
canvas.DrawText(font, 0, 48, col, "3) Tetris");
canvas = matrix.SwapOnVsync(canvas);
bool selection = true;
int frameCount = 0, keypressFrame = 0;
selection = true;
while (selection) {
canvas.Clear();
canvas.DrawText(font, 0, 8, col, "Spielauswahl:");
canvas.DrawText(font, 0, 24, col, " ) SnakeGame");
canvas.DrawText(font, 0, 32, col, " ) FlappyBird");
canvas.DrawText(font, 0, 40, col, " ) Tetris");
canvas.DrawText(font, 0, 56, col, " ) Beenden");
int nx = selectionIndex + ((selectionIndex == 3) ? 1 : 0);
canvas.DrawText(font, 0, 24 + nx * 8, col, "#");
canvas = matrix.SwapOnVsync(canvas);
// Handle key presses for selecting a game
if (Console.KeyAvailable) {
keypressFrame = frameCount;
switch (Console.ReadKey(true).Key) {
case ConsoleKey.D0:
selection = false;
startover = false;
case ConsoleKey.Escape:
return;
case ConsoleKey.UpArrow:
if (!isInGame && selectionIndex > 0)
selectionIndex--;
break;
case ConsoleKey.D1:
selection = false;
SnakeGame.SnakeGame.Main(new[] { "-s" });
case ConsoleKey.DownArrow:
if (!isInGame && selectionIndex < 3)
selectionIndex++;
break;
case ConsoleKey.D2:
selection = false;
FlappyBird.FlappyBird.Main();
case ConsoleKey.Enter:
if (!isInGame)
hasSelected = true;
break;
case ConsoleKey.D3:
selection = false;
Tetris.Tetris.Main();
}
}
if (hasSelected) {
hasSelected = false;
switch (selectionIndex) {
case 0:
playSnakeGame("-s");
break;
case 1:
playFlappyBird();
break;
case 2:
playTetris();
break;
case 3:
Environment.Exit(0);
break;
}
}
isInGame = false;
isTetris = false;
isFlappy = false;
isSnake = false;
if (frameCount >= keypressFrame + 150) {
selection = false;
keypressFrame = frameCount;
SnakeGame.SnakeGame.Main(new[] { "-b" });
playSnakeGame("-b");
}
Thread.Sleep(100);
@ -73,5 +107,138 @@ namespace RPI_Matrix {
}
}
}
private static void playSnakeGame(string arg) {
isSnake = true;
isInGame = true;
selection = false;
SnakeGame.SnakeGame.Main(new[] { arg });
}
private static void playFlappyBird() {
isFlappy = true;
isInGame = true;
selection = false;
FlappyBird.FlappyBird.Main();
}
private static void playTetris() {
isTetris = true;
isInGame = true;
selection = false;
Tetris.Tetris.Main();
}
private static void InterpretGamepadInput() {
FileInfo targetFile = new FileInfo("/dev/input/js0");
using FileStream fs = targetFile.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
byte[] buffer = new byte[1024];
while (fs.Read(buffer) > 0) {
// Console.SetCursorPosition(0, 1);
keypressFrame = frameCount;
if (isTetris && Tetris.Tetris.selection)
Tetris.Tetris.frameCount = 0;
else if (isSnake && !SnakeGame.SnakeGame.gameOver)
SnakeGame.SnakeGame.keypressFrame = SnakeGame.SnakeGame.frameCount;
switch (BitConverter.ToString(buffer, 4, 4)) {
case "01-00-01-00":
// X-Button
// Console.WriteLine("Pressed Button 'X' ");
if (isTetris)
Tetris.Tetris.swapMemory();
break;
case "01-00-01-01":
// A-Button
// Console.WriteLine("Pressed Button 'A' ");
if (!isInGame)
hasSelected = true;
else if (isTetris && Tetris.Tetris.selection)
Tetris.Tetris.enterSelection();
break;
case "01-00-01-02":
// B-Button
// Console.WriteLine("Pressed Button 'B' ");
if (isFlappy) {
if (FlappyBird.FlappyBird.isReady)
FlappyBird.FlappyBird.JumpOnce();
else
FlappyBird.FlappyBird.isReady = true;
} else if (isTetris)
Tetris.Tetris.placeDownBlock();
break;
case "01-00-01-04":
// L-Button
// Console.WriteLine("Pressed Button 'L' ");
if (isTetris) {
Tetris.Tetris.calcBounds();
Tetris.Tetris.rotateCounterClockwise();
Tetris.Tetris.adjustXPos();
}
break;
case "01-00-01-05":
// R-Button
// Console.WriteLine("Pressed Button 'R' ");
if (isTetris) {
Tetris.Tetris.calcBounds();
Tetris.Tetris.rotateClockwise();
Tetris.Tetris.adjustXPos();
}
break;
case "01-00-01-09":
// Start-Button
// Console.WriteLine("Pressed Button 'Start' ");
if (isSnake)
SnakeGame.SnakeGame.EndGame();
else if (isFlappy) {
if (!FlappyBird.FlappyBird.isReady)
FlappyBird.FlappyBird.stopPlaying = true;
else
FlappyBird.FlappyBird.EndGame();
} else if (isTetris)
Tetris.Tetris.EndGame();
break;
case "01-80-02-01":
// Arrow-Up
// Console.WriteLine("Pressed 'Arrow-Up' ");
if (!isInGame && selectionIndex > 0)
selectionIndex--;
else if (isSnake)
SnakeGame.SnakeGame.SteerUp(SnakeGame.SnakeGame.self);
else if (isTetris)
if (Tetris.Tetris.selection && Tetris.Tetris.selectionIndex > 0)
Tetris.Tetris.selectionIndex--;
break;
case "FF-7F-02-01":
// Arrow-Down
// Console.WriteLine("Pressed 'Arrow-Down' ");
if (!isInGame && selectionIndex < 3)
selectionIndex++;
else if (isSnake)
SnakeGame.SnakeGame.SteerDown(SnakeGame.SnakeGame.self);
else if (isTetris)
if (Tetris.Tetris.selection && Tetris.Tetris.selectionIndex < 1)
Tetris.Tetris.selectionIndex++;
else
Tetris.Tetris.moveDownOnce();
break;
case "01-80-02-00":
// Arrow-Left
// Console.WriteLine("Pressed 'Arrow-Left' ");
if (isSnake)
SnakeGame.SnakeGame.SteerLeft(SnakeGame.SnakeGame.self);
else if (isTetris)
Tetris.Tetris.moveLeftSide();
break;
case "FF-7F-02-00":
// Arrow-Right
// Console.WriteLine("Pressed 'Arrow-Right' ");
if (isSnake)
SnakeGame.SnakeGame.SteerRight(SnakeGame.SnakeGame.self);
else if (isTetris)
Tetris.Tetris.moveRightSide();
break;
}
}
}
}
}