Hallo,
ich mache es kurz:
Zurzeit programmaiere ich mit einem Freund an einen kleinerem 2D-Spiel, um vor allem die Grundlagen des Programmierens zu erlernen. Jetzt haben wir den Wunsch, praktische eine "Karte" von, sagen wir mal 3000x3000 pixel zu machen ( hypothetischer Wert). Jetzt wollen wir aber, das immer wenn sich unser Spieler Bewegt, sich die Kamera anpasst, und so der Spieler immer in der Mitte ist. Ich blicke da nicht durch, Normalerweiße sollte doch sowas irgendwie mit ClipRect oder sowas gehen??
-> Ja delphi ist kacke, hat aber was mit der Schule zu tun. Bin über jede, vor allem schnelle Hilfe, sehr dankbar
Ja delphi ist kacke, hat aber was mit der Schule zu tun. Bin über jede, vor allem schnelle Hilfe, sehr dankbar
Den Satz will ich mal überlesen haben
Ist die karte statisch in einem Bitmap gespeichert? Ich würde so verfahren, dass ich pro "Frame" / OnPaint Ereignis erstmal den Hintergrund komplett schwarz fülle und dann je nach Position des Spieler mit Canvas.Draw() die Karte auf an die entsprechenden Koordinaten zeichnen lasse.
Ich will jetzt nicht, naja faul klingen, aber kannst du mir das bitte als Code schreiben? Ich habs schon so lange versucht... Zudem wäre es besser wann man,naja das Form verschiebt, da auch noch Objekte mit eigenen Koordinaten existieren.
Du speicherst deine Objekte sicherlich in nem Array? dann prüf doch einfach dein Array gegen das aktuell sichtbare Feld.
Code:
type
TVector2D = record
begin
x,y
: Integer;
end;
TGameObject = record
begin
// some stuff
position
: TVector2D;
end;
// some methods n ****
var
// lots of things here
myObjects
: array of TGameObject;
i, // Counter
displayWidth, // width of visible area
displayHeight // height of visible area
: integer;
upperLeftField // contains coords of upper left corner field of visible area
: TVector2D;
begin
// do whatever
for i := low(myObjects) to high(myObjects) do
begin
if ((myObjects[i].position.x > upperLeftField.x) and
(myObjects[i].position.x <= upperLeftField.x + displayWidth) and
(myObjects[i].position.y > upperLeftField.y) and
(myObjects[i].position.y <= upperLeftField.y + displayWidth)) then
begin
// Arguments 2 and 3 do not need to be given,
// since this can be calculated inside the method
// but I wrote them down for clarification
drawObject(myObjects[i], // Object to draw
myObjects[i].position.x - upperLeftField.x, // X coord on display rect
myObjects[i].position.y - upperLeftField.y); // Y coord on display rect
end;
end;
// do something exciting here
end.
*Das sollte alles natürlich in deine Klasse gekapselt sein, und nicht wie bei mir einfach so dastehen...
**Ungetestet ;P
***Dieser Ansatz ist anfängerfreundlich und LANGSAM. Falls du mal weiter bist empfielt sich hier, einen binary tree o.ä. zu benutzen.
Wie M3BF05B bereits geschrieben hat, reicht es die Karte zu verschieben und den Charakter in der Mitte zu lassen.
Die Frage ist, ob du deine ganze Karte angezeigt hast oder nicht.
Sonst programmierst du einfach, dass wenn du die z.B. Pfeiltasten drückst sich die Karte um z.B. 10px in die jeweilige Richtung verschiebt.
Wie M3BF05B bereits geschrieben hat, reicht es die Karte zu verschieben und den Charakter in der Mitte zu lassen.
Die Frage ist, ob du deine ganze Karte angezeigt hast oder nicht.
Sonst programmierst du einfach, dass wenn du die z.B. Pfeiltasten drückst sich die Karte um z.B. 10px in die jeweilige Richtung verschiebt.
Ist exakt die Funktionalität, die ich in meinem Beispielsource implementiert habe.
@Threadersteller:
Zeig mal ein bisschen mehr Eigeninitiative :P Die Berechnung von mir, kannst du mit einer simplen Addition ohne weiteres auch auf Objekte der Karte übertragen.
Code:
P := GetTransformedPosition;
{ ... }
for I := Low(FMapObjects) to High(FMapObjects) do
begin
Canvas.Draw(P.X + FMapObjects[I].Pos.X, P.Y + FMapObjects[I].Pos.Y, FMapObjects[I].Image);
end;
P := GetTransformedPosition;
{ ... }
for I := Low(FMapObjects) to High(FMapObjects) do
begin
Canvas.Draw(P.X + FMapObjects[I].Pos.X, P.Y + FMapObjects[I].Pos.Y, FMapObjects[I].Image);
end;
Du musst an dieser Stelle aufpassen. Du zeichnest hier nämlich alle Objekte, was wesentlich langsamer ist, als zu filter (siehe meinen Code), welche Objekte überhaupt sichtbar sind.
Theoretisch müsste man bei der Karte das selbe tun.
Ich würde dort 2 Bitmaps nehmen, das eine enthält die Karte, das andere ist das sichtbare Objekt auf der Form. Und dann immer nur den sichtbaren Bereich vom Kartenbitmap auf das Formbitmap kopieren. Deine Berechnung muss dabei selbstverständlich voraus gehen, um den sichtbaren Bereich zu ermitteln.
Du musst an dieser Stelle aufpassen. Du zeichnest hier nämlich alle Objekte, was wesentlich langsamer ist, als zu filter (siehe meinen Code), welche Objekte überhaupt sichtbar sind.
Das stimmt. In meinem Code sind weder Visible- noch Range Checks implementiert. Hier wollte ich nur demonstrieren, wie der TE die Map Koordinaten der Objekte in die Relative Position im Fenster umrechnen kann.
Je nach Position der Map kann es auch noch zu Divisionen durch 0 kommen, was man vorher noch abfangen sollte.
Das stimmt. In meinem Code sind weder Visible- noch Range Checks implementiert. Hier wollte ich nur demonstrieren, wie der TE die Map Koordinaten der Objekte in die Relative Position im Fenster umrechnen kann.
Je nach Position der Map kann es auch noch zu Divisionen durch 0 kommen, was man vorher noch abfangen sollte.
Kann ich dich auf skype adden?
Wenn ja schick mir bitte ne pn
Delphi OnMouseMove hilfe 09/10/2013 - General Coding - 9 Replies Hallo,
ich möchte eine Anwendung erstellen, in dem sich ein Label bewegt, sobald man die Maus auf der Anwendung bewegt.
Das Label soll dann auf eine zufällige Position in der Anwendung springen.
Ich weiß, dass es mit OnMouseMove und random(...) funktioniert, aber die genaue zusammensetzung weiß ich nicht :(
Würde mich über Hilfe freuen :)
DELPHI - Who make Exploits, Hacks and Tools with DELPHI? 05/15/2013 - CO2 Programming - 13 Replies Hi all.
Iwith DELPHI, but a dont now.
hello, I use Delphi to program and i like someone put here source code of make Exploits, Hacks and Tools bot here, or part of the code.
ty to all
[DELPHI&METIN]Wie sind die Delphi Befehle für einen Bot? 03/07/2010 - General Coding - 3 Replies Hallo liebe com,
ich habe mal eine Frage: Ich möchte einen Metin Bot in Delphi schreiben aber ich weiß nicht die Befehle für
eine bestimmte Taste senden etc.
könnt ihr mir die pls sagen oder per pn geben
MfGGGGGG
Delphi hilfe 06/12/2009 - Metin2 Hacks, Bots, Cheats, Exploits & Macros - 5 Replies Hallo leute,
ich habe mich gefragt wie man sich z.b. sachen wie mh oder ähnliches selber machen kann...da habe ich mich ma in google und elitepvpers umgeschaut...ich habe nur gefunden das es mit delphi geht...worauf ich mir mal turbodelphi geholt hab
kann mir PLS jemand erklären wie das geht?:D
oder kann mir vill jemand ein beispiel code geben für irgentwas?
schoma ein dickes THX wenn mir jemand helfen kann:D
mfg