Moin!
Ich habe ma wieder ein Problem mit meinem Snakeprojekt.
Also die ansteuerung der Matrix läuft ja jetzt sauber, wie aus meinen
vorigen Beiträgen zu sehen ist.
Jetzt geht es darum die Bedienung zu realisieren. Ich habe da jetzt
schon ne Menge dran rumgespielt.
Zum Steuern habe ich mir ein altes Sega Megadrive Gamepad ausgegraben.
Das finde ich echt optimal. Der Anschluss lässt sich einfach über einen
D-Sub stecker realisieren, die ganze Geschichte läuft bei 5V, um
entprellen oder so was braucht man sich keine Sorgen machen und das
Tasten auslesen läuft Parallel, also keine Serielle Datenverarbeitung
mit Protokoll ausdenken oder so.
Ich hab zum detektieren der Tasten einen Timer interrupt vorgesehen, bei
dem in bestimmten Zeitabständen abgefragt wird ob irgend ne Taste
gedrückt wurde.
Um das Spiel zu starten habe ich mir so etwas wie eine Menüstruktur
überlegt und dank einiger kompetenter Menschen hier konnte ich teile von
vorgestelltem Code einfach für mich umbauen.
Ich wäre froh wenn ihr mal über den Code drüberkucken könntet, um mir
notfalls zu sagen ob ich auf dem Holzweg bin und mir lieber etwas neues
überlegen soll, oder ob ich so weiter machen kann.
Das Projekt hatte ich ehrlich gesagt etwas unterschätzt...
Hier der Code zur Snakesteuerung:
1 | #include <stdint.h>
|
2 | #include "snake.h"
|
3 | #include "SegaGamepad.h"
|
4 | #include "matrix8x16.h"
|
5 |
|
6 | typedef void (*MenuFunc)(int8_t);
|
7 |
|
8 | int8_t active = 0;
|
9 |
|
10 | struct MenuEntry
|
11 | {
|
12 | int8_t up;
|
13 | int8_t down;
|
14 | int8_t left;
|
15 | int8_t right;
|
16 | int8_t b;
|
17 | int8_t c;
|
18 | MenuFunc Function;
|
19 | };
|
20 |
|
21 | struct MenuEntry Menu[] =
|
22 | {
|
23 | {0, 0, 0, 0, 1, 0, ShowSnake }, //snakepicture (0)
|
24 | {1, 1, 1, 1, 2, 0, SetSpeed }, //speedoption (1)
|
25 | {4, 4, 4, 4, 3, 1 /*run the snake*/ }, //play game (2)
|
26 | {3, 3, 3, 3, 2, 1 /*stop snake*/ } //pause game (3)
|
27 | };
|
28 |
|
29 |
|
30 | void GetButton(int8_t ThisButton)
|
31 | {
|
32 | switch(ThisButton)
|
33 | {
|
34 | case BUTTON_UP:
|
35 | active = Menu[active].up;
|
36 | //Menu[active].funktion();
|
37 | break;
|
38 |
|
39 | case BUTTON_DOWN:
|
40 | active = Menu[active].down;
|
41 | break;
|
42 |
|
43 | case BUTTON_LEFT:
|
44 | active = Menu[active].left;
|
45 | break;
|
46 |
|
47 | case BUTTON_RIGHT:
|
48 | active = Menu[active].right;
|
49 | break;
|
50 |
|
51 | case BUTTON_B:
|
52 | active = Menu[active].b;
|
53 | Menu[active].Function(active);
|
54 | break;
|
55 |
|
56 | case BUTTON_C:
|
57 | active = Menu[active].c;
|
58 | break;
|
59 |
|
60 | default:
|
61 | break;
|
62 | }
|
63 |
|
64 | ClearButton();
|
65 | }
|
66 |
|
67 | void SetSpeed(int8_t direction)
|
68 | {
|
69 | ClearMatrix();
|
70 | }
|
Naja, jetzt entlich zu dem Problem.
Ich bekomme die Fehlermeldung:
'ShowSnake' undeclared here (not in a function).
Mit SetSpeed funktionierts komischerweise.
Ich habe die Vermutung das eine Funktion die in einem anderen .c-File
liegt ( wie ShowSnake() ) nicht mit diesem Funktionspointer genutzt
werden kann.
Kann das sein? Wenn ja, welche Möglichkeit gibts dann? Irgendwie muss
das doch gehen.
Naja, ich hoffe Ihr könnt mir helfen.
Grüße Jan