portablegaming.de

portablegaming.de (http://www.portablegaming.de/index.php)
-   Development Abteilung (http://www.portablegaming.de/forumdisplay.php?f=25)
-   -   Buttons (http://www.portablegaming.de/showthread.php?t=947)

Link 05.10.2002 18:43

Buttons
 
ich will, dass mein programm zählt, wie oft eine bestimmte taste, zum beispiel A, gedrückt wird. wie mache ich das?
ich habs schon mit
if (F_CTRLINPUT_A_PRESSED)
{
taste+=1;
}

versucht - das geht aber nicht!

hurik 05.10.2002 19:14

if (F_CTRLINPUT_A_PRESSED)
{
taste++;
}

so reicht das auch. aber du weist das das in der hauptschleife stehen muss?!?!?

Link 05.10.2002 21:18

sorry, aber dass man das ganze in die hauptschleife schreiben muss, weiss ja wohl jeder noob. und dass man den term x+=1 auch als x++ oder x=x+1 schreiben kann, ändert leider ebensowenig an meinem problem. das problem ist doch, dass die rechenoperation taste=taste+1 SOLANGE, und nicht WENN die taste A gedrückt ist, durchgeführt wird. je länger ich A gedrückt halt, umso größer wird die variable taste (weil die operation taste=taste+1 immerwieder durchgeführt wird). wenn ich nun A für fünf sekunden gedrückt halte, dann erhalte ich für taste ungefähr einen wert zwischen 4000 und 5000, obwohl ich sie nur 1mal (!) drücke. dabei sollte das programm zählen, wie oft A gedrückt worden ist...

hier ist noch einmal der ganze sourcecode (dir wird auffallen, dass die anzeige von "0x" direkt auf "mindestens 6x" springt, und nicht wie zu erwarten, stufenweise von "0x" auf "1x" und von "1x" auf "2x" usw klettert):

#include "mygba.h"

int main(void)
{
ham_Init();
ham_InitText(0);

int up=0;

while(1)
{


if (F_CTRLINPUT_UP_PRESSED)
{
ham_DrawText(2,10,"UP___");
up+=1;
}
if (F_CTRLINPUT_DOWN_PRESSED)
{
ham_DrawText(2,10,"DOWN_");
up-=1;
}



if (up==0)
{
ham_DrawText(14,10,"___________0x");
}
if (up==1)
{
ham_DrawText(14,10,"___________1x");
}
if (up==2)
{
ham_DrawText(14,10,"___________2x");
}
if (up==3)
{
ham_DrawText(14,10,"___________3x");
}
if (up==4)
{
ham_DrawText(14,10,"___________4x");
}
if (up==5)
{
ham_DrawText(14,10,"___________5x");
}
if (up>=6)
{
ham_DrawText(14,10,"mindestens 6x");
}
}
return 0;
}

andre p 06.10.2002 02:36

Nur so eine dumme Idee

;) ;) Ich kann das jetzt nicht technisch erklären, bin eben dumm aber du wirst verstehen, was ich meine. Probier doch einfach mal einen wahnsinnig großen Interwall für a. Ich meine so als ob du ein Sprite bewegen möchtest und du einen kleinen Interwall für den langsameren Ablauf in der Hauptschleife definierst. Dann setzt du den Interwall Wert eben nur noch auf eine große Zahl. Ich glaube nicht das das jemand merken würde, wenn er dein Prog benutzt.(Niemand ist so bescheuert und drückt 2 Std. eine Taste. Vielleicht kennst du ja sogar ne Möglichkeit einen unendlichen einzubauen.(Möglicherweise durch ne unendliche vor Schleife???) Wenn das was ich dir jetzt gesagt habe scheisse klingt hast du recht. Wenn es dir weiterhilft hab ich mal Glück gehabt.(hätte ja sein können.........).
Wenn du keinen Bock hast darüber Nachzudenken warte auf andere Beiträge. ;) ;) ;) ;) ;) ;)

Viel Spaß noch...

Link 06.10.2002 16:44

ich verstehe, was du meinst, und die idee ist wirklich nicht schlecht, aber glaubst du nicht, dass das ein bißchen zu umständlich ist? es muss doch eine möglichkeit geben dieses problem mit weniger aufwand zu lösen...

hurik 07.10.2002 00:40

ja gibt es und ich werde sie dir morgen zeigen bzw heute. nach der schule! aber gestern (sonntag) hatte ich einfach keine zeit!

Link 07.10.2002 13:57

danke, aber das ist nicht mehr nötig. ich habe schon eine lösung gefunden:

#include "mygba.h"

int main(void)
{
ham_Init();
ham_InitText(0);

int up=0, a=0;

while(1)
{
a++;


if (F_CTRLINPUT_UP_PRESSED)
{
ham_DrawText(2,10,"UP");
if (a==1)
{
up+=1;
}
}
else
{
ham_DrawText(2,10,"__");
a=0;
}


if (up==0)
{
ham_DrawText(14,10,"___________0x");
}
if (up==1)
{
ham_DrawText(14,10,"___________1x");
}
if (up==2)
{
ham_DrawText(14,10,"___________2x");
}
if (up==3)
{
ham_DrawText(14,10,"___________3x");
}
if (up==4)
{
ham_DrawText(14,10,"___________4x");
}
if (up==5)
{
ham_DrawText(14,10,"___________5x");
}
if (up>=6)
{
ham_DrawText(14,10,"mindestens 6x");
}


}
return 0;
}

