verdammt, ich kapier es einfach nicht
from Tkinter import *
x1 = 100
y1 = 100
x2 = 130
y2 = 100
x3 = 145
y3 = 126
x4 = 130
y4 = 152
x5 = 100
y5 = 152
x6 = 85
y6 = 126
for i in range (3) :
x1 = x1 + 30
x2 = x2 + 30
x3 = x3 + 30
x4 = x4 + 30
x5 = x5 + 30
x6 = x6 + 30
master = Tk()
spiel = Canvas(master, width=900, height=600)
spiel.pack()
polygone = spiel.create_polygon(x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,x6,y6,outline="black",fill="green")
master.mainloop()
Mir ist klar, dass bei jedem Schleifenduchlauf, eine neue Instanz
Tk gebildet wird und bei jedem der drei Schleifendurchgänge ein neues Polygon in einem neuen Fenster geöffnet wird.
ABER wie sähe denn der Code richtig aus, wenn
alle drei in gleichem Fenster gezeichnet werden sollen ?
Kai
x1 = 100
y1 = 100
x2 = 130
y2 = 100
x3 = 145
y3 = 126
x4 = 130
y4 = 152
x5 = 100
y5 = 152
x6 = 85
y6 = 126
for i in range (3) :
x1 = x1 + 30
x2 = x2 + 30
x3 = x3 + 30
x4 = x4 + 30
x5 = x5 + 30
x6 = x6 + 30
master = Tk()
spiel = Canvas(master, width=900, height=600)
spiel.pack()
polygone = spiel.create_polygon(x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,x6,y6,outline="black",fill="green")
master.mainloop()
Mir ist klar, dass bei jedem Schleifenduchlauf, eine neue Instanz
Tk gebildet wird und bei jedem der drei Schleifendurchgänge ein neues Polygon in einem neuen Fenster geöffnet wird.
ABER wie sähe denn der Code richtig aus, wenn
alle drei in gleichem Fenster gezeichnet werden sollen ?
Kai
imac
20 Zoll
2,4 ghz
20 Zoll
2,4 ghz
Morgen!
Nimm Tk einfach aus der Schleife raus... ..dann gibt es auch keine neuen Fenster
Code: Alles auswählen
from Tkinter import *
x1 = 100
y1 = 100
x2 = 130
y2 = 100
x3 = 145
y3 = 126
x4 = 130
y4 = 152
x5 = 100
y5 = 152
x6 = 85
y6 = 126
master = Tk()
spiel = Canvas(master, width=900, height=600)
spiel.pack()
for i in range (3) :
x1 = x1 + 30
x2 = x2 + 30
x3 = x3 + 30
x4 = x4 + 30
x5 = x5 + 30
x6 = x6 + 30
polygone = spiel.create_polygon(x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,x6,y6,outline="black",fill="green")
master.mainloop()
War schon halb eingeschlafen...
hab dann doch noch schnell was gebastelt.. geht bestimmt noch auf anderen Wegen.. wie gesagt Schlafmangel
..bei Sechsecken denke ich automatisch an Siedler von Catan
bestimmt kannst Du mit dem kleinen Stück was basteln..
hab dann doch noch schnell was gebastelt.. geht bestimmt noch auf anderen Wegen.. wie gesagt Schlafmangel
Code: Alles auswählen
from Tkinter import *
x=[100,130,145,130,100,85]
y=[100,100,126,152,152,126]
master = Tk()
farbe="green"
spiel = Canvas(master, width=900, height=600,bg="blue")
spiel.pack()
for h in range (2):
for i in range (6):
y[i]+=25
x[i]-=135
for j in range (4):
for k in range (6):
x[k]+=90
polygone = spiel.create_polygon(x[0],y[0],x[1],y[1],x[2],y[2],x[3],y[3]
,x[4],y[4],x[5],y[5],outline="black",fill=farbe)
farbe="orange"
master.mainloop()
bestimmt kannst Du mit dem kleinen Stück was basteln..
Wieso fängst du für dieselbe Sache einen neuen Thread an?
Und warum schaffst du es immer noch nicht, deinen Code in Code-Tags zu setzen?
Der Code von ~Mitneid~ hilft auch nicht wirklich weiter, auch wenn er schon ein ganzes Stück mehr kann als deiner.
Nachdem, was du uns bis jetzt gezeigt hast, kann ich dir nur dringend raten, eines der von mir genannten Module (xturtle oder frog) einzusetzen. Im übrigen gilt, was BlackJack im anderen Thread zum gleichen Thema gepostet hat:
Logik und Darstellung trennen, weg von den absoluten Koordinaten.
Weiter gilt, was ich schon geäußert habe: Der Weg über pures Tkinter wird vermutlich für dich zu steinig sein: Satz des Pythagoras und/oder trigonometrische Funktionen sind für einen ordentlichen Ansatz, der nicht auf von irgendwo her kommenden absoluten Koordinaten beruht, unvermeidlich.
Oder du verwendest eben xturtle oder frog, dann geht es ohne.
Zur Demonstration der Code mit frog-Modul:
Das Ergebnis sieht so aus:
Und warum schaffst du es immer noch nicht, deinen Code in Code-Tags zu setzen?
Der Code von ~Mitneid~ hilft auch nicht wirklich weiter, auch wenn er schon ein ganzes Stück mehr kann als deiner.
Nachdem, was du uns bis jetzt gezeigt hast, kann ich dir nur dringend raten, eines der von mir genannten Module (xturtle oder frog) einzusetzen. Im übrigen gilt, was BlackJack im anderen Thread zum gleichen Thema gepostet hat:
Logik und Darstellung trennen, weg von den absoluten Koordinaten.
Weiter gilt, was ich schon geäußert habe: Der Weg über pures Tkinter wird vermutlich für dich zu steinig sein: Satz des Pythagoras und/oder trigonometrische Funktionen sind für einen ordentlichen Ansatz, der nicht auf von irgendwo her kommenden absoluten Koordinaten beruht, unvermeidlich.
Oder du verwendest eben xturtle oder frog, dann geht es ohne.
Zur Demonstration der Code mit frog-Modul:
Code: Alles auswählen
from frog import *
size = 30 # Seitenlaenge in px (variabel)
def draw_hexagon(color,pos):
# hier habe ich 8 Zeilen ausgelassen, damit es nicht zu einfach wird ...
pool = Pool(width=600,height=400)
frog = Frog(pool, visible=False)
frog.color = "gray"
frog.fill = True
frog.pos = startpos = -270,130 # die einzigen absoluten Koordinaten
for y in xrange(6):
for x in xrange(6):
draw_hexagon("yellow",1)
draw_hexagon("green",-1)
frog.pos = startpos
frog.turn(-120)
for k in xrange(2):
frog.jump(size)
frog.turn(60)
startpos = frog.pos
pool.ready()
das frog Modul ist sicher ein guter Tip. Ich wollte es halt nur ungerne verwenden, da ich mit dem Python Code als solches schon überfordert bin und dem Lesen der Bücher schon Unmengen zu tun habe. Trotz dass ich mir Zeit lassen möchte, bin ich leider auch ein klein wenig ungeduldig.
Aber ich werde den "Frosch" dann wohl doch benutzen, da es mir irgendwie doch die eifnachsten Möglichkeit erscheint.
Die Hexagone müssen 100 prozentig gleich sein.
Kai
Aber ich werde den "Frosch" dann wohl doch benutzen, da es mir irgendwie doch die eifnachsten Möglichkeit erscheint.
Die Hexagone müssen 100 prozentig gleich sein.
Kai
imac
20 Zoll
2,4 ghz
20 Zoll
2,4 ghz
Du musst dafür bbcode nehmen. Das heisst du schreibst den Code dafür in diese Klammern.
Code: Alles auswählen
from Tkinter import *
x=[100,130,145,130,100,85]
y=[100,100,126,152,152,126]
master = Tk()
farbe="green"
spiel = Canvas(master, width=900, height=600)
spiel.pack()
for h in range (2):
for i in range (6):
y[i]+=25
x[i]-=135
for j in range (4):
for k in range (6):
x[k]+=90
polygone = spiel.create_polygon(x[0],y[0],x[1],y[1],x[2],y[2],x[3],y[3]
,x[4],y[4],x[5],y[5],outline="black",fill=farbe)
farbe="orange"
master.mainloop()
imac
20 Zoll
2,4 ghz
20 Zoll
2,4 ghz
Das sieht cool aus mit Frog
Habe hier noch was Grobes, mit dem man einzelne Sechsecke setzen kann wo man will.
Habe hier noch was Grobes, mit dem man einzelne Sechsecke setzen kann wo man will.
Code: Alles auswählen
from Tkinter import *
kx=[1,2,3,1,1,7,8,7,7,8,7] # kx gibt die X-Position (nach rechts) an, wo ein Sechseck hin soll
ky=[1,1,1,2,3,2,2,1,4,4,5] # ky gibt die y-Position (nach unten) an , wo ein Sechseck hin soll
# es entstehen so Paare (kx0/ky0),(kx1/ky1),kx2/ky2) hier im Programm (1/1),(2/1),(3/1),(1/2),...(8/4),(7/5)
sx=[15,45,60,45,15,0]
sy=[0,0,26,52,52,26]
x=[0,0,0,0,0,0]
y=[0,0,0,0,0,0]
for i in range (6):
x[i]+=200
y[i]+=200
master = Tk()
farbe=["lightgreen","green","darkgreen","dark olive green"
,"yellow","grey40","pink","lightgreen","green","darkgreen"
,"dark olive green","yellow","grey40","pink","lightgreen"
,"green","darkgreen","dark olive green","yellow","grey40","pink"]
spiel = Canvas(master, width=900, height=600,bg="blue")
spiel.pack()
for i in range (len(kx)):
for j in range (6):
x[j]=90*kx[i]+sx[j]
y[j]=25*ky[i]+sy[j]
if ky[i]/2==ky[i]/2.0:
for p in range (6):
x[p]=x[p]-45
polygone = spiel.create_polygon(x[0],y[0],x[1],y[1],x[2],y[2],x[3],y[3]
,x[4],y[4],x[5],y[5],outline="black",fill=farbe[i])
master.mainloop()
Der Mensch ist weder Engel noch Tier, und das Unglück will es, dass, wer einen Engel aus ihm machen will, ein Tier aus ihm macht.
Blaise Pascal (1623-1662)
Blaise Pascal (1623-1662)
hey klasse !!! viele Dank.
Ehrlich gesagt verstehe ich zwar noch nicht alles in Deinem Code,
aber wenn ich mich nicht täusche, dann sind die Hexagone nicht
100 prozentig gleich, oder ?
15 / 45 = 30
45 / 60 = 25
Was passiert hier ? und Warum ?
Kai
Ehrlich gesagt verstehe ich zwar noch nicht alles in Deinem Code,
aber wenn ich mich nicht täusche, dann sind die Hexagone nicht
100 prozentig gleich, oder ?
15 / 45 = 30
45 / 60 = 25
Code: Alles auswählen
for i in range (6):
x[i]+=200
y[i]+=200
Kai
imac
20 Zoll
2,4 ghz
20 Zoll
2,4 ghz
Es wird auf die ersten 6 Werte in x bzw. y 200 addiert. 200 wird hier die Seitenlänge sein.derkai hat geschrieben:Was passiert hier ? und Warum ?Code: Alles auswählen
for i in range (6): x[i]+=200 y[i]+=200
Mir erschliesst sich aber auch nicht wieso man in Zeile 8 und 9 nicht gleich 200 statt 0 genommen hat...
Servus
Bin immernoch im Schlafdefizit
Die X-Koordinaten habe ich aus Deinem ursprünglichen Versuch.
Ich habe die x1 bis x6 Koordinaten genommen und 85 davon abgezogen
x1 war bei Dir 100 und ich hab dann 100-85=15 draus gemacht.
Sollte ich mich nicht verrechnet haben, dann sind meine so schief wie Du sie vorgegeben hast. Bin wie gesagt noch nicht richtig wach, aber mit zusammengepressten Augen sehen die Sechsecke ok für mich aus.
Heute rechne ich das aber nicht mehr nach
Tja Du hast vollkommen recht. Da passiert gar nichts. Es war gedacht um die gesamte Karte horizontal (x Werte) oder vertikal (y Werte) ausrichten zu können...
einfach den Teil ignorieren/rausschneiden
hier einfach dafür was dranhängen
also einfach andere Zahlen für -40 und -10 zum Ausrichten..
bitte um Verzeihung
Bin immernoch im Schlafdefizit
Die X-Koordinaten habe ich aus Deinem ursprünglichen Versuch.
Ich habe die x1 bis x6 Koordinaten genommen und 85 davon abgezogen
x1 war bei Dir 100 und ich hab dann 100-85=15 draus gemacht.
Sollte ich mich nicht verrechnet haben, dann sind meine so schief wie Du sie vorgegeben hast. Bin wie gesagt noch nicht richtig wach, aber mit zusammengepressten Augen sehen die Sechsecke ok für mich aus.
Heute rechne ich das aber nicht mehr nach
Code: Alles auswählen
for i in range (6):
x[i]+=200
y[i]+=200
einfach den Teil ignorieren/rausschneiden
hier einfach dafür was dranhängen
Code: Alles auswählen
x[j]=90*kx[i]+sx[j]-40 #verschiebt alles um 40 nach links
y[j]=25*ky[i]+sy[j]-10# verschiebt um 10 nach oben...
also einfach andere Zahlen für -40 und -10 zum Ausrichten..
bitte um Verzeihung
Der Mensch ist weder Engel noch Tier, und das Unglück will es, dass, wer einen Engel aus ihm machen will, ein Tier aus ihm macht.
Blaise Pascal (1623-1662)
Blaise Pascal (1623-1662)
Vielleicht habe ich den Versuch, Battletech nachzubauen, schon mal mit einem entsprechenden Hinweis verstehen, vielleicht nicht. Ich halte es nach wie vor für einfacher, das mit HTML als UI zu machen.
Wenn man nur eine einheitliche Hexkarte ohne Geländemerkmale braucht, reicht ein PNG, welches in den Hintergrund gepackt ein natloses Hexgrid ergibt. Die Riesenroboter malt man dann mit 6 verschiedenen (eines pro Richtung) PNGs pro Fraktion per absoluter Positionierung darauf.
Dies macht es aber recht schwer, z.B. Reichweiten von Waffensystemen anzuzeigen. Wenn es nur z.B. die Reichweiten von 1-6 Felder gäbe, könnte man sich mit 6 vorbereiteten transluzenten Kreisgrafiken behelfen. Optimal ist es nicht, dafür sehr schnell.
Alternativ kann man ein PNG pro Hexfeld nehmen. Dann lässt sich z.B. auch ein Kegel oder eine andere Form, die Hinternisse berücksichtigt, durch das individuelle Hervorheben von Feldern visualisieren.
Schreibt man die PNGs einfach hintereinander, sieht es für jeweils zwei Zeilen so aus
und dann wird jedes zweite Hexfeld per relativer Positionierung nach links und unten verschoben, sodass sich die gewohnte Darstellung ergibt
Stefan
Wenn man nur eine einheitliche Hexkarte ohne Geländemerkmale braucht, reicht ein PNG, welches in den Hintergrund gepackt ein natloses Hexgrid ergibt. Die Riesenroboter malt man dann mit 6 verschiedenen (eines pro Richtung) PNGs pro Fraktion per absoluter Positionierung darauf.
Code: Alles auswählen
\__/
/ \__
Alternativ kann man ein PNG pro Hexfeld nehmen. Dann lässt sich z.B. auch ein Kegel oder eine andere Form, die Hinternisse berücksichtigt, durch das individuelle Hervorheben von Feldern visualisieren.
Schreibt man die PNGs einfach hintereinander, sieht es für jeweils zwei Zeilen so aus
Code: Alles auswählen
__ __ __ __
/ \/ \/ \/ \
\__/\__/\__/\__/
Code: Alles auswählen
__ __
/ \__/ \__
\__/ \__/ \
\__/ \__/
nee nee, schon ok.
ich freue mich ja, das sich soo viele melden und etwas schreiben.
Es ist halt nur so, dass ein I Dötzchen wie ich, es halt enorm schwer
hat auch nur ganz simple Dinge zu verstehen.
Ich beschäftige mich mit Python noch nicht so lange.
Gruß
Kai
ich freue mich ja, das sich soo viele melden und etwas schreiben.
Es ist halt nur so, dass ein I Dötzchen wie ich, es halt enorm schwer
hat auch nur ganz simple Dinge zu verstehen.
Ich beschäftige mich mit Python noch nicht so lange.
Gruß
Kai
imac
20 Zoll
2,4 ghz
20 Zoll
2,4 ghz
ok, dank Eurer Hilfe bin ich nun einen Schritt weiter :
... aber warum dauert der Aufbau soooooo lange ?
Kai
Code: Alles auswählen
from frog import *
from random import *
size = 20 #Groesse Hexfeld
pool = Pool(width=1024,height=768,bgcolor="black") #Groesse Pool Spielflaeche
frog = Frog(pool)
level1=182,116,23 #braun = Boden
level2=13,166,20 #gruen = Wald
level3=53,66,244 #blau = Wasser
Level = (level1,level1,level2,level1,
level1,level1,level3,level1,
level1,level1,level1,level1,
level2,level1,level1,level1,
level1,level1,level1,level1,
level1,level1,level1,level1) #Random Mischer
frog.animate=False
frog.visible=False
frog.speed = 10
frog.width=2
frog.fill=True
y = 370
for k in range(20):
x = - 490
y = y - 36
frog.pos = x,y
for k in range(17):
for k in range(6):
frog.move(size)
frog.turn(60)
frog.fillcolor = choice(Level)
frog.jump(60)
y = 352
for k in range(20):
x = -460
y = y - 36
frog.pos = x,y
for k in range(16):
for k in range(6):
frog.move(size)
frog.turn(60)
frog.fillcolor= choice(Level)
frog.jump(60)
pool.ready()
Kai
imac
20 Zoll
2,4 ghz
20 Zoll
2,4 ghz
Glückwunsch, das ist doch mal ein Erfolg!
Das dauert so lange, weil du
a) eine Riesenmenge an Zeichenoperationen vornimmst (die aber auch nötig sind)
b) das frog-Modul nicht unbedingt auf höchste Performance ausgerichtet ist
c) das darunter liegende Tkinter dies ebenfalls nicht ist
Darüber hinaus ist anzumerken:
a) Jedes gezeichnete Element auf einem Tkinter-Canvas wird als Item geführt; dein Spielfeld bringt es auf 660 Items (kannst du mit frog.items abfragen) und mit steigender Zahl an items werden die Grafikoperationen immer langsamer
b) Das frog-Attribute animate ist veraltet (es bewirkt einfach gar nichts mehr); um die max. Geschwindigkeit zu erreichen, setzt man frog.speed = "max".
c) Eine deutliche Geschwindigkeitssteigerung könnte man dadurch erreichen, dass man eine neu frog-Shape in Gestalt eines Sechsecks definiert und dann mittels der Methode stamp() Abbilder dieses "Froschs" setzt. Allerdings ist man dann nicht mehr in der Größe der Sechsecke flexibel. Wie viel schneller das geht, habe ich aber nicht ausprobiert.
Das dauert so lange, weil du
a) eine Riesenmenge an Zeichenoperationen vornimmst (die aber auch nötig sind)
b) das frog-Modul nicht unbedingt auf höchste Performance ausgerichtet ist
c) das darunter liegende Tkinter dies ebenfalls nicht ist
Darüber hinaus ist anzumerken:
a) Jedes gezeichnete Element auf einem Tkinter-Canvas wird als Item geführt; dein Spielfeld bringt es auf 660 Items (kannst du mit frog.items abfragen) und mit steigender Zahl an items werden die Grafikoperationen immer langsamer
b) Das frog-Attribute animate ist veraltet (es bewirkt einfach gar nichts mehr); um die max. Geschwindigkeit zu erreichen, setzt man frog.speed = "max".
c) Eine deutliche Geschwindigkeitssteigerung könnte man dadurch erreichen, dass man eine neu frog-Shape in Gestalt eines Sechsecks definiert und dann mittels der Methode stamp() Abbilder dieses "Froschs" setzt. Allerdings ist man dann nicht mehr in der Größe der Sechsecke flexibel. Wie viel schneller das geht, habe ich aber nicht ausprobiert.
Ergänzung / Präzisierung / Korrektur zum letzten Post:
Die Idee mit dem Ansatz über die shape()-Methode des Froschs bringt keinen nennenswerten Geschwindigkeitsvorteil.
Der Verzicht auf das frog Modul bringt einen ganz erheblichen Geschwindigkeitsvorteil! Ich habe das ganze gerade mal mit "Tkinter pur" umgesetzt und - - das gesamte Spielfeld ist mit einem Schlag sofort sichtbar!
Die benötigte Mathematik hält sich auch in Grenzen, wenn du es geschickt anstellst; der Satz des Pythagoras genügt, Trigonometrie brauchst du nicht.
Allerdings wäre auch weiter zu überlegen, was dein künftiges Spiel sonst noch so leisten soll und ob man dann nicht ggf. die schlechte Performance des Froschs in Kauf nimmt, um weitere Elemente des Spiels dann ggf. in gut lesbarem Code und unter Verwendung einiger komfortabler Frosch-Methoden umzusetzen.
Die Idee mit dem Ansatz über die shape()-Methode des Froschs bringt keinen nennenswerten Geschwindigkeitsvorteil.
Der Verzicht auf das frog Modul bringt einen ganz erheblichen Geschwindigkeitsvorteil! Ich habe das ganze gerade mal mit "Tkinter pur" umgesetzt und - - das gesamte Spielfeld ist mit einem Schlag sofort sichtbar!
Die benötigte Mathematik hält sich auch in Grenzen, wenn du es geschickt anstellst; der Satz des Pythagoras genügt, Trigonometrie brauchst du nicht.
Allerdings wäre auch weiter zu überlegen, was dein künftiges Spiel sonst noch so leisten soll und ob man dann nicht ggf. die schlechte Performance des Froschs in Kauf nimmt, um weitere Elemente des Spiels dann ggf. in gut lesbarem Code und unter Verwendung einiger komfortabler Frosch-Methoden umzusetzen.
@numerix: Ohne mir den Frosch jetzt angeschaut zu haben: Kann es sein, dass der *absichtlich* langsam ist, damit man ihm beim Zeichnen zuschauen kann? Das ist doch im Grunde so'n "Lerndingens" wie die Schildkröten, oder?