Tile anklicken, ohne für jedes Koordinaten wissen zu müssen
Übersicht

NikonoobBetreff: Tile anklicken, ohne für jedes Koordinaten wissen zu müssen |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo,
ich progge als blutiger Anfänger an einem einfachen Tilemap-Editor. Man soll durch Klicks auf leere Tiles einfach ein bestimmtes Tile einfügen, durch einen weiteren Klick das nächste Tile bis man alle geladenen Tiles durch ist und durch einen letzten Klick wieder ein leeres Feld von 32x32 Pixeln lädt. Das Prinzip soll einfach sein, dass ich ein Array nehmen und statt zahlen (0 für ein leeres feld, usw) einfach eine variable einfüge. davor baue ich natürlich eine schleife ein, die den wert der variable und damit das geladene tile immer ändert, wenn man auf das entsprechende feld klickt. jetzt zu meinen 2 fragen: 1.: kann das ganze so funktionieren? und 2.: wie löse ich das problem mit dem verfahren am besten? ich muss wohl für jedes tile ne eigene variable einfügen, sonst ändert sich mit einem klick alles und 2.: muss ich dann tatsächlich immer ne schleife machen mit "If MouseX <=x" usw usw und von jedem feldchen die koordinaten ausrechnen? gibts da nicht ne elegantere lösung? |
||
ChristianK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Du könntest Folgendes machen:
Code: [AUSKLAPPEN] Dim tiles( 19, 29 )
For I=0 To 19 For J=0 To 29 If RectsOverlap( I*32, J*32, 32, 32, MouseX( ), MouseY( ) ) If MouseHit( 1 ) tiles( I, J ) = [Neues Tile] End EndIf Next Next Die Tiles ( bzw. die Nummern der entsprechenden Tiles ) werden in einem Array gespeichert. Wenn die Maus über einem Tile ist ( Index * Größe ) und die linke Maustaste gedrückt wird, ändert sich die Tilenummer für den Bereich, über dem sich die Maus befindet. |
||
Nikonoob |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Also, von der Robsite habe ich jetzt dieses Tutorial:
Code: [AUSKLAPPEN] ;Tutorial 1: Erstellen der Level
;------------------------------- ;In diesem Teil möchte ich erklären, wie Level erstellt und auf den Bildschirm ;gebracht wird. Zusätzlich habe ich noch einige Kommentare zu den Befehlen eingegeben. Graphics 640,480 SetBuffer BackBuffer() frametimer = CreateTimer (30) ;Um das Spiel auf alle Rechnerkonfigurationen gleich schnell laufen ; lassen, sollte man einen Zeitgeber setzen. 25 - 60 sind Empfehlenswert. ClsColor 0, 0, 255 ; Farbe, mit dem der Bildschirm gelöscht wird ;Gfx laden Global tile = LoadImage ("tile2.bmp") MaskImage tile, 255, 0, 255 ;Setzt die transparente Farbe auf Lila ;Kartendaten lesen Dim map (20,15) ;Karte definieren. Da die Karte später nach X und Y Koordinaten gezeichnet wird, ;2 dimensionanes Array Restore mapdata ;Setzt die Datazeilen von mapdata zurück For y=0 To 14 ;Y = 15. Von 0 bis 14 For x=0 To 19 ;X = 20. Read map(x,y) ;Daten auslesen Next Next ;Hauptschleife Repeat Cls ;Bildschirm löschen WaitTimer (frametimer) ;Den gewählten Zeitgeber warten DrawMap() ;Function Drawmap ausführen Flip ;Bildschirm tauschen Until KeyHit (1) End ;Functionen Function DrawMap() For y = 0 To 14 For x = 0 To 19 If map(x,y) = 1 Then ;ist in dem genannten (x,y) Array eine 1 gemerkt, DrawImage tile, x*32, y*32 ;Grafik malen. EndIf Next Next End Function ;Die Koordinaten der Karte werden hier gelesen .mapdata Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Den Bereich Code: [AUSKLAPPEN] ;Functionen
Function DrawMap() For y = 0 To 14 For x = 0 To 19 If map(x,y) = 1 Then ;ist in dem genannten (x,y) Array eine 1 gemerkt, DrawImage tile, x*32, y*32 ;Grafik malen. EndIf Next Next End Function muss ich auf jeden Fall mal entfernen, richtig? Und was mache ich jetzt mit dem Code am Ende (wenn ich den oben genannten Teil entferne, kann das Programm mit den 1en sowieso nichts mehr anfangen...) ? Sry für die vielen, evtl dummen Fragen, und ich versuche auch, das zu verstehen was ihr sagt, nur wie man das ganze dann genau einbaut weiß ich leider nicht genau.... |
||
Nikonoob |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
[sry wegen doppelpost.....]
ich habe jetzt diesen code benutzt: Code: [AUSKLAPPEN] ;Tutorial 1: Erstellen der Level
;------------------------------- ;In diesem Teil möchte ich erklären, wie Level erstellt und auf den Bildschirm ;gebracht wird. Zusätzlich habe ich noch einige Kommentare zu den Befehlen eingegeben. Graphics 640,480 SetBuffer BackBuffer() frametimer = CreateTimer (30) ;Um das Spiel auf alle Rechnerkonfigurationen gleich schnell laufen ; lassen, sollte man einen Zeitgeber setzen. 25 - 60 sind Empfehlenswert. ClsColor 0, 0, 255 ; Farbe, mit dem der Bildschirm gelöscht wird ;Gfx laden Global tile = LoadImage ("tile2.bmp") MaskImage tile, 255, 0, 255 ;Setzt die transparente Farbe auf Lila ;Kartendaten lesen Dim map (20,15) ;Karte definieren. Da die Karte später nach X und Y Koordinaten gezeichnet wird, ;2 dimensionanes Array Restore mapdata ;Setzt die Datazeilen von mapdata zurück For y=0 To 14 ;Y = 15. Von 0 bis 14 For x=0 To 19 ;X = 20. Read map(x,y) ;Daten auslesen Next Next ;Hauptschleife Repeat Cls ;Bildschirm löschen WaitTimer (frametimer) ;Den gewählten Zeitgeber warten DrawMap() ;Function Drawmap ausführen Flip ;Bildschirm tauschen Until KeyHit (1) End ;Functionen Function DrawMap() For y = 0 To 14 For x = 0 To 19 If map(x,y) = 1 Then ;ist in dem genannten (x,y) Array eine 1 gemerkt, DrawImage tile, x*32, y*32 ;Grafik malen. EndIf Next Next End Function Dim tiles( 15, 20 ) For I = 1 To 15 For J = 1 To 20 If RectsOverlap( I*32, J*32, 32, 32, MouseX( ), MouseY( ) ) If MouseHit( 1 ) tiles( I, J ) = tiles(I,J) + 1 End EndIf Next Next ;Die Koordinaten der Karte werden hier gelesen .mapdata Data tiles(1,1),tiles(1,2),tiles(1,3),tiles(1,4),tiles(1,5),tiles(1,6),tiles(1,7),tiles(1,8),tiles(1,9),tiles(1,10),tiles(1,11),tiles(1,12),tiles(1,13),tiles(1,14),tiles(1,15),tiles(1,16),tiles(1,17),tiles(1,18),tiles(1,19),tiles(1,20) Data tiles(2,1),tiles(2,2),tiles(2,3),tiles(2,4),tiles(2,5),tiles(2,6),tiles(2,7),tiles(2,8),tiles(2,9),tiles(2,10),tiles(2,11),tiles(2,12),tiles(2,13),tiles(2,14),tiles(2,15),tiles(2,16),tiles(2,17),tiles(2,18),tiles(2,19),tiles(2,20) Data tiles(3,1),tiles(3,2),tiles(3,3),tiles(3,4),tiles(3,5),tiles(3,6),tiles(3,7),tiles(3,8),tiles(3,9),tiles(3,10),tiles(3,11),tiles(3,12),tiles(3,13),tiles(3,14),tiles(3,15),tiles(3,16),tiles(3,17),tiles(3,18),tiles(3,19),tiles(3,20) Data tiles(4,1),tiles(4,2),tiles(4,3),tiles(4,4),tiles(4,5),tiles(4,6),tiles(4,7),tiles(4,8),tiles(4,9),tiles(4,10),tiles(4,11),tiles(4,12),tiles(4,13),tiles(4,14),tiles(4,15),tiles(4,16),tiles(4,17),tiles(4,18),tiles(4,19),tiles(4,20) Data tiles(5,1),tiles(5,2),tiles(5,3),tiles(5,4),tiles(5,5),tiles(5,6),tiles(5,7),tiles(5,8),tiles(5,9),tiles(5,10),tiles(5,11),tiles(5,12),tiles(5,13),tiles(5,14),tiles(5,15),tiles(5,16),tiles(5,17),tiles(5,18),tiles(5,19),tiles(5,20) Data tiles(6,1),tiles(6,2),tiles(6,3),tiles(6,4),tiles(6,5),tiles(6,6),tiles(6,7),tiles(6,8),tiles(6,9),tiles(6,10),tiles(6,11),tiles(6,12),tiles(6,13),tiles(6,14),tiles(6,15),tiles(6,16),tiles(6,17),tiles(6,18),tiles(6,19),tiles(6,20) Data tiles(7,1),tiles(7,2),tiles(7,3),tiles(7,4),tiles(7,5),tiles(7,6),tiles(7,7),tiles(7,8),tiles(7,9),tiles(7,10),tiles(7,11),tiles(7,12),tiles(7,13),tiles(7,14),tiles(7,15),tiles(7,16),tiles(7,17),tiles(7,18),tiles(7,19),tiles(7,20) Data tiles(8,1),tiles(8,2),tiles(8,3),tiles(8,4),tiles(8,5),tiles(8,6),tiles(8,7),tiles(8,8),tiles(8,9),tiles(8,10),tiles(8,11),tiles(8,12),tiles(8,13),tiles(8,14),tiles(8,15),tiles(8,16),tiles(8,17),tiles(8,18),tiles(8,19),tiles(8,20) Data tiles(9,1),tiles(9,2),tiles(9,3),tiles(9,4),tiles(9,5),tiles(9,6),tiles(9,7),tiles(9,8),tiles(9,9),tiles(9,10),tiles(9,11),tiles(9,12),tiles(9,13),tiles(9,14),tiles(9,15),tiles(9,16),tiles(9,17),tiles(9,18),tiles(9,19),tiles(9,20) Data tiles(10,1),tiles(10,2),tiles(10,3),tiles(10,4),tiles(10,5),tiles(10,6),tiles(10,7),tiles(10,8),tiles(10,9),tiles(10,10),tiles(10,11),tiles(10,12),tiles(10,13),tiles(10,14),tiles(10,15),tiles(10,16),tiles(10,17),tiles(10,18),tiles(10,19),tiles(10,20) Data tiles(11,1),tiles(11,2),tiles(11,3),tiles(11,4),tiles(11,5),tiles(11,6),tiles(11,7),tiles(11,8),tiles(11,9),tiles(11,10),tiles(11,11),tiles(11,12),tiles(11,13),tiles(11,14),tiles(11,15),tiles(11,16),tiles(11,17),tiles(11,18),tiles(11,19),tiles(11,20) Data tiles(12,1),tiles(12,2),tiles(12,3),tiles(12,4),tiles(12,5),tiles(12,6),tiles(12,7),tiles(12,8),tiles(12,9),tiles(12,10),tiles(12,11),tiles(12,12),tiles(12,13),tiles(12,14),tiles(12,15),tiles(12,16),tiles(12,17),tiles(12,18),tiles(12,19),tiles(12,20) Data tiles(13,1),tiles(13,2),tiles(13,3),tiles(13,4),tiles(13,5),tiles(13,6),tiles(13,7),tiles(13,8),tiles(13,9),tiles(13,10),tiles(13,11),tiles(13,12),tiles(13,13),tiles(13,14),tiles(13,15),tiles(13,16),tiles(13,17),tiles(13,18),tiles(13,19),tiles(13,20) Data tiles(14,1),tiles(14,2),tiles(14,3),tiles(14,4),tiles(14,5),tiles(14,6),tiles(14,7),tiles(14,8),tiles(14,9),tiles(14,10),tiles(14,11),tiles(14,12),tiles(14,13),tiles(14,14),tiles(14,15),tiles(14,16),tiles(14,17),tiles(14,18),tiles(14,19),tiles(14,20) Data tiles(15,1),tiles(15,2),tiles(15,3),tiles(15,4),tiles(15,5),tiles(15,6),tiles(15,7),tiles(15,8),tiles(15,9),tiles(15,10),tiles(15,11),tiles(15,12),tiles(15,13),tiles(15,14),tiles(15,15),tiles(15,16),tiles(15,17),tiles(15,18),tiles(15,19),tiles(15,20) also deinen code eingefügt in das tutorial. jetzt gibt es aber ein problem...es kommt ne fehlermeldung "next without for" (?? es sind doch zwei fors und zwei nexts...) und wenn ich die nexts entferne, kommt die meldung "data can only appear in main program" (ist ja auch klar, denn dann kommt das data-zeugs in die for-schleife) was machen? wieso kommt so ein sinnloser fehler? und wie kann ich ihn beheben? und würde das programm so überhaupt laufen? |
||
Marek |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Zitat: If RectsOverlap( I*32, J*32, 32, 32, MouseX( ), MouseY( ) )
If MouseHit( 1 ) tiles( I, J ) = tiles(I,J) + 1 End EndIf Da fehlt ein "Endif"... Hasst wahrscheinlich beim End nur das if vergessen ![]() So ne Meldung kommt immer wenn irgendwo ne Schleife nicht beendet worden ist^^ MfG Marek |
||
Wer lesen kann ist klar im Vorteil... |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Zu jedem IF gehört normalerweise auch ein THEN ... | ||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Lador |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Falsch: Man KANN es weglassen.
MFG Lador |
||
![]() |
Tankbuster |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Xeres... eigentlich nicht, wenn man das in einen Block schreibt, und den mit EndIf abschließt!
Also: Zitat: If lol=xD
bla() EndIf |
||
Twitter
Download Jewel Snake! Windows|Android |
Marek |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ja, am Then liegt es nicht ![]() Wie gesagt, da fehlt ein "Endif" Ps.: Es gibt da auch nen "Edit" Button, den kann man benutzen um keinen Doppelpost zu machen. MfG Marek |
||
Wer lesen kann ist klar im Vorteil... |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Danke für die Hinweise... Aber wer sich angewöhnt seinen Code nicht auszuschreiben, einzurücken oder zu kommentieren macht es nicht nur sich, sondern auch anderen unnötig schwer ihn zu verstehen und Fehler zu finden. | ||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Nikonoob |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
So Leute, erstmal thx wegen dem endif. Jetzt habe ich aber das nächste Problem - "Not enough parameters" in dieser Zeile
Code: [AUSKLAPPEN] If RectsOverlap( I*32, J*32, 32, 32, MouseX( ), MouseY( ) )
Wo liegt das Problem? Der Code ist von ProGamer.Coder und ich weiß auch nicht was daran fehlt? (Koordinaten der Tiles, Größe der Tiles, Koordinaten der Maus)....die Größe der Maus kenne ich nicht, also kann ich die doch auch schlecht einbauen oder? und btw, natürlich kenne ich die edit-funktion, aber niemand hat mein topic mehr angeschaut und was das angeht bin ich leider ziemlich ungeduldig ![]() |
||
![]() |
Silver_Knee |
![]() Antworten mit Zitat ![]() |
---|---|---|
der teil der kollidiert ist genau 1x1 pixel groß also gibt das folgenden Code: [AUSKLAPPEN] If RectsOverlap( I*32, J*32, 32, 32, MouseX( ), MouseY( ) ,1,1 )
|
||
Nikonoob |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ah, thx...ich dachte, da muss man irgendwie die größe des mauszeigers eingeben (wäre natürlich sinnlos, eigentlich gehts es ja nur um die spitze der maus...)
tja, das programm läuft immer noch nciht....und jetzt ist passiert, was ich befürchtet hab: die ganze sache funktioniert so gar nicht...."Data Expression must be constant" Was ist damit gemeint? Kann ich etwa gar keine Variablen in diese Funktion stecken? Oder was hab ich sonst falsch gemacht? achja, danke dafür, dass ihr auf alle meine fragen antwortet....ich versteh nämlich, dass es nicht schadet mal selber über die lösung eines problems nachzudenken, aber ich komme mit diesen tilemaps leider noch nicht richtig klar....wäre also nett wenn ihr mir erklären könntet wie ich den editor zum laufen bringe... |
||
![]() |
Silver_Knee |
![]() Antworten mit Zitat ![]() |
---|---|---|
was hinter Data steht muss konstant sein wie 3;2343;pi usw....
du schreibst eine variable dahinter..... problem....... EDIT achso lösung^^ Mach's anderst: sol heißen lies die karte anders ein zb Mit ReadByte aus einer externen Datei oder so... |
||
Nikonoob |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
das heißt dann im klartext, dass das ganze konzept gar nicht funktionieren kann?
wie kann ich das ganze denn dann machen? edit, hab dein edit noch nicht gesehen als ich den post geschrieben hab sry.... mit externen dateien und so kann ich noch nicht umgehen....gibts vielleicht eine andere lösung? |
||
![]() |
Silver_Knee |
![]() Antworten mit Zitat ![]() |
---|---|---|
du liest deine map über Data und Read ein:
Code: [AUSKLAPPEN] Restore mapdata ;Setzt die Datazeilen von mapdata zurück
For y=0 To 14 ;Y = 15. Von 0 bis 14 For x=0 To 19 ;X = 20. Read map(x,y) ;Daten auslesen Next Next das ganze müsste man auf eine externe datei übertragen die man laden und auch speichern kann. die Technik ändert sich nicht nur die befehle: Code: [AUSKLAPPEN] file=Readfile("Meine Erste Karte.map");öffnet eine Datei zum lesen
For y=0 To 14 ;Y = 15. Von 0 bis 14 For x=0 To 19 ;X = 20. map(x,y)=ReadByte(file) ;Daten auslesen Next Next CloseFile file;Datei wieder schließen das dürfte eine leere karte auf den bidschirm bringen wenn es eine leere datei namens "Meine Erste Karte.map" gibt und in einem error enden wenn es diese nicht gibt^^ |
||
Nikonoob |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ja, aber mir geht es drum einen Editor zu schreiben mit dem ich per Klick Tiles einfüge statt 0er und 1er schreiben zu müssen ![]() |
||
![]() |
Silver_Knee |
![]() Antworten mit Zitat ![]() |
---|---|---|
wie stellst du dir denn vor wie die map abgespeichert wird?? | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group