Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
10.06.2009, 18:20
Protestallianz



Hallo,

wollte eine Ereignis auslösen auf Benutzen der Linken- bzw. der Rechtenpfeiltaste.
Mein Lösungsansatz:
Mit einer KeyDown Abfrage den Key vergleichen und dann ggf. Code ausführen:
Quellcode:void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
Label1->Caption="Druck"
if ( Key == VK_UP) {Label1->Caption="Funktion getestet";}
}
Seltsam nur das es nicht geht.
wenn ich irgendeine Taste drücke steht dann da Druck was ja auch richtig ist, wenn ich aber Pfeiltasten Oben drücke wird die Caption nicht geändert(Nichtmal DRUCK).
Mal getest mit VK_Escape und da geht es.
Es scheint, als würden die Pfeiltasten gar nicht berücksichtigt werden für KeyDown.

Weiter Informationen:
-c++ Builder von Borland
-Borland benutzt Virtual Keys
-Pfeiltasten haben nichts mit ASSCI zu tun
-Es sind nicht die Pfeile auf dem Numpad und dieses dürfen es auch nicht werden ^^

WICHTIG: Mir ist gerade aufgefallen, dass es bei Key up funzt, was aber auch dumm ist, da es eine Tetrisstuerung wird und man da ja mal öfter zu einer Seite will.
Und es sollte auch bei Down gehen

Zitat:
Hilfe dazu:
... Ereignisbehandlungsroutinen OnKeyUp und OnKeyDown auf die Tasten Bezug genommen werden.

--

-GAMING-


Dieser Beitrag wurde am 10.06.2009 um 19:05 von Protestallianz bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
001
10.06.2009, 20:24
hausi



Setz mal KeyPreview auf true. Ev. hat ein anderes Control den Fokus, wodurch Key-Events nicht mehr auf dem Form kommen. KeyDown / KeyUp müssten eigentlich problemlos mit VK_LEFT, RIGHT, UP und DOWN kommen, habe das auch schon oft gemacht.

--

zum Seitenanfang zum Seitenende Profil || Suche
002
11.06.2009, 09:15
Protestallianz



Ja KeyUp funzt aber KeyDown nicht... komisch naja mt KeyPreview habe ich es auch schon probiert aber in der Hilfe steht, das KeyPreview sich nicht auf Steuerungstasten bezieht...

--

-GAMING-

zum Seitenanfang zum Seitenende Profil || Suche
003
11.06.2009, 11:04
hausi



Schau mal mit Spy++, ob die WM_KEYDOWN messages überhaupt kommen. Falls ja, ist das Problem in der VCL oder deinem Code zu suchen. Hast du den VCL Source? -> Debuggen

--

zum Seitenanfang zum Seitenende Profil || Suche
004
11.06.2009, 11:32
Protestallianz



Mhm bin gerade nicht daheim aber hausi, dein Lösung klingt am wahrscheinlichsten.

Ich stehe aber or noch einem Problem, und zwar habe ich die Tetris Steine alle als Jpeg und habe erst mal mit Image probiert, habe da aber Probleme mit der Kollisionsabfrage(Also wann die Images sich berühren) und das größer ist, das neue "spawnen". Ich habe kiene Ahnung, wie ich endlos Images erstelle.....

Also bin ich umgestigen auf ein Image und Canvas (Image1->Canvas).
Jetzt habe ich mir über legt, ich kann die Kollision mit der Färbung der Pixel abfragen(rechenlastig).
Jetzt aber das Hauptproblem:
Ich komme einfach nicht dahinter die gezeichneten Dinger zu bewegen....
Klar Löschen und neuzeichen, aber wie mache ich dass ohne die bereits gefallene Steiner auf dem Boden zu löschen.
Kann man irgendwie mit nem dynamischen Arry jedes in Canvas gezeichenete Rechteck/Viereck/L bestimmen und dann löschen und verschieben, weil man muss ja auch solba eine reihe voll ist alle anderen wieder nach unten verschieben!!!!
€:Am liebsten würde ich auf objekt orientierte Programmirung erstmal verzichten und diese später einsetzen, muss erstmal dass eine RICHTIG lernen, weil ich kann nichts richtig, dafür aber alles halb ^^

--

-GAMING-


Dieser Beitrag wurde am 11.06.2009 um 11:40 von Protestallianz bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
005
11.06.2009, 14:26
Bluthund



Zitat:
weil ich kann nichts richtig, dafür aber alles halb ^^
Das ist eher ":/" als "^^"

Du solltest prinzipiell zwischen Spiellogik und Darstellung trennen.
Sprich: Du hältst eine interne Repräsentation deines Spielfelds vor, berechnest Kollisionen anhand dieser und zeichnest dann aufgrund dieser auch das gesamte Spielfeld jeden Frame neu (alternativ auch nur die Regionen die durch Veränderungen als "dirty" markiert worden sind falls das dein Zeichen-Framework anbietet).
Sehr gutes Tutorial zum Thema Tetris nachbasteln:
http://gametuto.com/tetris-tutorial-in-c-render-independent/

