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
typedefvoid(*MenuFunc)(int8_t);
7
8
int8_tactive=0;
9
10
structMenuEntry
11
{
12
int8_tup;
13
int8_tdown;
14
int8_tleft;
15
int8_tright;
16
int8_tb;
17
int8_tc;
18
MenuFuncFunction;
19
};
20
21
structMenuEntryMenu[]=
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
voidGetButton(int8_tThisButton)
31
{
32
switch(ThisButton)
33
{
34
caseBUTTON_UP:
35
active=Menu[active].up;
36
//Menu[active].funktion();
37
break;
38
39
caseBUTTON_DOWN:
40
active=Menu[active].down;
41
break;
42
43
caseBUTTON_LEFT:
44
active=Menu[active].left;
45
break;
46
47
caseBUTTON_RIGHT:
48
active=Menu[active].right;
49
break;
50
51
caseBUTTON_B:
52
active=Menu[active].b;
53
Menu[active].Function(active);
54
break;
55
56
caseBUTTON_C:
57
active=Menu[active].c;
58
break;
59
60
default:
61
break;
62
}
63
64
ClearButton();
65
}
66
67
voidSetSpeed(int8_tdirection)
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
Du musst die Funktion deklarieren, bevor Du darauf verweisen kannst:
1
voidShowSnake(int8_tx);
Die Deklaration gehört normalerweise in die h-Datei, die zu der c-Datei
gehört, in der die Funktion definiert wird. Wenn ShowSnake() also in
snake.c definiert wird, gehört die Deklaration in snake.h. snake.h hast
Du ja schon ins Hauptprogamm inkludiert, damit ist die Funktion dann
dort bekannt.
Oh man, is mir das peinlich. Ich habe gestern abend wohl etwas hektisch
rumgesucht und nicht beachtet das ich die ShowSnake() die ich gerade neu
gebastelt hatte ja auch im Header einbinden muss.
Das Problem is damit wohl gegessen...
Vom Aufbau her is das aber ok, wies aussieht.
Danke für den Tipp.
Grüße Jan
So ein universelles Menüsystem kann man machen.
Weil bei dir halt die Menüfunktion nicht sehr umfangreich ist.
Aber im Grunde ist es overkill für 3 Menuüpunkte. Eine ordentliche
Tastenentprellung und die Tastenabfrage in den Funktionen würde es in
deinem Fall auch tun.
Ich habe zusätzlich noch den Fehler gefunden, das durch diese ganze
Umstrukturierung in einer Header-Datei ein #ifndef Falscher Dateiname
stand. deshalb wurden Funktionen nicht gefunden. Ich habe gestern auch
festgestellt, das wohl mit den Tasterroutinen irgendwas nicht stimmt,
oder das Gamepad prellt doch. Habe jedoch leider keine Möglichkeit das
mal eben mit nem Oszi zu messen, aber ich denke ich werde das einfach
mal programmtechnisch abfragen und an den Tasterroutinen noch ein
bisschen rumfeilen.
Sonst bekomme ich irgendwann gar nicht mehr raus wo die Fehler
herkommen.
Vielleicht bau ich dann doch auf sone Switch-Case geschichte um, ich hab
nur immer angst das das dann irgendwann alles zu unübersichtlich wird.
Naja, ich hab dann wohl erstma wieder zu tun.
Grüße Jan