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

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Nikonoob

Betreff: Tile anklicken, ohne für jedes Koordinaten wissen zu müssen

BeitragDi, Jun 05, 2007 20:46
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Jun 05, 2007 20:53
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Jun 05, 2007 21:14
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Jun 06, 2007 18:08
Antworten mit Zitat
Benutzer-Profile anzeigen
[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

BeitragMi, Jun 06, 2007 18:13
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink
So ne Meldung kommt immer wenn irgendwo ne Schleife nicht beendet worden ist^^
MfG Marek
Wer lesen kann ist klar im Vorteil...

Xeres

Moderator

BeitragMi, Jun 06, 2007 18:16
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Lador

BeitragMi, Jun 06, 2007 18:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Falsch: Man KANN es weglassen.

MFG Lador

Tankbuster

BeitragMi, Jun 06, 2007 18:18
Antworten mit Zitat
Benutzer-Profile anzeigen
@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

BeitragMi, Jun 06, 2007 18:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, am Then liegt es nicht Wink Das kann man weglassen(es dient nur der Übersicht)...
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...

Xeres

Moderator

BeitragMi, Jun 06, 2007 18:25
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Nikonoob

BeitragMi, Jun 06, 2007 19:53
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink

Silver_Knee

BeitragMi, Jun 06, 2007 19:55
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Jun 06, 2007 20:00
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Jun 06, 2007 20:58
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Jun 06, 2007 21:02
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Jun 06, 2007 21:08
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Jun 06, 2007 21:13
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink

Silver_Knee

BeitragMi, Jun 06, 2007 21:29
Antworten mit Zitat
Benutzer-Profile anzeigen
wie stellst du dir denn vor wie die map abgespeichert wird??

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group