--

The C language combines all the power of assembly language with all the ease-of-use of assembly language.
"humorig is n blödwort :>" by -CarniGGeLjumpR-

zum Seitenanfang zum Seitenende Profil || Suche
006
12.06.2009, 15:32
Protestallianz



Ja dein Links ist gut, aber ich hab da extreme Problem mit, dass in 1.5 Wochen zu lernen.....

Ich will es auf jedenfall nachholen aber das Projekt erstmal ohne Objektorientierte
Elemente abzugeben. Ich werde mal sehen was sich auch nem Dynamischen Arry und nem Canvas hinbekommt. Vllt hat ja einer ne gute Idee, wie ich die Bewegung im Canvas mache, ohne auf copy past zurückzugreifen........

Versprochen ich hole Klassen-Tetris nach ^^

--

-GAMING-

zum Seitenanfang zum Seitenende Profil || Suche
007
12.06.2009, 16:36
hausi



Du solltest seinen Post genauer lesen. Das wichtige an seinem Post war nicht, dass du es OO machen sollst, sondern dass du die Darstellung von der Logik trennen sollst.
- Du machst einen 2d-Array für dein Spielfeld (1min)
- 0 = kein Block, 1..n = verschiedene Farben (0min)
- Tetris auf diesem Array implementieren (Kollisionsorüfungen, Zeilen-Prüfung, ...) (60min)
- Renderer für diesen Array schreiben (120min)
- Bei jeder Spielfeldänderung das Bild aktualisieren (1min)
Total: 3h 2min + Debugging (60min)

--


Dieser Beitrag wurde am 12.06.2009 um 16:37 von hausi bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
008
12.06.2009, 21:51
Protestallianz



Zitat:
hausi postete

- Tetris auf diesem Array implementieren (Kollisionsorüfungen, Zeilen-Prüfung, ...) (60min)
- Renderer für diesen Array schreiben (120min)

Und genau da fängt es an. Arry [Xpos] [Ypos]. Und die dann zu weisen.
Block ist da also wird einer 1 gesetzt, fertig! Kollisionsabfrage, kein Problem(ist ja nur 1 mit 0 vergleichen)Aber jetzt kommts: Wie mache ich die Grafischeanzeige aus der Logik. Ich hab mir überlegt mit 2 Schleifen alle Arry werte durch zugehen und dann zu zeichnen. aber wie zeichne ich an der Stelle.
Bzw. ist es möglich ein Image1->Canvas als Sielfeld zu nehemen und eigene bmp zu laden, oder muss ich immer im Rectangle() arbeiten, um neue zu erstellen.
Am liebesten würde ich für jeden Block ein Image erstellen, dass das Bild hat, ich weiß aber nicht wie ich unendlichviele ImagesX erstlle und die dann mit ImageX anspreche. (Ja ist verwirrend, aber ich habe glaube ichverstanden was ihr meint und mir kommen so viele Ideen. Ich setzte mich gleich morgen mal ran!!!!)!

--

-GAMING-

zum Seitenanfang zum Seitenende Profil || Suche
009
13.06.2009, 13:33
rawe



lad doch sowas... in ein unsichtbares Image und kopiere dann via Canvas->CopyRect ab Spielarray[x][y]*Kachelbreite eine Kachel in das große anzeige-Image->Canvas. 0 wäre dann die weiße Kachel, 1,2,3... usw dann die entsprechenden bunten Kacheln. In der Hilfe zu CopyRect steht afair auch nen Beispiel zur Anwendung...

--

O o
/¯¯/_o___o___o___o____o__
\__\¯¯o¯¯¯o¯¯¯¯¯¯o¯¯¯¯¯¯o
i'm doctoroctogonnafuckinggonnapus blaaaaaaaaaaargggggg-


Dieser Beitrag wurde am 13.06.2009 um 13:37 von rawe bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
010
14.06.2009, 14:44
Protestallianz



Ja so wollte ich es erst machen, habe jetzt aber etwas anderes:
Zeichen ein riesengroßen Rechteck über die gesammt Zeichenfläche und darauf dann die Bausteine.
Und dann von vorn.

Bishher habe ich alles Fertig bis auf die Rotation und die Benutzung von anderen Dingen außer dem Viereck. Und genau daran hänge ich... mal guggen wenn nicht schreib ich hier nachher nochmal!

--

-GAMING-

zum Seitenanfang zum Seitenende Profil || Suche
011
15.06.2009, 18:28
Protestallianz



