StarCraft 2 Forum | inStarCraft.de by ingame™  
Alt 09. April 2007, 16:19   #1
BurgerMeister
 
Benutzerbild von BurgerMeister
Landefrachter
 
Registriert seit: Mär 2004
Beiträge: 633
Delphi-Kenner gesucht

Advertising
Ich progge gerade ein bisserl in Delphi, aber ich stoße schnell an meine Grenzen. Ich will einen Ball bewegen lassen und mache das mit eine OnKeyDown procedure, jedoch schein mir das nicht gerade das optimalste, weil 1. wenn ich die Taste gedrückt halte, dass sich der Ball schneller bewegt, brauch es ein bisschen bis er diese "Einrastfunktion" macht und 2. wenn ich ihn nach Links/rechts bewegen lassen und dann die Springen Taste drücke, dann springt er nur, ohne das auf die Bewegung vorher eingegangen wird.
Habt ihr da eine Lösung, wie man das Problem lösen kann?

(dieser Thread ist nicht als "Wie-finde-ich-Delphi-Thread" zu verstehen, also Meinungen in der Richtung einfach stecken lassen)
BurgerMeister ist offline  
Mit Zitat antworten
Alt 09. April 2007, 17:19   #2
4GT_DosX
 
Beiträge: n/a
Wie behandelst du denn die Eingaben bisher? In einer OnKeyDown Funktion fragst du ab welche Taste gedrückt wurde und startest eine passende Funktion?

Der Ball soll bei festgehaltener Taste immer schneller werden?

Poste am besten mal ein paar Codeschnippsel.
 
Mit Zitat antworten
Alt 09. April 2007, 17:32   #3
BurgerMeister
 
Benutzerbild von BurgerMeister
Landefrachter
 
Registriert seit: Mär 2004
Beiträge: 633
Code:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key=38 then begin
    Timer1.Enabled:=true;
  end;
  if Key=37 then begin
    if X1>0 then begin
      Image1.Canvas.Pen.Color:=clWhite;
      Image1.Canvas.Ellipse(X1,Y1,X2,Y2);
      X1:=X1-5; X2:=X2-5;
      Image1.Canvas.Pen.Color:=clBlack;
      Image1.Canvas.Ellipse(X1,Y1,X2,Y2);
    end;
  end;
  if Key=39 then begin
    if X2<600 then begin
      Image1.Canvas.Pen.Color:=clWhite;
      Image1.Canvas.Ellipse(X1,Y1,X2,Y2);
      X1:=X1+5; X2:=X2+5;
      Image1.Canvas.Pen.Color:=clBlack;
      Image1.Canvas.Ellipse(X1,Y1,X2,Y2);
    end;
  end;
end;
Das ist meine Ganze KeyDown-Prozedur
Kleine Erklärungen zum besseren Verständniss:
X1,Y1,X2,Y2 sind die Koordinaten für die Ellipse
Um die Bewegung darzustellen male ich einmal die Elipse weg und dann wieder hin
Der Timer sorgt dafür, dass der Ball hochfliegt und wieder runter kommt, wenn nötig kann ich den auch noch abbilden, aber ich glaube dass ich das nicht machen brauche.
BurgerMeister ist offline  
Mit Zitat antworten
Alt 09. April 2007, 18:49   #4
4GT_DosX
 
Beiträge: n/a
Bei der Abfrage der Taste in der Keydown Funktion wird doch wahrscheinlich davon ausgegangen, dass der Nutzer nur eine Taste drücken wird (nehme ich einfach mal an). Insofern bringt deine IF Konstruktion nicht so sehr viel: KeyDown wird bei jedem Tasteneregnis neu aufgerufen. Alle Tastenabfragen werden in deinem Quellcode aber nacheinander abgearbeitet.
Deine IF Abfragen werden immer ALLE durchgearbeitet, einfacher und wesentlich effektiver wär hier eine CASE Anweisung - wie geschaffen für Tastaturabfragen, notfalls auch eine geschachtelte IF-Abfrage:

Code:
IF (TASTE1)
ELSE IF (TASTE2)
ELSE IF (TASTE3)
Ansonsten noch ein paar Kleinigkeiten:
Der Timer wird auch wieder beendet?

Aus
Code:
 if Key=37 then begin
    if X1>0 then begin
kann man auch eine einzelne IF Abfrage basteln.
 
Mit Zitat antworten
Alt 09. April 2007, 19:10   #5
BurgerMeister
 
Benutzerbild von BurgerMeister
Landefrachter
 
Registriert seit: Mär 2004
Beiträge: 633
Ja, stimmt, ich neige irgendwie noch ganz stark dazu, zu kleinkariert zu programmieren. Du hast selber schon mein Problem erkannt, dass KeyDown immer von neuen gestartet wird, wenn ich eine Tage betätige, nur das möchte ich ja weg haben. Weißt du eine andere Möglichkeit, wie ich das geschickt in Delphi anstelle? Falls du vllt nicht weißt, was ich meine, dann schreib mich einfach in ICQ an, ich glaube ich habe hier drin meine Nummer notiert. Wenn nicht, dann einfach hier die Lösung rein
BurgerMeister ist offline  
Mit Zitat antworten
Alt 10. April 2007, 12:24   #6
The_Company
 
Beiträge: n/a
Normalerweise behandelt man Key events so, dass man ne Operation startet, wenn sie nochj nicht laeuft, und die Operation beendet, wenn das entsprechende KeyUp event kommt. Dann hat man auch den Stress mit den Key repeats nicht. Genau so, wie Du es bereits mit dem Timer1 machst. Machste Dir halt nen Timer2 fuer die X Bewegung.
 
Mit Zitat antworten
Alt 10. April 2007, 13:11   #7
BurgerMeister
 
Benutzerbild von BurgerMeister
Landefrachter
 
Registriert seit: Mär 2004
Beiträge: 633
Echt eine starke Idee, wäre ich so nie drauf gekommen. Danke für den Tip. Ich glaube damit kann der Thread gelöscht werden, weil mein Problem gelöst ist.
BurgerMeister ist offline  
Mit Zitat antworten
Antwort
Zurück   StarCraft 2 Forum | inStarCraft.de by ingame™ > Support Foren > Technik/Software-Forum

Themen-Optionen
Ansicht

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:24 Uhr.


Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2013, Jelsoft Enterprises Ltd.


ingame Netzwerk
Support | AGB | Probleme mit der Werbung melden
Online Werbung | Mediadaten | Unternehmen | Karriere | Presse | Impressum

© ingame GmbH, ingame™, in™ und incup™ sind eingetragene Markenzeichen der ingame GmbH. Verwendung von Inhalten nur mit schriftlicher Genehmigung.