Autor Beitrag
oneP Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 71

Win XP Professional
Turbo Delphi 2006
BeitragVerfasst: Di 12.05.09 18:37 
user profile iconJakob_Ullmann hat folgendes geschrieben Zum zitierten Posting springen:
Eventuell sollte man auch noch TForm.DoubleBuffered auf True stellen.

und wo finde ich diese Eigenschaft? oder wo und wie muss ich sie im Quelltext schreiben?

und noch ne Frage: wie könnte ich eine Kollision mit den Wänden machen? die müsste doch irgendwie so gehn:
ausblenden Delphi-Quelltext
1:
2:
 if Image1.Left = Form1.clientwidth then
  ....


Moderiert von user profile iconNarses: Zitat repariert
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Di 12.05.09 19:29 
Hallo user profile icononeP,

hier wieder mal ein Pseudo-Code:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
AusserFormular :=
  ((Button.Right > Form.Right) or     // X-Achse
   (Button.Left < Form.Left)) or
  ((Button.Bottom > Form.BottomTop) or     // Y-Achse
   (Button.Top < Form.Top));

Edit: Hervorgehobenen Fehler behoben :autsch:


Zuletzt bearbeitet von Yogu am Di 12.05.09 21:02, insgesamt 1-mal bearbeitet
oneP Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 71

Win XP Professional
Turbo Delphi 2006
BeitragVerfasst: Di 12.05.09 20:13 
Yogu danke für den Code.
Der sieht ganz logisch aus. Aber komischerweise rast der Punkt immer noch durch die Wand...
also der sieht jetz bei mir so aus:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
if
((Image1.Left+width > Form1.clientwidth) or     // X-Achse
(Image1.Left < Form1.Left)) and
((Image1.top+height > Form1.clientHeight) or     // Y-Achse
(Image1.Top < Form1.Top))
then  begin
 rechts := 0;
 runter := 0;
end;

rechts und runter sind variablen des timers.
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Di 12.05.09 20:15 
user profile icononeP hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
if
((Image1.Left+width > Form1.clientwidth) or     // X-Achse
(Image1.Left < Form1.Left)) and
((Image1.top+height > Form1.clientHeight) or     // Y-Achse
(Image1.Top < Form1.Top))
then  begin
 rechts := 0;
 runter := 0;
end;

Tja - Faulheit wird bestraft :mrgreen:

Natürlich musst du das Image1. vor Width bzw. Height wiederholen - sonst greifst du ja auf die Eigenschaften des Formulars zu :idea:
oneP Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 71

Win XP Professional
Turbo Delphi 2006
BeitragVerfasst: Di 12.05.09 20:43 
Ja ich habs jetzt geändert. Trotzdem rennt der Punkt durch die wand.
Jakob_Ullmann
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: Di 12.05.09 20:44 
user profile icononeP hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconJakob_Ullmann hat folgendes geschrieben Zum zitierten Posting springen:
Eventuell sollte man auch noch TForm.DoubleBuffered auf True stellen.

und wo finde ich diese Eigenschaft? oder wo und wie muss ich sie im Quelltext schreiben?


Zumindest bei D2006 nicht im Objektinspektor. Du könntest zum Beispiel bei FormCreate schreiben:

ausblenden Delphi-Quelltext
1:
DoubleBuffered := True;					


Hilft gegen das Flimmern. :P
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Di 12.05.09 20:58 
user profile icononeP hat folgendes geschrieben Zum zitierten Posting springen:
Ja ich habs jetzt geändert. Trotzdem rennt der Punkt durch die wand.

Zeig bitte nochmal den Quellcode, wie du ihn dafür im Moment stehen hast.
Und, mit welcher Wand hast du das ausprobiert?

Edit: Ähh.. dsa Beispiel von Yogu geht nur, wenn der Punkt auf der X- UND Y-Achse außerhalb des Bildes ist. Du musst das noch so abändern, dass es ausreicht, wenn man auf einer der Seiten raus ist.

_________________
PROGRAMMER: A device for converting coffee into software.
Jakob_Ullmann
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: Di 12.05.09 21:02 
Ungetestet, aber imho müsste es reichen, aus dem AND ein OR zu machen.
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Di 12.05.09 21:06 
Spielverderber :D

_________________
PROGRAMMER: A device for converting coffee into software.
Jakob_Ullmann
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: Di 12.05.09 21:07 
Sorry, jetzt sehe ich es auch. :oops:
oneP Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 71

Win XP Professional
Turbo Delphi 2006
BeitragVerfasst: Di 12.05.09 21:25 
Das AND hab ich schon lang geändert. Bin selbst drauf gekommen :D Jetz funktionierts.
aber wieso hält der Punkt ein paar millimeter vor der Wand schon an?

und noch paar weitere Fragen:
- wie stellt man im Formular ein, dass der user das fenster selbst nicht vergrößern kann?
- wenn der Punkt zB an der Linken Wand andockt dann bleibt er dort "hängen" und man kann ihn nicht rauf und
runter steuern nur rechts. Wie kann man dieses "Heften" abschalten?
- wie kann ich ein anderes Image durch Andocken verschwinden lassen? (wie man die aktion auslößt weiß ich, aber
ich weiß nicht welche eigenschaft man da ändern muss)

wäre sehr dankbar für die hilfe
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Di 12.05.09 21:34 
Normalerweise soll man ja für jede neue Frage einen eigenen Thread aufmachen..

user profile icononeP hat folgendes geschrieben Zum zitierten Posting springen:
aber wieso hält der Punkt ein paar millimeter vor der Wand schon an?

Füllt der Punkt vielleicht nich das ganze Image aus?

user profile icononeP hat folgendes geschrieben Zum zitierten Posting springen:
und noch paar weitere Fragen:
- wie stellt man im Formular ein, dass der user das fenster selbst nicht vergrößern kann?

Eigenschaft: "Constraints" heißt die glaub ich. Setze da jeweils Min = Max.

user profile icononeP hat folgendes geschrieben Zum zitierten Posting springen:
- wenn der Punkt zB an der Linken Wand andockt dann bleibt er dort "hängen" und man kann ihn nicht rauf und
runter steuern nur rechts. Wie kann man dieses "Heften" abschalten?

Tja.. Code?

user profile icononeP hat folgendes geschrieben Zum zitierten Posting springen:
- wie kann ich ein anderes Image durch Andocken verschwinden lassen? (wie man die aktion auslößt weiß ich, aber
ich weiß nicht welche eigenschaft man da ändern muss)

Mal überlegen.. verschwinden bedeutet "nicht sichtbar". Und was sichtbar im englischen heißt, kannst du selber nachschauen ;) Tipp: Guck dir die Eigenschaften von dem Image an..

_________________
PROGRAMMER: A device for converting coffee into software.
oneP Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 71

Win XP Professional
Turbo Delphi 2006
BeitragVerfasst: Mi 13.05.09 13:33 
Danke thepaine91!
Moderiert von user profile iconNarses: Der Dank bezieht sich auf den Code aus diesem Beitrag - wird ab hier allerdings nicht mehr verfolgt und ist deshalb in einen eigenen Thread verlagert.

@Xentar:
Zitat:

Füllt der Punkt vielleicht nich das ganze Image aus?

stimmt. Daran habe ich gar nicht gedacht.

Zitat:
Mal überlegen.. verschwinden bedeutet "nicht sichtbar". Und was sichtbar im englischen heißt, kannst du selber nachschauen ;) Tipp: Guck dir die Eigenschaften von dem Image an..

"visible" macht das Image nur unsichtbar. Aber es ist immer noch aktiv d.h. wenn man über das unsichtbare drüberfährt wird trotzdem die aktion ausgelößt. Ich will aber das es ganz verschwindet. Verstehste was ich mein?

Zitat:
Tja.. Code?

So sieht mein Code aus. Ist vllt sehr anfängerhaft aber alles funzt soweit. Nur dass die Kugel nicht mehr nach oben oder unten steuerbar ist wenn sie zB an der linken Wand "heftet"

ausblenden volle Höhe Delphi-Quelltext
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:
unit Punkt2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  runter, rechts: integer;

implementation

{$R *.dfm}


procedure TForm1.FormCreate(Sender: TObject);
begin
  image1.Picture.loadfromfile('Punkt2.bmp');
  doublebuffered := true;
  rechts := 0 ;
  runter := -1;
end;


procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
   //links
  if key = vk_left then
  begin
    rechts := rechts -1;
    runter := 0;
    if rechts < -1 then
      rechts := -1;
    if rechts =0 then
      rechts := -1;
    
  end;



  //rechts
  if key = vk_right then
  begin
    rechts :=rechts +1;
    runter := 0;
    if rechts > 1 then
      rechts := 1;
    if rechts = 0 then
     rechts := +1;
  end;


  //oben
  if key = vk_up then
  begin
    runter := runter -1;
    rechts := 0;
    if runter < -1 then
      runter := -1;
    if runter = 0 then
      runter := -1;
  end;

  //unten
  if key = vk_down then
  begin
    runter := runter +1;
    rechts := 0;
    if runter >1 then
      runter := 1;
    if runter = 0 then
      runter := +1;
  end;

  //stop
  if key = vk_numpad0 then
   begin
     runter := 0;
     rechts := 0;
   end;

