Pfeiltasten benutzen

Für Fragen von Einsteigern und Programmieranfängern...

Pfeiltasten benutzen

Beitragvon LazarusPleb » 7. Nov 2017, 21:20 Pfeiltasten benutzen

Guten Abend,
ich möchte in Open GL eine Fläche mit den Maustasten Steuern. (Bild im Anhang).
Ich habe es zunächst mit Buttons getestet und das hat funktioniert.
KeyPreview ist auf true gesetzt.
Für die Steuerung habe ich folgende Prozedur:
Code: Alles auswählen
procedure TForm1.FormKeyDown(Sender: TObject; Var Key:Word; Shift: TShiftState);
begin
  if key =
       VK_left then
       begin
         links:= links-0.1;
         rechts:= rechts-0.1;
       end;
  if key=
       VK_left then
            begin
              rechts:= rechts+0.1;
              links:= links+0.1;
            end;
  end;     


Ich finde den Fehler nicht, warum es mit den Pfeiltasten nicht funktioniert.
Bitte um Hilfe.
LazarusPleb
 
Beiträge: 6
Registriert: 5. Okt 2017, 17:05

Beitragvon Epcop » 7. Nov 2017, 21:59 Re: Pfeiltasten benutzen

Hallo



A) du hat zweimal vk_LEFT benutzt. Bei ersteren arbeitest du mit "-" bei dem zweiten mit "+". Das heißt links und rechts bleibt im Ergebnis exakt gleich (= keine Bewegung?).

B) Was passiert eigentlich mit "links" und "rechts"? nur das die Variablen einen Wert hat, entsteht noch keine Bewegung.


LG
Epcop
 
Beiträge: 57
Registriert: 29. Mai 2012, 08:36

Beitragvon LazarusPleb » 7. Nov 2017, 22:16 Re: Pfeiltasten benutzen

Epcop hat geschrieben:Hallo



A) du hat zweimal vk_LEFT benutzt. Bei ersteren arbeitest du mit "-" bei dem zweiten mit "+". Das heißt links und rechts bleibt im Ergebnis exakt gleich (= keine Bewegung?).

B) Was passiert eigentlich mit "links" und "rechts"? nur das die Variablen einen Wert hat, entsteht noch keine Bewegung.


LG


zunächst einmal möchte ich mich für die ANtwort bedanken.

A) Ja, ich habe das geändert, sodass es einmal vk_left ist und einmal vk_right.
B) https://imgur.com/a/w1409. Das grüne Teil soll sich bewegen. Wie gesagt mit Buttons ging das, also muss irgendwas da falsch sein.

Nur als Info, das ist das Objekt, was bewegt wird. Problem ist nur, es passiert gar nichts.
Code: Alles auswählen
glbegin(gl_QUADS)//Raumschiff
  glcolor3f(0,1,0);
  glvertex3f(links,-0.9,0);
  glvertex3f(rechts,-0.9,0);
  glvertex3f(rechts,-0.95,0);
  glvertex3f(links,-0.95,0);
glend;     
LazarusPleb
 
Beiträge: 6
Registriert: 5. Okt 2017, 17:05

Beitragvon Epcop » 7. Nov 2017, 23:11 Re: Pfeiltasten benutzen

Ich bin mit Open GL nicht so sehr vertraut. Trotzdem ein paar Anregungen.


glvertex sieht ja so aus:


void WINAPI glVertex3f(
GLfloat x,
GLfloat y,
GLfloat z
);


A) Demnach findet bei dir praktisch keine Bewegung statt, weil X (dein links/recht) gleich bleibt. Er arbeitet jede Zeile ab, am Anfang steht links, am Ende steht links. Und links bleibt gleich, also auch die Position.
Irgendwie musst du dein Links/Rechts noch dazwischen bringen bzw. anders aufrufen. Das ist hier nicht ersichtlich. (wann wird bei dir der glvertex bereich aufgerufen?)

Im Prinzip muss das ja so geschehen:

positionx = 10
glvertex3f(positionx,...)
Taste links gedrückt: positionx = positionx - 1; // Das hier muss irgendwie dazwischen
glvertex3f(positionx,...)
Taste links gedrückt: positionx = positionx - 1;

