![]() |
break it problem
ich habe diesen quelltext gefunden, der ist für pong... ich mache ein breakit aber ich habe das problem, dass ich den ball nicht im image halten kann. er fliegt einfach immer weiter... .
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var x,y:integer; begin x := 5; y := 5; Shape1.Left := Shape1.Left +x ; Shape1.Top := Shape1.Top + y; if (Shape1.Top <= 100) or (Shape1.Top >= image1.ClientHeight) then begin y := -y; end; if (Shape1.Left <= 0) or (Shape1.Left >= image1.ClientWidth) then begin x := -x; end; end; end. müsste das nicht eigentlich durch image1.client... ausgeschlossen werden?? mfg [edit=Matze][delphi]-Tags eingefügt. Zukünftig bitte selbst daran denken. MfG, Matze[/edit] |
Re: break it problem
Da x und y lokale Variabeln sind, interessiert es etwaige (durch die lokalen überdeckte) globale Variablen des selben Namens nicht die Bohne, was du dort zuweist
@Matze, warum hast du meinen Edit wegeditiert? |
Re: break it problem
und was sagt mir das jetzt... sorry aber ich versteh schon was das heißt aber wie wirkt sich das auf mein problem aus?
(sorry wegen dem falsch geposteten quelltext) |
Re: break it problem
Das heisst du sollst die lokalen Variablen weglassen!
|
Re: break it problem
wenn ich aber x und y weglasse was ändert das an der sache ich muss ja den wechsel in die negative haben wenns reflektiert wird oder? wenn i einfach nur mit den zahlen anstatt variablen arbeite... i hab gerade n denkfehler
|
Re: break it problem
Erstmal die Reihenfolge ändern
und die Grenzen richtig setzen.
Delphi-Quellcode:
So, jetzt würden zumindestens die Shapes erstmal am Rand hängenbleiben, da rechtzeitig ausgewertet wird.
procedure TForm1.Timer1Timer(Sender: TObject);
var x,y:integer; begin x := 5; y := 5; if (Shape1.Top <= 100) or (Shape1.Top >= image1.ClientHeight - Shape1.Height) then begin y := -y; end; if (Shape1.Left <= 0) or (Shape1.Left >= image1.ClientWidth - Shape1.Width) then begin x := -x; end; Shape1.Left := Shape1.Left + x; Shape1.Top := Shape1.Top + y; end; - Variable setzen - diese Variable verrechnen - jetzt erst die Begrenzung beachten und Wert änder bringt nichts mehr, da es schon verrechnet wurde :zwinker: Ja und nun noch der nächste Schritt: die variablem in den Private-Abschnitt der Form verschieben
Delphi-Quellcode:
und die Starteinstellung z.B. ins OnCreate (nur einmal bei, bzw. vor dem Start setzen)
var x,y:integer;
Delphi-Quellcode:
x := 5;
y := 5; |
Re: break it problem
habs jetzt angepasst aber iwie bleibt das mittem auf meinem image hängen und pendelt... ich verstehs nicht...
wenn ich die x,y durch minus 5 ersetze startet er ja in entgegengesetzte richtung, aber das problem ist das er das image immernoch verlässt...
Delphi-Quellcode:
[edit=mkinzler]Code-Tag durch Delphi-Tag ersetzt. Scheint manche hier zu überfordern, die entsprechende Sprache auszuwähen! Mfg, mkinzler[/edit]
procedure TForm1.Timer1Timer(Sender: TObject);
var x,y:integer; begin x := 5; y := 5; if (Shape1.Top <= 0) or (Shape1.Top >= image1.ClientHeight - Shape1.Height) then begin y := -y; end; if (Shape1.Left <= 0) or (Shape1.Left >= image1.ClientWidth - Shape1.Width) then begin x := -x; end; Shape1.Left := Shape1.Left + x; Shape1.Top := Shape1.Top + y; end; |
Re: break it problem
was hab ich zu dem
Delphi-Quellcode:
geschrieben?
x := 5;
y := 5; |
Re: break it problem
hab ich jetzt gemacht, aber nun bewegt sich der ball gar nicht mehr :(... die var x,y:integer; habsch oben beim form unter implementation und die x:=5, ... unter onbuttonclick bei meinem startknopf
|
Re: break it problem
Und wo veränderst du diese Werte?
|
Re: break it problem
inwiefern? na im timer oder net? solange der timer läuft wird alle 0,1 sek das shape 5 pixel verschoben oder hab ich das system nicht verstanden? (offensichtlich... :oops:)
|
Re: break it problem
Dann verwende besser Konstanten
Delphi-Quellcode:
const dx=5, dy=5;
|
Re: break it problem
daran liegt das glaube ich leider nicht... ich zeig dir mal den kompletten code, vllt kannst du mir dann weiterhelfen, wenn du magst.
Code:
implementation const dx=5; dy=5; {$R *.dfm} var x,y:integer; procedure TForm1.PauseknopfClick(Sender: TObject); begin {Spiel pausieren und button pause unsichtbar --> Start sichtbar} pauseknopf.visible:=false; timer1.enabled:=false; end; procedure TForm1.StartknopfClick(Sender: TObject); begin {macht den pauseknopf sichtbar, setzt spiel fort} timer1.Enabled:=true; pauseknopf.Visible:=True; end; procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if reflektor.left > 110 then begin case ord(key) of vk_left:reflektor.left:=reflektor.left-14; end; end; if (reflektor.left < 426) then begin case ord(key) of vk_right:reflektor.left:=reflektor.left+14; end; end; end; procedure TForm1.Timer1Timer(Sender: TObject); var dx,dy:integer; begin if (Shape1.Top <= 0) or (Shape1.Top >= image1.ClientHeight - Shape1.Height) then begin dy := -dy; end; if (Shape1.Left <= 0) or (Shape1.Left >= image1.ClientWidth - Shape1.Width) then begin dx := -dx; end; Shape1.Left := Shape1.Left + dx; Shape1.Top := Shape1.Top + dy; end; procedure TForm1.FormCreate(Sender: TObject); begin timer1.Enabled:=false; end; procedure TForm1.NeuesSpiel1Click(Sender: TObject); begin timer1.enabled:=true; end; end. |
Re: break it problem
HI,
um die schönen Formatierungen wie in den obrigen Posts hinzubekommen, verwende NICHT Code sondern Delphi-Tags. Die gibts übrigens in der Menüleiste unter "Oft genutzt". so, zu deinem Problem:
Delphi-Quellcode:
Bernhard
procedure TForm1.Timer1Timer(Sender: TObject);
var x,y:integer; begin // x = dx; // y = dy; if (Shape1.Top <= 0) or (Shape1.Top >= image1.ClientHeight - Shape1.Height) then begin dy := -dy; end; if (Shape1.Left <= 0) or (Shape1.Left >= image1.ClientWidth - Shape1.Width) then begin dx := -dx; end; Shape1.Left := Shape1.Left + dx; Shape1.Top := Shape1.Top + dy; end; |
Re: break it problem
sorry aber nur das mit den variablen habe ich verstanden... was meinst du mit dem rest? wieso muss ich ungleich null erreichen? und debuggen... habsch noch nie gemacht?
edit| tut mir leid das ich euch so auf die nerven gehe aber ich finde den fehler einfach nicht... ich versteh das so...
Delphi-Quellcode:
rocedure TForm1.Timer1Timer(Sender: TObject);
var dx,dy:integer; begin if (Shape1.Top <= 0) or (Shape1.Top >= image1.ClientHeight - Shape1.Height) then //wenn oberseite // vom kreis=0 oder der kreis die höhe des images überschreitet , dann reflektiere begin dy := -dy; //richtungsänderung end; if (Shape1.Left <= 0) or (Shape1.Left >= image1.ClientWidth - Shape1.Width) then begin dx := -dx; // richtungsänderung end; Shape1.Left := Shape1.Left + dx; // das verrücken ohne kollision vom kreis Shape1.Top := Shape1.Top + dy; end; |
Re: break it problem
![]() |
Re: break it problem
nochmal: für deine Richtungsänderung kannst du keine Konstanten nehmen, da wie der Name schon sagt, Konstanten konstant sind und du denen somit keinen ANDEREN Wert als den einmal zugewiesenen geben kannst. Also brauchst du ne Variable (da die variabel ist), der du dann den Wert der Konstanten zuweist und dann die Richtungsänderung ausführst.
Bernhard |
Re: break it problem
Delphi-Quellcode:
ich verstehe einfach nicht was ich tun soll könntest du nicht evtl sagen was ich durch was ersetzen muss... ichv erstehe deine gedanken mit den konstanten klar die können sich dann nciht verändern
begin
// x:=DX; // y:=dy; if (Shape1.Top <= 0) or (Shape1.Top >= image1.ClientHeight - Shape1.Height) then begin dy := -dy; end; if (Shape1.Left <= 0) or (Shape1.Left >= image1.ClientWidth - Shape1.Width) then begin dx := -dx; end; Shape1.Left := Shape1.Left + dx; Shape1.Top := Shape1.Top + dy; end; aber ich denke ich soll mit konstanten arbeiten |
Re: break it problem
Die Konstanten waren für den Wert 5 gedacht.
Delphi-Quellcode:
x:=DX;
y:=dy; if (Shape1.Top <= 0) or (Shape1.Top >= image1.ClientHeight - Shape1.Height) then begin y := -dy; end; if (Shape1.Left <= 0) or (Shape1.Left >= image1.ClientWidth - Shape1.Width) then begin x := -dx; end; Shape1.Left := Shape1.Left + x; Shape1.Top := Shape1.Top + y; |
Re: break it problem
danke für die antwort :)
leider funktinoiert es weiterhin nicht der punkt wird kreiert und flimmert auf einer stelle ohne jegliche bewegung... was zu hölle mach ich denn falsch? |edit soll ich evtl den ganzen quelltext nochmal posten? |
Re: break it problem
Zitat:
Dann setze in den Zeilen einen Breakpoint
Delphi-Quellcode:
und schau was Dx, und Dy ausgeben wenn du in diese zeile springst.
if (Shape1.Top <= 0) or (Shape1.Top >= image1.ClientHeight - Shape1.Height) then
if (Shape1.Left <= 0) or (Shape1.Left >= image1.ClientWidth - Shape1.Width) then Nebenbei Wenn man nur eine zeile hinter einer IF abfrage schreibt ist ein Begin .. End nicht nötig.
Delphi-Quellcode:
gruss
if (Shape1.Top <= 0) or (Shape1.Top >= image1.ClientHeight - Shape1.Height) then
y := -dy; |
Re: break it problem
Zitat:
|
Re: break it problem
Zitat:
gruss |
Re: break it problem
Liste der Anhänge anzeigen (Anzahl: 1)
das mit dem begin end hinter den if sachen ist angewohnheit, weil ja öfters nicht nur ein befehl danach steht...so aber wie gehe ich mit einem breakpoint um das kenn ich gar nicht? delphi hilfe bringt mir da leider auch nichts... anbei das beispiel in der exe
|
Re: break it problem
Zitat:
jo jeder wie er will ;) Jetzt mal im ernst was sollen die Leute hier mit einer EXE ? Damit kann dir niemand helfen. gruss |
Re: break it problem
Zitat:
Man sollte aber alles tun, um den Code lesbar zu gestalten! |
Re: break it problem
ja okay das mit der .exe war nur damit ihr sehr was ich meine mit dem hängenbleiben... hier der code
Delphi-Quellcode:
var Form1: TForm1; implementation const dx=5; dy=5; {$R *.dfm} var x,y:integer; procedure TForm1.PauseknopfClick(Sender: TObject); begin {Spiel pausieren und button pause unsichtbar --> Start sichtbar} pauseknopf.visible:=false; timer1.enabled:=false; end; procedure TForm1.StartknopfClick(Sender: TObject); begin {macht den pauseknopf sichtbar, setzt spiel fort} timer1.Enabled:=true; pauseknopf.Visible:=True; end; procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if reflektor.left > 110 then begin case ord(key) of vk_left:reflektor.left:=reflektor.left-14; end; end; if (reflektor.left < 426) then begin case ord(key) of vk_right:reflektor.left:=reflektor.left+14; end; end; end; procedure TForm1.Timer1Timer(Sender: TObject); var x,y:integer; begin x:=DX; y:=dy; if (Shape1.Top <= 0) or (Shape1.Top >= image1.ClientHeight - Shape1.Height) then begin y := -dy; end; if (Shape1.Left <= 0) or (Shape1.Left >= image1.ClientWidth - Shape1.Width) then begin x := -dx; end; Shape1.Left := Shape1.Left + x; Shape1.Top := Shape1.Top + y; end; procedure TForm1.FormCreate(Sender: TObject); begin timer1.Enabled:=false; end; procedure TForm1.NeuesSpiel1Click(Sender: TObject); begin timer1.enabled:=true; end; end. |
Re: break it problem
grmmm ..
Immer noch feste werte ! const dx=5; Wie soll sich der Ball dann bewegen. EDIT: Blick da nicht mehr durch. Man hat dir schon soviele vorschläge unterbreitet und du hast nichts davon angenommen. Ich beziehe mich hier drauf.
Delphi-Quellcode:
Scheint aber wieder verworfen zu sein.
if (Shape1.Top <= 0) or (Shape1.Top >= image1.ClientHeight - Shape1.Height) then
begin dy := -dy; end; if (Shape1.Left <= 0) or (Shape1.Left >= image1.ClientWidth - Shape1.Width) then begin dx := -dx; end; gruss |
Re: break it problem
aber ich muss der konstnten doch einen wert zuweisen? wenn ich ihr x und y zuweise ist das nicht effektiv oder?
|
Re: break it problem
Zitat:
|
Re: break it problem
dx und dy veränderst du doch, also müssen das Variablen sein. Global hast du sie aber als Konstanten desklariert und lokal dann nochmal als Variablen.
Nimm doch mal die lokalen weg und packe dx und dy noch unter das 'var' ganz oben. Die Werte (5) kannst du dann immer noch im OnCreate zuweisen... [so viele Nachrichten in so kurzer Zeit... hoffe, es hilft trotzdem ;) ] //Edit: Ok, ich glaube, ich war gerade ganz woanders. |
Re: break it problem
verdammt also langsam komm ich gar nich mehr klar... was muss ich jetzt durch was ersetzen? ich muss den konstanten ja nen wert zuweisen das habe ich ja mit 5 oben getan ich versteh gerade nicht was da falsch ist , was muss ich machen??
wieso warst du woanders...das erscheint mir gerade komisch da ja dx die konstanten sein sollen...? wenn ich denen oben nciht 5 zuweisen soll, was denn dann? |edit @eweiss danke für deine hilfe, das mit dem nciht annehmen ist nicht meine absicht, ich verliere nur langsam den überblick weil das worauf du dich beziehst sollte ich ein paar posts vorher noch auf das ändern was du nun kritisierst... kann mit nicht vllt jemand einfach konkret zeigen wo mein fehler ist? das wäre echt sehr nett, ich sitze hier seit paar stunden und ändere ständig so wie in den posts und komme nicht 1 cm weiter... :( |
Re: break it problem
In der Konstantendefinition schon
|
Re: break it problem
na wo denn dann sonst? oben global hab ich denen 5 zugewiesen, bitte sag mir doch einfach wo der fehler liegt i krieg hier gleich nen nervenkollaps ;)
|
Re: break it problem
Pack mal das komplette Projekt und hänge es hier an
|
Re: break it problem
Liste der Anhänge anzeigen (Anzahl: 1)
1000 danke an dich
|
Re: break it problem
Delphi-Quellcode:
Bernhard
implementation
{$R *.dfm} var x,y: integer; procedure TForm1.Timer1Timer(Sender: TObject); var x,y:integer; begin if (Shape1.Top <= 0) or (Shape1.Top >= image1.ClientHeight - Shape1.Height) then begin y := -y; end; if (Shape1.Left <= 0) or (Shape1.Left >= image1.ClientWidth - Shape1.Width) then begin x := -x; end; Shape1.Left := Shape1.Left + x; Shape1.Top := Shape1.Top + y; end; procedure TForm1.FormCreate(Sender: TObject); begin // fehlendes... (hab ich zu voreilig gelöscht) x := 5; y := 5; end; |
Re: break it problem
So sollte es funktionieren:
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus, sSkinManager, Buttons, sBitBtn, StdCtrls, sButton, jpeg, ExtCtrls, sPanel; const dx=5; dy=5; type TForm1 = class(TForm) sSkinManager1: TsSkinManager; MainMenu1: TMainMenu; Datei1: TMenuItem; Hilfe1: TMenuItem; NeuesSpiel1: TMenuItem; Beenden1: TMenuItem; Image1: TImage; Startknopf: TsButton; Pauseknopf: TsBitBtn; reflektor: TImage; Shape1: TShape; Timer1: TTimer; procedure PauseknopfClick(Sender: TObject); procedure StartknopfClick(Sender: TObject); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure Timer1Timer(Sender: TObject); procedure FormCreate(Sender: TObject); procedure NeuesSpiel1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} var x,y:integer; procedure TForm1.PauseknopfClick(Sender: TObject); begin {Spiel pausieren und button pause unsichtbar --> Start sichtbar} pauseknopf.visible:=false; timer1.enabled:=false; end; procedure TForm1.StartknopfClick(Sender: TObject); begin {macht den pauseknopf sichtbar, setzt spiel fort} timer1.Enabled:=true; pauseknopf.Visible:=True; x := dx; y := dy; end; procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if reflektor.left > 110 then begin case ord(key) of vk_left:reflektor.left:=reflektor.left-14; end; end; if (reflektor.left < 426) then begin case ord(key) of vk_right:reflektor.left:=reflektor.left+14; end; end; end; procedure TForm1.Timer1Timer(Sender: TObject); begin if (Shape1.Top <= image1.Top + Shape1.Height ) or (Shape1.Top >= image1.ClientHeight - Shape1.Height) then begin y := -y; end; if (Shape1.Left <= image1.Left + Shape1.Width ) or (Shape1.Left >= image1.ClientWidth - Shape1.Width) then begin x := -x; end; Shape1.Left := Shape1.Left + x; Shape1.Top := Shape1.Top + y; Shape1.Repaint; end; procedure TForm1.FormCreate(Sender: TObject); begin timer1.Enabled:=false; end; procedure TForm1.NeuesSpiel1Click(Sender: TObject); begin timer1.enabled:=true; end; end. |
Re: break it problem
ca. 38.000 mal danke aber nun geht er ja rechts nichtmehr an den imagerande, müsste er doch laut code eigentlich oder?
|
Re: break it problem
Er stösst ja am Rande des Shapes ( nur nicht Am Rand des sichtbaten Teils) + der Schrittweite ab
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:25 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz