Du bist nicht angemeldet.

Werbeanzeige

DerWaldfried

Frischling

  • »DerWaldfried« ist der Autor dieses Themas

Beiträge: 3

Wohnort: Bremen

Beruf: Streamer | Gabelstaplerfahrer | Freiberuflicher Programmierer

  • Private Nachricht senden

1

15.01.2018, 23:26

Strecken ziehen wie bei OpenTTD

Hallo meine Lieben,

also ich bin kein Meister der Programmierung, im Gegenteil, ich lerne noch sehr sehr viel und muss noch sehr sehr viel lernen. Aber jeder fängt klein an. Mein aktuelles Projekt ist sowas ähnliches wie das eigentlich bei allen bekannten OpenTTD.

Es beinhaltet aktuell:
  • 2D Umgebung
  • UI Design
  • Finanzsystem

Nun versuche ich gerade von einem der ekligsten Umsetungen weg zu kommen, die ich zum lernen erstmal benutzt habe. Und zwar das Drag&Drop&Klick Prinzip. Also Strasse anklicken, an die gewünschte Stelle klicken und von vorne. Ich möchte das ganze ähnlich wie bei OpenTTD haben.

Der Spieler wählt die Strecke aus dem UI aus und soll dann durch klicken und ziehen das ganze platzieren können. Wünschenswert wäre das ich das ganze dann noch so umgesetzt bekomme die unterschiedlichen Strassen automatisch zu ändern. Den aktuell habe ich 6 Strassenarten im UI.
  • Linkskurve
  • Rechtskure
  • Vertikal Strasse
  • Horizontal Strasse
  • Kreuzung
  • Querstrang Kreuzung

Ich würde es gerne automatisiert haben, das wenn 4 Strassen sich treffen, diese dann eine Kreuzungsgrafik automatisch an der sich kreuzenden Stelle bilden etc...

Ich hoffe ihr versteht was ich meine. Nun dachte ich vielleicht daher ich die Enginge Unity3D als Anfänger nutze, das mir einer erklären kann, wie da so etwa oder genau der Weg wäre um das umgesetzt zu bekommen. Ich finde im C# Bereich dazu leider kein gut dokumentiertes Tutorial oder OpenSource Projekt um es zu verstehen.

Liebevolle Grüße :D

Tobiking

1x Rätselkönig

  • Private Nachricht senden

2

16.01.2018, 02:00

Was hindert dich denn daran es zu implementieren?

Ich sehe bei dem was du machen willst zwei Aufgaben:

1. Bestimmen welche Felder Straße werden (aka Linie ziehen)
2. Für jedes Feld Straße prüfen ob auf Nachbarfeldern auch Straßen sind, und je nach Konstellation die Straßenart setzen

Zu 1)
Über den Winkel von der aktuellen Position zum Ziel kannst du herausfinden in welche Richtung du gehen musst. Das machst du schrittweise bis du am Ziel bist.

Zu 2)
Ist im Prinzip nur eine Reihe von Überprüfungen um die verschiedenen Konstellationen zu erkennen.

David Scherfgen

Administrator

Beiträge: 10 198

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

16.01.2018, 07:51

Aber jeder fängt klein an. Mein aktuelles Projekt ist sowas ähnliches wie das eigentlich bei allen bekannten OpenTTD.

Das ist ziemlich genau das Gegenteil von „klein anfangen“. Ich rate dir, mit wirklich einfachen Dingen zu starten.

Nox

Supermoderator

Beiträge: 5 274

Beruf: Student

  • Private Nachricht senden

4

16.01.2018, 15:54

Das schöne an OpenTTD ist, dass es quelloffen ist. Vielleicht hilft ja ein Blick in den Code um ein wenig Inspiration zu bekommen.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

DerWaldfried

Frischling

  • »DerWaldfried« ist der Autor dieses Themas

Beiträge: 3

Wohnort: Bremen

Beruf: Streamer | Gabelstaplerfahrer | Freiberuflicher Programmierer

  • Private Nachricht senden

5

16.01.2018, 18:37

Also Halli Hallo und erstmal danke für eure Antworten :thumbsup:

Was hindert dich denn daran es zu implementieren?

Ich sehe bei dem was du machen willst zwei Aufgaben:

1. Bestimmen welche Felder Straße werden (aka Linie ziehen)
2. Für jedes Feld Straße prüfen ob auf Nachbarfeldern auch Straßen sind, und je nach Konstellation die Straßenart setzen

Zu 1)
Über den Winkel von der aktuellen Position zum Ziel kannst du herausfinden in welche Richtung du gehen musst. Das machst du schrittweise bis du am Ziel bist.

Zu 2)
Ist im Prinzip nur eine Reihe von Überprüfungen um die verschiedenen Konstellationen zu erkennen.


Genau so sehe ich das auch. Nur die Umsetzung stock bei mir ein wenig. Setze ich zum Beispiel zu Punkt 1 die Linien Ziehung in einr Draw Methode um ? Den das klappt nicht so wirklich...

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static implicit operator Point(POINT point)
    {
        return new Point(point.X, point.Y);
    }

[DllImport("user32.dll")]
public static extern bool GetCursorPos(out POINT lpPoint);

public void DrawLine(PaintEventArgs e)
    {
        Pen blackPen = new Pen(Color.Black, 3);

        POINT lpPoint;
        GetCursorPos(out lpPoint);
        

e.Graphics.DrawLine(blackPen, lpPoint);

    }