falls du einen verbesserungsvorschlag hast, kannst du ihn aber natürlich posten.

ToruX 07.10.2002 15:51

könnte von mir sein :D

siehe Source 8)

hurik 07.10.2002 16:49

so jetzt hatte ich zeit. dieser quellcode wird auch demnächst als tut erscheinen. tut zu interruppts.

hier das programm mit guten erklärungen. wenn was zu schelcht erklärt wird dazu schreiben werds besser versuchen!

// Standart Include Dateien.
#include "mygba.h"

// Prototyp für den Interrupt.
void VblFunc(void);

// Unsere globalen Variablen.
u8 button_a = 0; // Zählt die Anzahl der A-Tasten drücke.
u8 frames = 0; // Brauchen wir zum Steuern der Frequenz mit der man drücken kann.

// Die tolle main Schleife.
int main(void)
{
ham_Init(); // Wissen wir ...
ham_InitText(0); // Wissen wir auch ...

ham_DrawText(1,1,"A: %6d", button_a); // Selbsterklärend ...

// Interrupt anschalten
ham_StartIntHandler(INT_TYPE_VBL,&VblFunc);
/* Wir benutzten eine Interupt statt der Hauptschleife. Nackteile? Keine. Vorteile? Jo!
Nähmlich dieser Interrupt also der VBL wird 60 mal die Sekunde aufgerufen! Damit können
wir unser Programm sehr gut steuern. Über die Normale Programm schleife ist das sehr sehr
Aufwendig.*/

// Unsere leere Programmschleife ist nur da um das Programm beim laufen zu halten.
while(1)
{
}

}

// Unsere Interrupt Funktion wie gesagt wird 60 mal die Sekunde ausgeführt.
void VblFunc(void)
{
frames++; // Der Counter da 60 durchgänge die Sekudne immer noch zuviel sind zählen wir mit.

if( (frames%30) == 0) // Und lassen nur 2 mal die Sekunde eine Tastatur abfrage zu! Da diese Modulo Operation nur 2 mal 0 als Lösung hat. Das passiert nur bei jedem 30 Durchlauf.
{
if (F_CTRLINPUT_A_PRESSED) // Die Tastaturabfrage! Inhalt ist Selbsterklärend!
{
button_a++;
ham_DrawText(1,1,"A: %6d", button_a);
}

}

if(frames == 60)
frames = 0; // Wenn der Counter 60 hat wird er wieder 0 gesetzt. Wie gesagt das passiert 2 mal die Sekunde!
}
/*
Mann muss die Modulo Operation änder um die Frequenz zu ändern. Ich bin mir das Ist die beste Möglichkeit
die Geschwindigkeit seines Programm zu stern! ok Alle kapiert? noch fragen?

by andreas "hurik" giemza
webmaster@hurik.de
*/

Vulnus 07.10.2002 19:35

Zitat:

Mann muss die Modulo Operation änder um die Frequenz zu ändern. Ich bin mir das Ist die beste Möglichkeit
die Geschwindigkeit seines Programm zu stern! ok Alle kapiert? noch fragen?
Nunja,hüstel....das letzte stück nicht ganz.
Ist der stern getz nen intervall/die geschwindigkeit??
Ich wois ich bin a noob!

hurik 07.10.2002 19:47

ok jo. also mit dem modulo operator (%) steuerst du die frequenz! also der modulo operator gibt von eienr division immer den rest an. wenn man 1 bis 60 durch 30 teilt kommt komtm 2 mal kein rest raus also 0. da der interrupt 60 mal die sekudne aufgerufen wird heist das das höchstens 2 mal die sekunde der wert erhöht wird. wenn du jetzt % 6 machst wird das ganze 10 mal aufgerufen. wenn du es durch 2,4 teilst wird alles 25 mal die sekunde aufgerufen und das ist ein optimaler wert für ein spiel! 25 frames die sekunde ist für den gba ok.

so noch fragen?

Tom 09.10.2002 14:31

So müsste es am einfachsten gehen:


u16 USEDKEYS = *KEYS; // Praktisch eine Kopie des KEYS Registers von der letzten Schleife
u16 UP = 0;

while(1) //Hauptschleife
{

if ( !(((*KEYS) & USEDKEYS) & KEY_UP)) //Wenn die Taste das letzte mal gedrückt wurde, und noch immer gedrückt wird.
{
UP_FUNCTION();
}
elseif ( !((*KEYS) & KEY_UP) & (!(USEDKEYS & KEYUP)==0)) //Wenn die Taste das erstemal gedrückt wird
{
UP_FUNCTION();
UP++;
}

USEDKEYS = *KEYS; //Jetzt wird noch USEDKEYS aktualisiert, und fertig.

}


Alle Zeitangaben in WEZ +2. Es ist jetzt 06:44 Uhr.

Powered by vBulletin® Version 3.8.9 (Deutsch)
Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.0


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231