x bzw. y koords in dim speichern
Übersicht

![]() |
dominikBetreff: x bzw. y koords in dim speichern |
![]() Antworten mit Zitat ![]() |
---|---|---|
wiso funtz des net?
eigentlich sollte des prog. doch 11 burgstellen speichern können. aber irgentwie kann ich nur des erste setzen und die anderen werden aber nicht mehr gespeichert. Code: [AUSKLAPPEN] Graphics 640, 480 SetBuffer BackBuffer() burg = LoadImage("castle.bmp") maus = LoadImage("pointer.bmp") hinterg = LoadImage("hinterg.bmp") hintergb = LoadImage("hintergb.bmp") ScaleImage burg, .5, .5 speicher = 1 MoveMouse 250, 200 Dim vo(100), xo(100), yo(100) Repeat X = MouseX() Y = MouseY() Gosub karte_neu_zeichnen If X > 630 Then x = 630 If speicher = 2 Then If X > 470 Then x = 470 If y > 440 Then y = 440 EndIf If Y > 460 Then Y = 460 Text 500, 50, "Speicher: " + speicher If speicher = 1 Then DrawImage maus, x, y If speicher = 2 Then DrawImage burg, x, y If KeyDown(3) Then speicher = 2 If KeyDown(2) Then speicher = 1 If speicher = 2 Then If MouseDown(1) Then For i = 0 To 10 If vo(i) = 0 Then vo(i) = 1 Xo(i) = X Yo(i) = y EndIf Next speicher = 1 EndIf EndIf Flip Until KeyDown(1) End .karte_neu_zeichnen Cls TileBlock hinterg, 0, 0 DrawImage hintergb, 500, 0 For i = 0 To 10 If vo(i) = 1 Then DrawImage burg, Xo(i), yo(i) Next Return |
||
BIG BUG |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Du speicherst mit deinem Mausklick nicht nur eine Burg, sondern alle an der gleichen Stelle...
versuchs mal so: Code: [AUSKLAPPEN] If speicher = 2 Then If MouseDown(1) Then For i = 0 To 10 If vo(i) = 0 Then vo(i) = 1 Xo(i) = X Yo(i) = y exit; <<<< das muss da rein EndIf Next speicher = 1 EndIf EndIf |
||
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final) |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
hmmm.. ich denke das hier:
Code: [AUSKLAPPEN] For i = 0 To 10
alle x und y beim ersten durchlauf gesetzt werden, da zu beginn ja für alle vo(i) =0 gilt.
If vo(i) = 0 Then vo(i) = 1 Xo(i) = X Yo(i) = y EndIf Next Du könntest entweder prüfen ob i-1 <>0 ist und nur dann x und y setzen (achtung : schleife muß dann rückwärts laufen (10 to 0) und du brauchst für vo(0) ne Sonderregelung) oder du machst n pointer auf den zuletzt gesetzten Speicher, welchen du dann erhöhst .. |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
dominik |
![]() Antworten mit Zitat ![]() |
---|---|---|
ok danke des funtzt jetzt perfekt.
hab aber inderzwischen zeit noch nen neues prob. und zwar möchte ich mit der maus nen route festlegen (zur bewegung der einheiten) und zwar mit der maus dabei wir in zwei anfangs variablen (lax, lay) die anfangs x und y koords gespeicxhert wenn man dann mit der maus zu einem anderen punkt fährt wird in 2 endvariablen (lex, ley) die endvariablen gespeichert. und dann soll die linie zwischen den zwei punkten gezeichnet werden . eigentlich ganz logische und einfach funtzt bloß nich so ganz. ![]() Code: [AUSKLAPPEN] Graphics 640, 480 SetBuffer BackBuffer() turm = LoadImage("castle.bmp") maus = LoadImage("pointer.bmp") hinterg = LoadImage("hinterg.bmp") hintergb = LoadImage("hintergb.bmp") mauer = LoadImage("mauer.bmp") haus1 = LoadImage("haus1.bmp") haus2 = LoadImage("haus2.bmp") ScaleImage turm, .5, .5 ScaleImage mauer, .5, .5 speicher = 1 MoveMouse 250, 200 Dim vo(1000), xo(100), yo(100), lax(1), lay(1), lex(1), ley(1), la(1) ; hauptschleife Repeat X = MouseX() Y = MouseY() Gosub karte_neu_zeichnen If X > 630 Then x = 630 If speicher = 2 Or speicher = 3 Then If X > 470 Then x = 470 If y > 422 Then y = 422 EndIf ; des is der teil zur zeichnung der linie If speicher = 1 Then If MouseDown(1) Then For i = 0 To 1 Lax(I) = X lay(I) = Y la(I) = 1 Next EndIf If la(I) = 1 Then If MouseDown(1) Then la(I) = 0 For i = 0 To 1 lex(I) = x Ley(I) = y Lax(I) = 0 lay(I) = 0 Next EndIf EndIf EndIf ; bis hier die linie wird dann im unterprog gezeicnet Text 500, 70, la(I) Text 500, 80, lax(I) Text 500, 90, lay(I) Text 500, 100, lex(I) Text 500, 110, ley(I) If Y > 460 Then Y = 460 Text 500, 50, "Speicher: " + speicher If speicher = 1 Then DrawImage maus, x, y If speicher = 2 Then DrawImage turm, x, y If speicher = 3 Then DrawImage mauer, x, y If speicher = 4 Then DrawImage haus1, x, y If speicher = 5 Then DrawImage haus2, x, y If MouseDown(2) Then speicher = 1 If KeyDown(2) Then speicher = 1 If KeyDown(3) Then speicher = 2 If KeyDown(4) Then speicher = 3 If KeyDown(5) Then speicher = 4 If KeyDown(6) Then speicher = 5 ;turm If speicher = 2 Then If MouseDown(1) Then For i = 0 To 50 If vo(i) = 0 Then vo(i) = 1 Xo(i) = X Yo(i) = y Exit EndIf Next speicher = 1 EndIf EndIf ; hier hab ich nen bischen code weggekürtzt Flip Until KeyDown(1) End ; ende der hauptschleife .karte_neu_zeichnen Cls TileBlock hinterg, 0, 0 DrawImage hintergb, 500, 0 ;If la(I) = 1 Then Line lax(I), lay(I), leX(I), leY(I) ;turm For i = 0 To 50 If vo(i) = 1 Then DrawImage turm, Xo(i), yo(i) Next ;mauer For i = 0 To 50 If vo(i) = 3 Then DrawImage mauer, Xo(i), yo(i) Next ;haus1 For i = 0 To 50 If vo(i) = 4 Then DrawImage haus1, Xo(i), yo(i) Next ;haus2 For i = 0 To 50 If vo(i) = 5 Then DrawImage haus2, Xo(i), yo(i) Next Return in LA(I) wird geprüft ob "die linie gerade am courser hängt" also gezeichnet werden soll oder nicht. |
||
![]() |
dominik |
![]() Antworten mit Zitat ![]() |
---|---|---|
kann mir hier keiner helfen oder was? | ||
walskiEhemaliger Admin |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Irgendwie ahten meine Codes in letzter Zeit immer etwas aus ![]() Naja, ich poste es trotzdem ma: Code: [AUSKLAPPEN] ; just a tiny type demo ; (c) 2004 by walski Const Key_Esc = 1,Key_Del = 211,Key_Space = 57 Const Screen_Fullscreen = 1,Screen_Windowed = 2 Const Screen_Width = 800,Screen_Height = 600,Screen_Depth = 16,Screen_Mode = Screen_Fullscreen Type Units Field ID Field x,y Field TieID End Type Type UnitFreeIDs Field ID End Type Global TieMode = 0,CurTie = 0,SelID = 0,TieShift = -1 Global Unit_Radius = 20,Unit_Filled = 0,Unit_LastID = 0,Unit.Units Global UnitFreeID.UnitFreeIDs Graphics Screen_Width,Screen_Height,Screen_Depth,Screen_Mode SetBuffer BackBuffer() timer = CreateTimer(100) While Not KeyDown(Key_Esc) Cls If TieShift>0 Then Text 1,1,"!TIE!" EndIf If MouseHit(1) Then Unit = New Units Unit\ID = NextUnitID() nUID = Unit\ID Unit\x = MouseX() Unit\y = MouseY() If CurTie>0 Then Unit\TieID = CurTie If TieShift>0 Then CurTie = Unit\ID Else CurTie = 0 EndIf Else CurTie = Unit\ID EndIf EndIf ;Tie Point If MouseHit(2) If SelID>0 And CurTie>0 And CurTie<>SelID Then For Unit = Each Units If Unit\ID = SelId Then tSelUnitX = Unit\x tSelUnitY = Unit\y Goto JumpForEach EndIf Next .JumpForEach Unit = New Units Unit\ID = NextUnitID() nUID = Unit\ID Unit\x = tSelUnitX Unit\y = tSelUnitY If CurTie>0 Then Unit\TieID = CurTie If TieShift>0 Then CurTie = Unit\ID Else CurTie = 0 EndIf Else CurTie = Unit\ID EndIf ElseIf SelID>0 CurTie = SelID EndIf EndIf ;TieShifting If KeyHit(Key_Space) Then TieShift = TieShift*-1 EndIf ;Delete point If KeyDown(Key_Del) And SelID>0 Then For Unit = Each Units If Unit\TieID = SelID Then Unit\TieID = 0 EndIf If Unit\Id = SelID Then UnitFreeID = New UnitFreeIDs UnitFreeID\ID = Unit\ID Delete Unit EndIf Next EndIf ;Draw Points DrawUnits() WaitTimer(timer) Flip Wend End Function DrawUnits() tMx = MouseX() tMy = MouseY() SelID = 0 For Unit = Each Units Color 0,255,0 If CurTie=Unit\ID Then Color 255,0,0 tSelUnitX = Unit\x tSelUnitY = Unit\y ElseIf inCircle(Unit\x,Unit\y,Unit_Radius/2,tMx,tMy) Color 0,0,255 SelID = Unit\ID EndIf Oval Unit\x-(Unit_Radius/2),Unit\y-(Unit_Radius/2),Unit_Radius,Unit_Radius,Unit_Filled If Unit\TieID>0 Then For tUnit.Units = Each Units If tUnit\ID = Unit\TieID Then Color 0,255,0 Line Unit\x,Unit\y,tUnit\x,tUnit\y Goto jumpForEach EndIf Next .JumpForEach EndIf Next Color 255,255,255 WritePixel tMx,tMy,$ffffffff Oval tMx-(Unit_Radius/2),tMy-(Unit_Radius/2),Unit_Radius,Unit_Radius,Unit_Filled If CurTie > 0 Then Line tMx,tMy,tSelUnitX,tSelUnitY EndIf End Function Function inCircle(x,y,Radius,x2,y2) RVar = 0 tx = Abs(x-x2) ty = Abs(y-y2) If Sqr(tx^2+ty^2)<=Radius Then RVar=1 EndIf Return RVar End Function Function NextUnitID() rVar = 0 For UnitFreeID = Each UnitFreeIDs If UnitFreeID\ID Then rVar = UnitFreeID\ID Delete UnitFreeID Goto JumpForEach EndIf Next .JumpForEach If rVar>0 Then Return rVar EndIf Unit_LastID = Unit_LastID + 1 Return Unit_LastID End Function Das ganze benutzt keine Arrays sondern Types, da sie VIEL dynamischer und damit besser geignet sind für das was du machen möchtest. Ich wollte erst noch ne Array Lösung coden, aber ich muss jetzt los. walski |
||
buh! |
![]() |
dominik |
![]() Antworten mit Zitat ![]() |
---|---|---|
aha danke ich hab keinen plan was du da mit ID, funktionen und sonst noch für nen zeugs geproggt hast abe ich habs in der zwischenzeit selber ohne array und dims gelöst in zwei zeilen mit ganznormalen variablen.
du hast deinen code auch nich getestet oder? Code: [AUSKLAPPEN] nUID = Unit\ID sonst wäre dir das auf jedenfall aufgefallen. was hast du eigentlich gegen dims ich hab bisher immer nur gehört das dims vieeeeeel besser als arrays sein sollen. ich hab selber die erfahrung gemacht das ich mit arrays immer schnelll die übersicht verliere. seit wann codest du mit goto. ich dachte immer du seist einer von den pro's aber jeder lernt doch schon am ersten tag das man keine goto verwenden soll oder? |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
@ dominik...
ich denke du kannst sicher sein, dass Walski nur Gotos verwendet wo sie unerlässlich sind ( im vorliegenden beispiel als schleifenausstieg, noch dazu in minuten gecodet...) |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
walskiEhemaliger Admin |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
dominik hat Folgendes geschrieben: du hast deinen code auch nich getestet oder? Code: [AUSKLAPPEN] nUID = Unit\ID sonst wäre dir das auf jedenfall aufgefallen. Das ist in der Debug-Phase entstanden und ich hab es vergessen zu löschen! Es stört ja nicht, is nur überflüssig! Und sei dir sicher: Ich habe den Code getestet! Zitat: was hast du eigentlich gegen dims ich hab bisher immer nur gehört das dims vieeeeeel besser als arrays sein sollen. ich hab selber die erfahrung gemacht das ich mit arrays immer schnelll die übersicht verliere. "Dims" sind doch nur dazu da um Arrays zu dimensionieren ![]() Also Dims=Arrays du meinst sicherlich eher Types<>Arrays. Da gibt es unterschiedliche Meinungen, ich bevorzuge der Flexibilität wegen meist Types. Wobei es sicherlich auch viele Gebiete gibt bei denen Arrays viel sinnvoller sind! Aber das ist ein Streit den ich jetzt hier nicht anfangen will: Jedem das seine! Zitat: seit wann codest du mit goto. ich dachte immer du seist einer von den pro's aber jeder lernt doch schon am ersten tag das man keine goto verwenden soll oder? Das hat BladeRunner ja schon richtig erkannt! Ich könnte natürlich auch ohne das Goto fortfahren, so spare ich aber Zeit! Und eine umständlichere "First"-"Next"... Konstruktion mit While oder so is mir an der Stelle zu umständlich gewesen! M.f.G. walski |
||
buh! |
![]() |
dominik |
![]() Antworten mit Zitat ![]() |
---|---|---|
ok ok ich nehm alles zurück
und hab schon wieder nen prob. wiso wird hier mauszeiger nich 2 wenn ich mit der maus über den turm fahre? Code: [AUSKLAPPEN] ;wenn sich mauszeiger und turm überschneifen dann ...... If speicher = 1 Then For i = 0 To 50 If ImagesOverlap(maus,x,y,turm,xo(I),yo(I)) = 1 Then mausspeicher = 2 EndIf If ImagesOverlap(maus,x,y,turm,xo(I),yo(I)) <> 1 Then mausspeicher = 1 EndIf Next EndIf |
||
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Da du ja alles in einer Schleife abfragst, kann es sein, dass du zum beispiel über den Turm mit Index 3 fährst, aber nicht über die mit den Indizen 4-50, wo dann mausspeicher wieder auf 1 gesetzt wird.
Sobald du also über einen Turm fährst, solltest du die Schleife beenden: Code: [AUSKLAPPEN] ;wenn sich mauszeiger und turm überschneiden dann ...... If speicher = 1 Then For i = 0 To 50 If ImagesOverlap(maus,x,y,turm,xo(I),yo(I)) = 1 Then mausspeicher = 2 Exit Else mausspeicher = 1 EndIf Next EndIf Ausserdem kannst du, statt zweimal die Kollision abzufragen, ganz einfach beim zweiten ein Else hinschreiben, denn entweder überlapts (If ImagesOverlap(maus etc... ), oder es überlapt nicht (Else). MfG |
||
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group