Ist nun etwas unsauber, aber bevor ich Sachen implementiere, programmiere ich sie immer erstmal testweise ausserhalb vom Spiel. Wo sitzt da der Umsetzungs oder Denkfehler in der Linien Zeichnung und Mauserkennung ?

Zu deinem Punkt 2. Durch Kontrollen, doch wie kontrolliere ich am besten das ganze ? durch eine if schleife ? und wenn ja.. kontrolliere ich dann immer die umliegenden Grid Gitter am besten oder am besten nur nach genannten strukturen suchen ?

Hoffe ich konnte meine Fragen gut da stellen.


Das ist ziemlich genau das Gegenteil von „klein anfangen“. Ich rate dir, mit wirklich einfachen Dingen zu starten.

Ich habe schon kleinere Dinge wie Webilix programmiert was ein kleines BlockAdventure war, wo man durch slide und enge labyrinthe musste etc. Am wie gesagt, gerade neue Projekte bringen neue Hürden und gerade dann wenn man von 2D auf 3D geht oder andersrum :)


Das schöne an OpenTTD ist, dass es quelloffen ist. Vielleicht hilft ja ein Blick in den Code um ein wenig Inspiration zu bekommen.

Ja ich weiß, aber mir wurde gesagt es seie in c++ geschrieben ?

Nox

Supermoderator

Beiträge: 5 274

Beruf: Student

  • Private Nachricht senden

6

17.01.2018, 00:06

Muss denn die Sprache können um die Grundzüge eines Programms zu verstehen? Hier mal ein Beispiel:
http://earth.uni-muenster.de/~joergs/doc…/bsp/bsp2c.html <- das hier ist Fortran geschrieben. Ich denke man kann so einige Sachen daraus verstehen auch ohne Fortrankenntnisse zu haben.
Außerdem sind c++ und c# nicht sooo ewig weit von einander entfernt...
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Nox« (17.01.2018, 00:16)


Renegade

Alter Hase

Beiträge: 477

Wohnort: Berlin

Beruf: Certified Unity Developer

  • Private Nachricht senden

7

17.01.2018, 10:56

Muss denn die Sprache können um die Grundzüge eines Programms zu verstehen? Hier mal ein Beispiel:
http://earth.uni-muenster.de/~joergs/doc…/bsp/bsp2c.html <- das hier ist Fortran geschrieben. Ich denke man kann so einige Sachen daraus verstehen auch ohne Fortrankenntnisse zu haben.
Außerdem sind c++ und c# nicht sooo ewig weit von einander entfernt...

Ich musste kurz in meine Wühlkiste greifen und meine dicken, antiken Opagläser raus holen um Fortran lesen zu können. Ich glaube ich habe auch bereits begonnen Kriegsgeschichten zu erzählen und Kinder die auf dem Fußweg Fahrrad fahren anzumotzen. ;)
Liebe Grüße,
René

DerWaldfried

Frischling

  • »DerWaldfried« ist der Autor dieses Themas

Beiträge: 3

Wohnort: Bremen

Beruf: Streamer | Gabelstaplerfahrer | Freiberuflicher Programmierer

  • Private Nachricht senden

8

17.01.2018, 14:17

Ok das war zwar schon fast ein Zaunpfahl in meinem Gesicht aber du hast schon recht ^^ Ich werde mir den OpenTTD Quellcode einfach mal anschauen und versuchen den vorgang zu verstehen :) :search:

Sollte ich eine Lösung finden, werde ich sie hier natürlich gerne für User bereit stellen

LipkeGu

Frischling

Beiträge: 3

Wohnort: Berlin

  • Private Nachricht senden

9

05.06.2018, 15:41

Zitat

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static implicit operator Point(POINT point)
    {
        return new Point(point.X, point.Y);
    }

[DllImport("user32.dll")]
public static extern bool GetCursorPos(out POINT lpPoint);

public void DrawLine(PaintEventArgs e)
    {
        Pen blackPen = new Pen(Color.Black, 3);

        POINT lpPoint;
        GetCursorPos(out lpPoint);
        

e.Graphics.DrawLine(blackPen, lpPoint);

    }


Ist nun etwas unsauber, aber bevor ich Sachen implementiere, programmiere ich sie immer erstmal testweise ausserhalb vom Spiel. Wo sitzt da der Umsetzungs oder Denkfehler in der Linien Zeichnung und Mauserkennung ?


GetCursorPos, liefert dir die absolute Cursor-Position, was Du eher machen solltest und auch unbedingt machen musst, ist dir die relative Cursorposition zurücklifern lassen!
Desweiteren, Marshalst (Importest) Du falsch, den Rückgabewert, behandelst Du plain, ist jedoch ein bool ("BOOL -> int")!

C#-Quelltext

1
2
3
4
5
6
7
        [DllImport("user32.dll", EntryPoint = "GetCursorPos")]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool GetCursorPos(ref System.Drawing.Point lpPoint);

        [DllImport("user32.dll", EntryPoint = "ScreenToClient")]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool ScreenToClient([In] IntPtr hwnd, ref System.Drawing.Point lpPoint);

Mit ScreenToClient, bekommst du aus dem "absoluten", dann die relative position, deines Cursors.

Werbeanzeige