So ich habe mir überlegt für jedes Eement und jeder Position einer Rotationsfunktion zu schreiben. Also insgesamt 7*4=28 Und das ist ganz schön viel und ich dachte mir, das geht auch einfachher und hab nen Freund gefragt, der meinte das geht mit einer Funktion für alle.
Und zwar muss man sin cos benutzen, er wusste aber nicht mehr wie!?
Ich hab ein zeidimmensionales arry.
[x][y]==0 //Kein Block
[x][y]==1 //Ein Block der in Bewegung ist
[x][y]==2 //Ein fester gefallener Block!
[x][y]==3//Ein Block, der inj Bewegung ist und nachher die Rotationsachse bildet
Im Inte finde ich nix brauchbares habe aber mal mit ner if abfrage nd ner Schleife den Abstand zur Rotationachse festgestellt und den neuen Wert dafür in ein hilfsarray geschrieben aber mit anderen werten
x=(int)cos(a)*Abstand+0,5 //a=Winkel also 0,90,180,360
y=(int)sin(a)*Abstand+0,5
Und das Normalearry wieder mit dem Hilfsarry überschrieben (So mache ich das auch bei der Bewegung etc.)
Und angezeigt aber iwie kommt da nur murks raus.

Weiß einder wie man ein 2d array dreht??

--

-GAMING-

zum Seitenanfang zum Seitenende Profil || Suche
012
15.06.2009, 21:44
Bluthund



Erstmal vorweg:
Wenn du weißt, dass dein a ein vielfaches von 90° ist, dann kannst du daraus ableiten, dass der Sinus/Kosinus immer aus {-1,0,1} ist. Damit kannst du dir den nicht ganz billigen Aufruf von sin()/cos() sparen. Zumal du ja eh nen Integer haben willst und durchs Casten prinzipiell das Risiko eingehst hier in nen Fehler zu laufen.
Außerdem hat C++ cast-Operatoren.

Ein zweidimensionales quadratisches n*n Array dreht man nach rechts indem aus der ersten Zeile die nte Spalte, die zweite Zeile die n-1te Spalte wird.
Für die Linksdrehung machst du das ganze genau umgekehrt: Aus Spalte n wird Zeile 1, aus Spalte n-1 Zeile 2, usw usf.

Wenn du es gern rechnen willst:
Quadratische n*n Matrix A nach rechts gedreht = A^T * B
Quadratische n*n Matrix A nach links gedreht = (A * B)^T

B ist hierbei eine quadratische Matrix mit n_B = n_A, die auf der Nebendiagonale Einsen hat und alle anderen Einträge 0 sind. Bspw für 3x3: [0 0 1;0 1 0;1 0 0]

So und jetzt sag ich dir noch, dass du dir einfach mal den Link hättest ankucken sollen, wo nen ganz simples Verfahren beschrieben wird um die Klötze darzustellen. Nämlich indem du alle Rotationen einfach von Hand "berechnest" (du kannst natürlich auch gern nen Template schreiben, dass dies für dich zur Compilezeit tut) und im Speicher ablegst. Damit verbrätst du wahnsinnige 700 Bytes insgesamt für alle Spielsteine (7 Steine * 4 Rotationen * 5 Zeilen * 5 Spalten) und der Aufwand für die Drehung zur Laufzeit beläuft auf das Setzen des richtigen Index.
Du brauchst auch keine 4 Zustände für die Aufteilung deines Spielfelds. Du benötigst genau zwei - voll und leer.
Wenn du den dynamischen Teil (aktueller Spielstein) und den statischen Teil (alle bisher gefallenen Steine am Boden des Spielfelds) zusammenpackst, machst du dir das Leben nur unnötig schwer.

--

The C language combines all the power of assembly language with all the ease-of-use of assembly language.
"humorig is n blödwort :>" by -CarniGGeLjumpR-


Dieser Beitrag wurde am 15.06.2009 um 21:56 von Bluthund bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
013
18.06.2009, 18:17
Protestallianz



Also, es ist eine rechteckige Matrix und ja ich hätte es von vorneherein anders machen sollen, stimmt schon! Aber ich bekomme es trotzdem nicht hin.
Folgendes proiert
Quellcode:for( int a=1; a<=10; a++)
{
        for(int b=1; b<=15; b++)
        {
         if (Form1->kor[z] [u]==1)
         {
         k=a+1;
         l=b-1;
         Form1->kor_hilfe [k][l]=Form1->kor[a] [b];
         Form1->kor [a] [b]=0;
         }
        }
  }
for( int a=1; a<=10; a++)
{
        for(int b=1; b<=15; b++)
        {
        if(Form1->kor_hilfe[a] [b]==1)
         {

         Form1->kor[a] [b]=Form1->kor_hilfe [a] [b];
         Form1->kor_hilfe [a] [b]=0;
         }
        }
  }
Aber da verschiebt sich das ganze nur nach rechts, was ja auch logisch ist...

--

-GAMING-

zum Seitenanfang zum Seitenende Profil || Suche