Pfeiltasten benutzen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
LazarusPleb
Beiträge: 10
Registriert: Do 5. Okt 2017, 18:05

Pfeiltasten benutzen

Beitrag von LazarusPleb »

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.

Epcop
Beiträge: 140
Registriert: Di 29. Mai 2012, 09:36

Re: Pfeiltasten benutzen

Beitrag von Epcop »

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

LazarusPleb
Beiträge: 10
Registriert: Do 5. Okt 2017, 18:05

Re: Pfeiltasten benutzen

Beitrag von LazarusPleb »

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;     

Epcop
Beiträge: 140
Registriert: Di 29. Mai 2012, 09:36

Re: Pfeiltasten benutzen

Beitrag von Epcop »

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

LazarusPleb
Beiträge: 10
Registriert: Do 5. Okt 2017, 18:05

Re: Pfeiltasten benutzen

Beitrag von LazarusPleb »

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.
 

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Pfeiltasten benutzen

Beitrag von Mathias »

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 grün
Mit Java und C/C++ sehe ich rot

LazarusPleb
Beiträge: 10
Registriert: Do 5. Okt 2017, 18:05

Re: Pfeiltasten benutzen

Beitrag von LazarusPleb »

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

Antworten