Autor |
Beitrag |
oneP 
      
Beiträge: 71
Win XP Professional
Turbo Delphi 2006
|
Verfasst: Di 12.05.09 18:37
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Di 12.05.09 19:29
Hallo oneP,
hier wieder mal ein Pseudo-Code:
Delphi-Quelltext 1: 2: 3: 4: 5:
| AusserFormular := ((Button.Right > Form.Right) or (Button.Left < Form.Left)) or ((Button.Bottom > Form.BottomTop) or (Button.Top < Form.Top)); |
Edit: Hervorgehobenen Fehler behoben 
Zuletzt bearbeitet von Yogu am Di 12.05.09 21:02, insgesamt 1-mal bearbeitet
|
|
oneP 
      
Beiträge: 71
Win XP Professional
Turbo Delphi 2006
|
Verfasst: 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:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| if ((Image1.Left+width > Form1.clientwidth) or (Image1.Left < Form1.Left)) and ((Image1.top+height > Form1.clientHeight) or (Image1.Top < Form1.Top)) then begin rechts := 0; runter := 0; end; |
rechts und runter sind variablen des timers.
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Di 12.05.09 20:15
oneP hat folgendes geschrieben : | Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| if ((Image1.Left+width > Form1.clientwidth) or (Image1.Left < Form1.Left)) and ((Image1.top+height > Form1.clientHeight) or (Image1.Top < Form1.Top)) then begin rechts := 0; runter := 0; end; | |
Tja - Faulheit wird bestraft
Natürlich musst du das Image1. vor Width bzw. Height wiederholen - sonst greifst du ja auf die Eigenschaften des Formulars zu 
|
|
oneP 
      
Beiträge: 71
Win XP Professional
Turbo Delphi 2006
|
Verfasst: Di 12.05.09 20:43
Ja ich habs jetzt geändert. Trotzdem rennt der Punkt durch die wand.
|
|
Jakob_Ullmann
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: Di 12.05.09 20:44
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Di 12.05.09 20:58
oneP hat folgendes geschrieben : | 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
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: Di 12.05.09 21:02
Ungetestet, aber imho müsste es reichen, aus dem AND ein OR zu machen.
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Di 12.05.09 21:06
Spielverderber 
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
Jakob_Ullmann
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: Di 12.05.09 21:07
Sorry, jetzt sehe ich es auch. 
|
|
oneP 
      
Beiträge: 71
Win XP Professional
Turbo Delphi 2006
|
Verfasst: Di 12.05.09 21:25
Das AND hab ich schon lang geändert. Bin selbst drauf gekommen  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
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Di 12.05.09 21:34
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
oneP 
      
Beiträge: 71
Win XP Professional
Turbo Delphi 2006
|
Verfasst: Mi 13.05.09 13:33
Danke thepaine91!
Moderiert von Narses: 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?
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"
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 public 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 if key = vk_left then begin rechts := rechts -1; runter := 0; if rechts < -1 then rechts := -1; if rechts =0 then rechts := -1; end;
if key = vk_right then begin rechts :=rechts +1; runter := 0; if rechts > 1 then rechts := 1; if rechts = 0 then rechts := +1; end;
if key = vk_up then begin runter := runter -1; rechts := 0; if runter < -1 then runter := -1; if runter = 0 then runter := -1; end;
if key = vk_down then begin runter := runter +1; rechts := 0; if runter >1 then runter := 1; if runter = 0 then runter := +1; end;
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 (Image1.Left < Form1.Left)) or ((Image1.top+Image1.height > Form1.clientHeight) or (Image1.Top < Form1.Top)) then begin rechts := 0; runter := 0; end; end; end;
end. |
|
|
oneP 
      
Beiträge: 71
Win XP Professional
Turbo Delphi 2006
|
Verfasst: 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 
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 14.05.09 22:51
|
|
thepaine91
      
Beiträge: 763
Erhaltene Danke: 27
Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
|
Verfasst: 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:
Delphi-Quelltext 1: 2:
| if Panel1.Left >= Form1.ClientWidth - Panel1.width then if Panel1.Top >= Form1.ClientHeight - Panel1.Height then |
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
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Fr 15.05.09 17:13
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
thepaine91
      
Beiträge: 763
Erhaltene Danke: 27
Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
|
Verfasst: 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:
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
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Fr 15.05.09 18:39
Moin!
Worum geht´s hier eigentlich?  Dem Threadersteller unbedingt deinen Code aufzuquatschen oder ihm dabei helfen, einen Ansatz zu entwickeln, den er auch versteht und der ihn weiter bringt?  Du hast doch jetzt schon 26x darauf hingewiesen, dass dein Code toll ist, reicht langsam. da ist der Nickname echt Programm *g*
thepaine91 hat folgendes geschrieben : | 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: thepaine91 hat folgendes geschrieben : | 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.
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
      
Beiträge: 763
Erhaltene Danke: 27
Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
|
Verfasst: 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]
|
|