end;


procedure TForm1.Timer1Timer(Sender: TObject);
begin
  with Image1 do begin
    Top := Top + (runter);
    Left := Left +(rechts);
    if
    ((Image1.Left+Image1.width > Form1.clientwidth) or     // X-Achse
    (Image1.Left < Form1.Left)) or
    ((Image1.top+Image1.height > Form1.clientHeight) or     // Y-Achse
    (Image1.Top < Form1.Top))
    then  begin
     rechts := 0;
     runter := 0;
    end;
  end;
end;

end.
oneP Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 71

Win XP Professional
Turbo Delphi 2006
BeitragVerfasst: Mi 13.05.09 15:31 
Zitat:
So sieht mein Code aus. Ist vllt sehr anfängerhaft aber alles funzt soweit. Nur dass die Kugel nicht mehr nach oben oder unten steuerbar ist wenn sie zB an der linken Wand "heftet"

könnte vielleicht jemand oben gucken und mir auf die Frage antworten? Please :wink:
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 14.05.09 22:51 
user profile iconthepaine91 hat folgendes geschrieben Zum zitierten Posting springen:
1. würde ich
ausblenden Delphi-Quelltext
1:
if runter <= 0 then runter := -1//machen					

2. Nenne mal runter und rechts in : Horizontal/Vertikal o. Wagerecht/Senkrecht um so verwirren sie nur.

3. Dein Fehler finde ich gerade durch pures lesen nicht der Quelltext verwirrt mich auch ordentlich würde die Lösung nochmal überdenken finde sie nicht so toll. Aber vielleicht kann dir jemand anders helfen.

(falls ich später zeit hab guck ich ihn mir mal in delphi an)

_________________
There are 10 types of people - those who understand binary and those who don´t.
thepaine91
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: Fr 15.05.09 00:23 
Danke für dein wundervolles Zitat Narses.

onep hab dein Quelltext so übernommen da Funktioniert eigentlich nichts. Konnte deinen Fehler nicht reproduzieren da meine Kugel garnicht haftete.

Auch kann man keine nordwestliche bewegung usw. machen das ist aber dem quelltext nach zu urteilen absicht.

Trotzdem lege ich dir nah mal meine Thread version anzuschauen dort bewegt sich das ganze viel schneller. Bleibt dir überlassen deinen Fehler kann ich somit nicht finden.

EDIT:
Ein fehler bei deiner Kollisionsabfrage:
ausblenden Delphi-Quelltext
1:
2:
    if Panel1.Left >= Form1.ClientWidth - Panel1.width then //do somthing
    if Panel1.Top >= Form1.ClientHeight - Panel1.Height then //do somthing

Zur erklärung Form1.Width schliest auch den Rand ein der aber schon auserhalb des Clientsbereichs liegt so addieren sich dort zur width links und rechts einige mm dazu.
Bei der Form1.height das selbe.
bei Panel1.width deshalb damit dort die Ränder einberechnet werden in dem Fall wichtig!
Wenn du das befolgst sollte deine Kollisionsabfrage einwandfrei Funktionieren.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Fr 15.05.09 17:13 
Moin!

user profile icononeP hat folgendes geschrieben Zum zitierten Posting springen:
könnte vielleicht jemand oben gucken und mir auf die Frage antworten? Please :wink:
user profile icononeP hat folgendes geschrieben Zum zitierten Posting springen:
So sieht mein Code aus. [...] Nur dass die Kugel nicht mehr nach oben oder unten steuerbar ist wenn sie zB an der linken Wand "heftet"
Ich habe deinen Quelltext auch mal in ein Projekt eingefügt und getestet. Sieht man davon ab, dass die Kollisionsabfrage an den Formular-Rändern nicht korrekt funktioniert (dazu hast du ja schon Tipps bekommen), kann ich deine Fehlerbeschreibung nicht nachvollziehen. :nixweiss:


user profile iconthepaine91 hat folgendes geschrieben Zum zitierten Posting springen:
Trotzdem lege ich dir nah mal meine Thread version anzuschauen dort bewegt sich das ganze viel schneller. Bleibt dir überlassen deinen Fehler kann ich somit nicht finden.
Ich halte den Thread-Ansatz immer noch für daneben, sorry. :nixweiss: Wenn das Objekt sich schneller bewegen soll, dann muss man halt mehr als 1 Pixel schieben, fertig. Hier sind einfach die Grenzen der VCL. Wenn man das "vernünftig" machen will, geht eh kein Weg an DirectX oder OpenGL vorbei... :| Noch dazu scheint es mir, als würde der threadbasierte Ansatz den Fragesteller überfordern. :?

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
thepaine91
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: Fr 15.05.09 17:26 
Dann solltest du auch begründen warum meine letztige Version daneben ist.
Die kollisionsfrage kann man meine Threadobjekt entnehmen dort funktioniert sie einwandfrei.
mehr als ein Pixel zu bewegen sieht zu dem Unschön und ruckelig aus.
Aber Panels oder ähnliche Vcl objekte über ein Formular zu bewegen ist grundsätzlich kein schöner Ansatz, denn dafür gibt es ander möglichkeiten.

Aber der OpenGL verweis ist durchaus berechtigt und da ich überlegt habe aus dem Testprogramm ein kleines Spiel zu programmieren durchaus hilfreich.

Nochmal zum Thread hier. Nimm meine Kollisionsabfrage und schon solltest du keine Probleme mehr haben. Sofern das Formular sizeable ist lege ich dir noch folgendes nah:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.FormResize(Sender: TObject);
begin
  if Image1.Left >= Form1.ClientWidth - Image1.width then image1.Left := Form1.ClientWidth - Image1.width;
  if Image1.Top >= Form1.ClientHeight - Image1.Height then image1.Top := Form1.ClientHeight - Image1.Height;
  if form1.ClientWidth < image1.Width then
  begin
    form1.ClientWidth := image1.Width;
    image1.Left := 0;
  end;
  if form1.ClientHeight < image1.Height then
  begin
    form1.ClientHeight := image1.Height;
    image1.Top := 0;
  end;
end;
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Fr 15.05.09 18:39 
Moin!

Worum geht´s hier eigentlich? :gruebel: Dem Threadersteller unbedingt deinen Code aufzuquatschen oder ihm dabei helfen, einen Ansatz zu entwickeln, den er auch versteht und der ihn weiter bringt? :idea: Du hast doch jetzt schon 26x darauf hingewiesen, dass dein Code toll ist, reicht langsam. :zwinker: da ist der Nickname echt Programm *g*

user profile iconthepaine91 hat folgendes geschrieben Zum zitierten Posting springen:
Dann solltest du auch begründen warum meine letztige Version daneben ist.
Das brauche ich gar nicht, der Threadersteller zeigt durch Ignorieren seit einigen Posts bereits, dass der Ansatz nicht nach seinem Geschmack ist. :) Und wenn dir das noch nicht genug ist, nimmst du dir gleich selbst den Wind aus den Segeln:
user profile iconthepaine91 hat folgendes geschrieben Zum zitierten Posting springen:
Aber Panels oder ähnliche Vcl objekte über ein Formular zu bewegen ist grundsätzlich kein schöner Ansatz,
Genau so ist das, es ist einfach VCL, da macht der Thread-Timer-CPU-Last-Generator auch keinen Rennwagen draus. :lol:

Mal sehen, wenn noch Zeit ist, schreib ich dir vielleicht noch was zu deinem Code im anderen Thread. ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
thepaine91
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: Fr 15.05.09 23:26 
Er ist ohne frage schneller aber hat sicher Nachteile du hast recht hab vil sehr penetrant auf meine Projekt hingewiesen.
Aber habe auch nur auf codeausschnitte für die Kollisionsabfrage hingewiesen beim letzten mal denn diese Funktioniert wie bereits erwähnt einwandfrei und diese könnte er sich als Vorlage nehmen. Denn darum gings ja die Kollisionsabfrage funktionierte nicht richtig. Da ich wie schon erwähnt den FEhler nicht reproduzieren konnte kann ich nur darauf verweisen. Als ansatz sollte das genügen und mit ein wenig bemühung kann er das in seinen "TIMER" einbauen :-)

[Schleimen]
Wenn du Zeit für eine Antwort findest wäre super :-) Denn ich kleiner unwissender Delphinoob(Anfänger) bin ohne dich hoffnungslos verloren bzw. ohne diese Community :-)
[/Schleimen]