Nun ist positionx (X) tatsächlich jeweils eines niedriger geworden.






Ich stelle mir das in etwa so vor (pseudo code):

Code: Alles auswählen
 
var
int positionx := 100; //startposition
int positiony := 100; //startposition
 
function bewegung(int x,int y,...ergänzungen): integer
begin
glbegin(gl_QUADS)//Raumschiff
  glcolor3f(0,1,0);
  glvertex3f(x,y,0);
glend;
end;
 
procedure TForm1.FormKeyDown(Sender: TObject; Var Key:Word; Shift: TShiftState);
begin
  if key =
       VK_left then
       begin
         positionx := positionx-1;    // verständlicher als links/rechts; links ist -1 rechts ist +1
         bewegung (positionx,positiony,...)  // Bewegung gleich bei Tastendruck
       end;
  if key=
       VK_right then
            begin
         positionx := positionx+1;
         bewegung (positionx,positiony,...)
            end;
  if key=
       nach_oben then
            begin
         positiony := positiony+1;
         bewegung (positionx,positiony,...)
            end;
...
  end;   


LG
Epcop
Epcop
 
Beiträge: 57
Registriert: 29. Mai 2012, 08:36

Beitragvon LazarusPleb » 8. Nov 2017, 06:26 Re: Pfeiltasten benutzen

Epcop hat geschrieben:Ich bin mit Open GL nicht so sehr vertraut. Trotzdem ein paar Anregungen.


glvertex sieht ja so aus:


void WINAPI glVertex3f(
GLfloat x,
GLfloat y,
GLfloat z
);


A) Demnach findet bei dir praktisch keine Bewegung statt, weil X (dein links/recht) gleich bleibt. Er arbeitet jede Zeile ab, am Anfang steht links, am Ende steht links. Und links bleibt gleich, also auch die Position.
Irgendwie musst du dein Links/Rechts noch dazwischen bringen bzw. anders aufrufen. Das ist hier nicht ersichtlich. (wann wird bei dir der glvertex bereich aufgerufen?)

Im Prinzip muss das ja so geschehen:

positionx = 10
glvertex3f(positionx,...)
Taste links gedrückt: positionx = positionx - 1; // Das hier muss irgendwie dazwischen
glvertex3f(positionx,...)
Taste links gedrückt: positionx = positionx - 1;

Nun ist positionx (X) tatsächlich jeweils eines niedriger geworden.






Ich stelle mir das in etwa so vor (pseudo code):

Code: Alles auswählen
 
var
int positionx := 100; //startposition
int positiony := 100; //startposition
 
function bewegung(int x,int y,...ergänzungen): integer
begin
glbegin(gl_QUADS)//Raumschiff
  glcolor3f(0,1,0);
  glvertex3f(x,y,0);
glend;
end;
 
procedure TForm1.FormKeyDown(Sender: TObject; Var Key:Word; Shift: TShiftState);
begin
  if key =
       VK_left then
       begin
         positionx := positionx-1;    // verständlicher als links/rechts; links ist -1 rechts ist +1
         bewegung (positionx,positiony,...)  // Bewegung gleich bei Tastendruck
       end;
  if key=
       VK_right then
            begin
         positionx := positionx+1;
         bewegung (positionx,positiony,...)
            end;
  if key=
       nach_oben then
            begin
         positiony := positiony+1;
         bewegung (positionx,positiony,...)
            end;
...
  end;   


LG
Epcop



Hallo Epcot,
vielen Dank für deine Mühe. Das Problem ist jedoch, dass es eben eine Bewegung macht, wenn ich es mit Buttons mache. Ich schicke mal den Quelltext mit Buttons rein. Ausgeklammert ist dabei der Versuch mit den Pfeiltasten.
Code: Alles auswählen
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, OpenGLContext, Forms, Controls, Graphics,
  Dialogs, StdCtrls,GL,GLU,LCLType;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    OnApp: TApplicationProperties;
    OpenGLControl1: TOpenGLControl;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure OnAppIdle(Sender: TObject; var Done: Boolean);
    procedure OpenGLControl1Paint(Sender: TObject);
    procedure OpenGLControl1Resize(Sender: TObject);
   // procedure FormKeyDown(Sender: TObject; var Key:Word; Shift: TShiftState);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
  Name: String;
  links,rechts: Real;
{$R *.lfm}
implementation
{ TForm1 }
 {
procedure TForm1.FormKeyDown(Sender: TObject; Var Key:Word; Shift: TShiftState);
begin
  if key =
       VK_left then
       begin
         links:= links-0.1;
         rechts:= rechts-0.1;
       end;
  if key=
       VK_right then
            begin
              rechts:= rechts+0.1;
              links:= links+0.1;
            end;
  end;           }

 
procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.AddOnIdleHandler(@OnAppIdle);
  links:= -0.1;
  rechts:= 0.1;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  rechts:= rechts+0.1;              // Button Bewegung, Beide Seiten des Objektes müssen nach links bzw. rechts verschoben werden.
              links:= links+0.1;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
 rechts:= rechts-0.1;
              links:= links-0.1;
end;
 
procedure TForm1.OnAppIdle(Sender: TObject; var Done: Boolean);
begin
  done:= false;
  OpenGLControl1.Invalidate;
end;
 
procedure TForm1.OpenGLControl1Paint(Sender: TObject);
begin
 
glbegin(gl_QUADS);   //schwarzer Hintergrund
  glcolor3f(0,0,0);
  glvertex3f(-1,1,-0.2);
  glvertex3f(1,1,-0.2);
  glvertex3f(1,-1,-0.2);
  glvertex3f(-1,-1,0.2);
glend;
 
glbegin(gl_QUADS)//Raumschiff
  glcolor3f(0,1,0);
  glvertex3f(links,-0.9,0);
  glvertex3f(rechts,-0.9,0);
  glvertex3f(rechts,-0.95,0);
  glvertex3f(links,-0.95,0);
glend;
 
  glFlush();
  OpenGLControl1.SwapBuffers;
 
end;
 
procedure TForm1.OpenGLControl1Resize(Sender: TObject);
begin
  if OpenGLControl1.height<=0 then exit;
end;
 
end.
 
LazarusPleb
 
Beiträge: 6
Registriert: 5. Okt 2017, 17:05

Beitragvon Mathias » 8. Nov 2017, 17:05 Re: Pfeiltasten benutzen

Kannst du mal dein ganzes Project, ohne EXE als Anhang hochladen, dann kann man besser Fehler suchen.

Noch ein paar Tips zu OpenGL.
Die Hintergrundfarbe kannst du mit
Code: Alles auswählen
  glClearColor(0.8, 0.5, 0.3, 1.0);
 
festlegen. Kommt in die erste Zeile bei OpenGLControl1Paint.

Verschiebungen der Mesh mach man normalerweise mit
Code: Alles auswählen
glTranslatef(x, y, z);
Dies kommt vor das glBegin bei dem Raumschiff.

PS:
Code: Alles auswählen
procedure TForm1.FormKeyDown

Versuche mal das KeyDown von OpenGLControl zu nehmen, ich denke, dies ist dein Fehler.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3201
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon LazarusPleb » 8. Nov 2017, 21:38 Re: Pfeiltasten benutzen

Mathias hat geschrieben:Kannst du mal dein ganzes Project, ohne EXE als Anhang hochladen, dann kann man besser Fehler suchen.

Noch ein paar Tips zu OpenGL.
Die Hintergrundfarbe kannst du mit
Code: Alles auswählen
  glClearColor(0.8, 0.5, 0.3, 1.0);
 
festlegen. Kommt in die erste Zeile bei OpenGLControl1Paint.

Verschiebungen der Mesh mach man normalerweise mit
Code: Alles auswählen
glTranslatef(x, y, z);
Dies kommt vor das glBegin bei dem Raumschiff.

PS:
Code: Alles auswählen
procedure TForm1.FormKeyDown

Versuche mal das KeyDown von OpenGLControl zu nehmen, ich denke, dies ist dein Fehler.


Vielen Dank Mathias, hat daran gelegen, OpenGLControl zu nehmen. Danke
LazarusPleb
 
Beiträge: 6
Registriert: 5. Okt 2017, 17:05

• Themenende •

Zurück zu Einsteigerfragen



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste

porpoises-institution
accuracy-worried