Skip to content
Snippets Groups Projects
Commit 1df07b50 authored by eliasmorio's avatar eliasmorio
Browse files

feat: multiple keys pressed

parent ed9f2ed5
No related branches found
No related tags found
No related merge requests found
......@@ -15,7 +15,8 @@
Clavier clavier;
Game::Game() : entityCount(0) {
Game::Game(Clavier* clavier) : entityCount(0) {
this->clavier = clavier;
set_vga_mode13();
clear_vga_screen(0);
set_palette_vga(palette_vga);
......@@ -71,25 +72,19 @@ void Game::start() {
}
void Game::handleInput() {
char key = clavier.getchar();
switch (key) {
case 'L':
playerShip->rotate(10);
break;
case 'R':
playerShip->rotate(-10);
break;
case 'U':
playerShip->increaseVelocity();
break;
case ' ': {
Bullet* bullet = playerShip->shootBullet();
bullets.add(bullet);
break;
}
default:
break;
// Poll keyboard each frame for multi-key support
if (clavier->isKeyPressed('a')) {
playerShip->rotate(10);
}
if (clavier->isKeyPressed('d')) {
playerShip->rotate(-10);
}
if (clavier->isKeyPressed('w')) {
playerShip->increaseVelocity();
}
if (clavier->isKeyPressed(' ')) {
Bullet* bullet = playerShip->shootBullet();
bullets.add(bullet);
}
}
......
......@@ -8,6 +8,7 @@
#include "utils.h"
#include "physics/Physics.h"
#include "Asteroid.h"
#include <drivers/Clavier.h>
#define GAME_WIDTH 320
#define GAME_HEIGHT 180
......@@ -22,6 +23,7 @@ private:
Set ships;
Set bullets;
Set asteroids;
Clavier* clavier;
int entityCount;
int score;
......@@ -30,7 +32,7 @@ private:
bool scoreboardNeedsUpdate;
public:
Game();
Game(Clavier* clavier);
~Game();
void init();
void start();
......
#include "Clavier.h"
#include "handler_clavier.h"
extern bool modifBuf;
extern char buf[256];
......@@ -29,3 +30,49 @@ char* Clavier::getString(){
void Clavier::set_leds(void) {
ecrireOctet(0x60, 0xED);
}
bool Clavier::isKeyPressed(char c) {
int sc = 0;
switch (c) {
case 'a': sc = 16; break;
case 'z': sc = 17; break; // French AZERTY: 'z'
case 'e': sc = 18; break;
case 'r': sc = 19; break;
case 't': sc = 20; break;
case 'y': sc = 21; break;
case 'u': sc = 22; break;
case 'i': sc = 23; break;
case 'o': sc = 24; break;
case 'p': sc = 25; break;
case 'q': sc = 30; break; // AZERTY: Q
case 's': sc = 31; break;
case 'd': sc = 32; break;
case 'f': sc = 33; break;
case 'g': sc = 34; break;
case 'h': sc = 35; break;
case 'j': sc = 36; break;
case 'k': sc = 37; break;
case 'l': sc = 38; break;
case 'm': sc = 39; break;
case 'w': sc = 44; break; // AZERTY: W
case 'x': sc = 45; break;
case 'c': sc = 46; break;
case 'v': sc = 47; break;
case 'b': sc = 48; break;
case 'n': sc = 49; break;
case ',': sc = 50; break;
case '1': sc = 2; break;
case '2': sc = 3; break;
case '3': sc = 4; break;
case '4': sc = 5; break;
case '5': sc = 6; break;
case '6': sc = 7; break;
case '7': sc = 8; break;
case '8': sc = 9; break;
case '9': sc = 10; break;
case '0': sc = 11; break;
case ' ': sc = 57; break;
default: return false;
}
return isScancodePressed(sc);
}
......@@ -25,6 +25,8 @@ public :
bool testChar();
void set_leds(void);
/** Test if the given ASCII key is currently held down */
bool isKeyPressed(char c);
};
......
/*
* handler_clavier.cpp
*
* Created on: 8 ao�t 2008
* Author: jmenaud
*/
static int ControlKeys;
static char leds;
#include "handler_clavier.h"
#include <hal/fonctionsES.h>
static int ControlKeys = 0;
static char leds = 0;
int posBuf = 0;
int posBuf=0;
char buf[256];
bool modifBuf = false;
bool modifBuf=false;
static void reboot() {
ecrireOctet(0xFE, 0x64);
}
// table of key states: true when pressed
static bool keyDown[256] = { false };
int writechar(int sc) {
int ch = 0;
switch (sc) {
case 0x39: ch = ' '; break; // Space key
case 0x48: ch = 'U'; break; // Up arrow key
case 0x4B: ch = 'L'; break; // Left arrow key
case 0x4D: ch = 'R'; break; // Right arrow key
case 0x50: ch = 'D'; break; // Down arrow key
default: ch = 0; break;
}
return ch;
int ch = 0;
if ((ControlKeys & KBD_SHIFT) == 0)
switch (sc) {
case 16: ch=K16; break;
case 17: ch=K17; break;
case 18: ch=K18; break;
case 19: ch=K19; break;
case 20: ch=K20; break;
case 21: ch=K21; break;
case 22: ch=K22; break;
case 23: ch=K23; break;
case 24: ch=K24; break;
case 25: ch=K25; break;
case 30: ch=K30; break;
case 31: ch=K31; break;
case 32: ch=K32; break;
case 33: ch=K33; break;
case 34: ch=K34; break;
case 35: ch=K35; break;
case 36: ch=K36; break;
case 37: ch=K37; break;
case 38: ch=K38; break;
case 39: ch=K39; break;
case 44: ch=K44; break;
case 45: ch=K45; break;
case 46: ch=K46; break;
case 47: ch=K47; break;
case 48: ch=K48; break;
case 49: ch=K49; break;
case 50: ch=K50; break;
case 2: ch='1'; break;
case 3: ch='2'; break;
case 4: ch='3'; break;
case 5: ch='4'; break;
case 6: ch='5'; break;
case 7: ch='6'; break;
case 8: ch='7'; break;
case 9: ch='8'; break;
case 10: ch='9'; break;
case 11: ch='0'; break;
case 57: ch=' '; break;
case 14: ch=BS; break;
case 28: ch=EN; break;
case 185: ch=' '; break;
case 142: ch=BS; break;
case 156: ch=EN; break;
case 59: ch=F1; break;
case 60: ch=F2; break;
case 61: ch=F3; break;
case 62: ch=F4; break;
case 63: ch=F5; break;
case 64: ch=F6; break;
case 65: ch=F7; break;
case 66: ch=F8; break;
case 67: ch=F9; break;
case 68: ch=F10; break;
case 13: ch='='; break;
case 26: ch='['; break;
case 27: ch=']'; break;
case 15: ch=TAB; break;
case 122: ch='/'; break;
case 43: ch='\\'; break;
case 53: ch='/'; break;
default: break;
}
else
switch (sc) { // We got SHIFT
case 16: ch='Q'; break;
case 17: ch='W'; break;
case 18: ch='E'; break;
case 19: ch='R'; break;
case 20: ch='T'; break;
case 21: ch='Y'; break;
case 22: ch='U'; break;
case 23: ch='I'; break;
case 24: ch='O'; break;
case 25: ch='P'; break;
case 30: ch='A'; break;
case 31: ch='S'; break;
case 32: ch='D'; break;
case 33: ch='F'; break;
case 34: ch='G'; break;
case 35: ch='H'; break;
case 36: ch='J'; break;
case 37: ch='K'; break;
case 38: ch='L'; break;
case 44: ch='Z'; break;
case 45: ch='X'; break;
case 46: ch='C'; break;
case 47: ch='V'; break;
case 48: ch='B'; break;
case 49: ch='N'; break;
case 50: ch='M'; break;
case 2: ch='!'; break;
case 3: ch='@'; break;
case 4: ch='#'; break;
case 5: ch='$'; break;
case 6: ch='%'; break;
case 7: ch='^'; break;
case 8: ch='&'; break;
case 9: ch='*'; break;
case 10: ch='('; break;
case 11: ch=')'; break;
case 57: ch=' '; break;
case 14: ch=BS; break;
case 28: ch=EN; break;
case 185: ch=' '; break;
case 142: ch=BS; break;
case 156: ch=EN; break;
case 59: ch=F1; break;
case 60: ch=F2; break;
case 61: ch=F3; break;
case 62: ch=F4; break;
case 63: ch=F5; break;
case 64: ch=F6; break;
case 65: ch=F7; break;
case 66: ch=F8; break;
case 67: ch=F9; break;
case 68: ch=F10; break;
case 13: ch='+'; break;
case 26: ch='{'; break;
case 27: ch='}'; break;
case 15: ch=TAB; break;
case 122: ch='/'; break;
case 43: ch='|'; break;
case 53: ch='?'; break;
default: ch=0; break;
}
return ch;
}
void set_leds(void) {
ecrireOctet(0x60, 0xED);
}
/* this is called by irq1 in irq.asm */
void handler_clavier(int irq) {
int c = lireOctet(0x60); // Read scancode from keyboard port
int cc;
if (c < 0x80) { // Key press
cc = writechar(c);
if (cc != 0) {
modifBuf = true;
buf[posBuf] = cc;
if (posBuf < 256) posBuf++;
buf[posBuf] = '\0';
}
}
}
\ No newline at end of file
// read raw scancode from keyboard port
int raw = lireOctet(0x60);
int c = raw & 0x7F; // scancode without break bit
bool pressed = ((raw & 0x80) == 0);
// update key state table
keyDown[c] = pressed;
int cc;
static int show_all = 0;
static int doit = 0;
if(c == 1)/* 1 = ESC */
show_all = !show_all;
if(c == 60)/* 60 = F2 */
doit = !doit;
if(c == 67)/* 67 - F9 */
if(doit)
if (show_all);
if (c == 58) {
leds = leds ^ CAPS;
set_leds();
}
else
if(c == 69) {/* num lock */
leds = leds ^ NUM;
set_leds();
}
else
if (c == 70) {/* scroll lock */
leds = leds ^ SCROLL;
set_leds();
}
switch (c) {
case 0x2a:
ControlKeys |= (KBD_SHIFT | KBD_LEFTSHIFT);
break;
case 0x36:
ControlKeys |= (KBD_SHIFT | KBD_RIGHTSHIFT);
break;
case 0xaa:
ControlKeys &= ~KBD_LEFTSHIFT;
if(!(ControlKeys & KBD_RIGHTSHIFT))
ControlKeys &= ~KBD_SHIFT;
break;
case 0xb6:
ControlKeys &= ~KBD_RIGHTSHIFT;
if(!(ControlKeys & KBD_LEFTSHIFT))
ControlKeys &= ~KBD_SHIFT;
break;
}
// only process make (key-down) events for character input
if (pressed) {
if(c=='\n')
c=c;
cc = writechar(c);
switch(cc) {
case BS:
break;
case EN:
modifBuf = true;
buf[posBuf]='\n';
if(posBuf<256)
posBuf++;
buf[posBuf]='\0';
break;
case TAB:
break;
case 0: break;
case 'q' : reboot(); break;
default:
modifBuf = true;
buf[posBuf]=cc;
if(posBuf<256)
posBuf++;
buf[posBuf]='\0';
break;
}
}
}
/** Returns true if the given raw scancode (0-255) is currently pressed */
bool isScancodePressed(int sc) {
return keyDown[(unsigned char)sc];
}
#ifndef HANDLER_CLAVIER_H
#define HANDLER_CLAVIER_H
/*
* handler_clavier.h
*
* Created on: 8 ao�t 2008
* Author: jmenaud
*/
#ifndef HANDLER_CLAVIER_H_
#define HANDLER_CLAVIER_H_
#define CAPS 4
#define NUM 2
#define SCROLL 1
#define KBD_NOMODIFIER 0
#define KBD_SHIFT 1
#define KBD_LEFTSHIFT 2
#define KBD_RIGHTSHIFT 4
#define KBD_CTRL 8
#define KBD_LEFTCTRL 16
#define KBD_RIGHTCTRL 32
#define KBD_ALT 64
#define KBD_ALTGR 128
#define USERKEY 300
#define BS USERKEY+1
#define EN USERKEY+2
#define F1 USERKEY+3
#define F2 USERKEY+4
#define F3 USERKEY+5
#define F4 USERKEY+6
#define F5 USERKEY+7
#define F6 USERKEY+8
#define F7 USERKEY+9
#define F8 USERKEY+10
#define F9 USERKEY+11
#define F10 USERKEY+12
#define TAB USERKEY+13
#define K16 'a'
#define K17 'z'
#define K18 'e'
#define K19 'r'
#define K20 't'
#define K21 'y'
#define K22 'u'
#define K23 'i'
#define K24 'o'
#define K25 'p'
#define K30 'q'
#define K31 's'
#define K32 'd'
#define K33 'f'
#define K34 'g'
#define K35 'h'
#define K36 'j'
#define K37 'k'
#define K38 'l'
#define K39 'm'
#define K44 'w'
#define K45 'x'
#define K46 'c'
#define K47 'v'
#define K48 'b'
#define K49 'n'
#define K50 ','
extern int posBuf;
extern char buf[256];
extern bool modifBuf;
void handler_clavier(int irq);
int writechar(int sc);
#endif
\ No newline at end of file
/** Returns true if the given raw scancode (0-255) is currently pressed */
bool isScancodePressed(int sc);
#endif /* HANDLER_CLAVIER_H_ */
......@@ -40,8 +40,10 @@ extern "C" void Sextant_main(unsigned long magic, unsigned long addr){
sched_subsystem_setup();
asm volatile("sti\n");
Clavier clavier;
Game game;
Game game(&clavier);
game.init();
game.start();
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment