B+: MouseXSpeed & Seltsames Problem

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Bamboo

Betreff: B+: MouseXSpeed & Seltsames Problem

BeitragDo, Apr 14, 2011 22:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich programmiere zur Zeit einen Tilemapeditor in B+. Dabei habe ich folgende Probleme:
    1. In meinem Editor lässt sich der aktive Tile, der auf der Karte gesetzt wird, durch das Scrollrad auswählen. Diese Auswahl ruckelt jedoch sehr; man muss mehrmals am Scrollrad drehen, damit sich das aktive Tile überhaupt ändert. Hier die Stelle im Code:

Code: [AUSKLAPPEN]
Function SelectTileScroll()
   mouse_scroll = MouseZSpeed() ;es wird festgestellt, ob sich die Position des Rads geändert hat
   
   If mouse_scroll < 0 And tile_active < set_number - 1 ;bei negativen Wert (nach unten scrollen)
      tile_active = tile_active + 1 ;...wird das aktive Tile um 1 erhöht...
      tile_selected = tile_selected + 1 ;...und das in der Auswahlleiste angezeigte Tile um 1 erhöht
   EndIf
   
   If mouse_scroll > 0 And tile_active > 0 ;bei positiven Wert (nach oben scrollen)...
      tile_active = tile_active - 1 ;...findet das Ganze umgekerht statt
      tile_selected = tile_selected - 1
   EndIf
End Function


    2. In meinem Editor wird die Karte durch ein Canvasobjekt dargestellt und kann mit den Pfeiltasten "gescrollt" werden. Jedoch funktioniert das nur dann ruckelfrei, wenn ich konitnuierlich den Cursor bewege; wenn ich ihn nicht bewege, ruckelt es also total. Code:

Code: [AUSKLAPPEN]
Function ScrollMap()
   If KeyDown(200) And map_scroll_y < can_height - (selection_size + tile_size)   ;Pfeiltaste: Oben
      map_scroll_y = map_scroll_y + tile_size
                ;die Karte wird immer durch map_scroll_x / y verschoben angezeigt
      Delay 10 ;Delay soll für ein Geschwindigkeitsmaximum beim Scrollen sorgen
   EndIf   
   If KeyDown(208) And map_scroll_y > 0 - map_height * tile_size      ;Unten
      map_scroll_y = map_scroll_y - tile_size
      Delay 10
   EndIf
   If KeyDown(203) And map_scroll_x < can_width          ;Links
      map_scroll_x = map_scroll_x + tile_size
      Delay 10
   EndIf
   If KeyDown(205) And map_scroll_x > 0 - map_width * tile_size      ;Rechts
      map_scroll_x = map_scroll_x - tile_size
      Delay 10
   EndIf
End Function

    3. Wenn ich ein "Neben"-fenster schließe (z.B. das "Speichern"- oder "Laden-"fenster), stürzt das gesamte Programm ab. Bsp-Code (Speicherfenster):

Code: [AUSKLAPPEN]
Function SaveMap()
   win_width    = 24*16 ;Fenstervariablen werden berechnet (hätte ich auch global machen können)
   win_height   = 10*16
   win_save = CreateWindow ("Wildlands TMG - Karte Speichern", window_x+16, window_y+16, win_width, win_height, win_main, 1)
   
   lbl_width   = 160 ;die Maße des Standartlabels werden definiert
   lbl_height = 16
   lbl_x      = 32
   lbl_y      = 32
   
   tf_width   = 160 ;die Maße des Standarttextfelds werden definiert
   tf_height    = 20
   tf_x      = win_width - (tf_width + 32)
   tf_y      = 28
   
   but_x      = 64 ;die Maße des Standartbuttons werden definiert
   but_y      = 3*lbl_y
   but_width   = 96
   but_height   = 24
   
;nun werden Labels, TExtfelder und Buttons angezeigt
   lbl_spath    = CreateLabel("Dateipfad der Karte: ", lbl_x, 1*lbl_y, 150, 16, win_save, 0)
   tf_spath   = CreateTextField(tf_x, lbl_y - 4, tf_width - 32, tf_height, win_save, 0)
   but_spath   = CreateButton("...", win_width - (tf_height + 32), lbl_y - 4, tf_height, tf_height, win_save, 1)
   SetGadgetText tf_spath, "C:\Users\*\Documents\Programmieren\Blitz\TilemapGenerator"
   
   lbl_sname   = CreateLabel("Name der Karte: ", lbl_x, 2*lbl_y, 150, 16, win_save, 0)
   tf_sname   = CreateTextField(tf_x, 2*lbl_y - 4, tf_width - 48, tf_height, win_save, 0)
   lbl_sending   = CreateLabel(".map", tf_x + tf_width - 32, 2*lbl_y, 32, 16, win_save, 0)
   
   but_ok          = CreateButton("OK", but_x, but_y, but_width, but_height, win_save, 4)
   but_cancel      = CreateButton("Abbrechen", win_width - (but_width + but_x), but_y, but_width, but_height, win_save, 5)
   
   Repeat
      Select WaitEvent() ;gedrückte Buttons werden abgefragt (bzw. das Schließen-Kreuz)
         Case $401
            button = EventSource()
            
            If button = but_path
               selected_path$ = RequestDir("Dateipfad auswählen", "C:\Users\*\Documents\Programmieren\Blitz\TilemapGenerator")
               SetGadgetText tf_spath, selected_path$
            ElseIf button = but_ok
               spath$   = TextFieldText(tf_spath)
               sname$   = TextFieldText(tf_sname)
               
               map_name$ = spath$ + "\" + sname$
                                             
               If map_failed = 0
                  map_file = WriteFile(map_name$ + ".map")
                  
                  WriteLine  map_file,   set_path$
                  WriteInt  map_file,      tile_size
                  WriteInt  map_file,      set_number
                  WriteInt  map_file,    map_width
                  WriteInt  map_file,    map_height
                  
                  WriteInt  map_file,      tile_active
                  WriteInt  map_file,      tile_selected

                  For x = 0 To map_width
                     For y = 0 To map_height
                        WriteInt  map_file, map(x,y)
                     Next
                  Next
                  
                  FreeGadget win_save
                  map_done = 1   
               EndIf
               
               map_failed = 0         
            ElseIf button = but_cancel
               FreeGadget win_save ;hier stürzt nun auch das Haupfenster win_main ab
            EndIf
         Case $803
            FreeGadget win_save ;hier stürzt nun auch das Haupfenster win_main ab
      End Select
   Until map_done = 1
   
   CloseFile map_file
End Function



Hier unten ist nochmal der vollständige Code, falls ihn jemand sehen will (und was vermutlich auch notwendig ist):
Code: [AUSKLAPPEN]
;Wildlands TMG - WildLands Tilemapgenerator v0.01
SeedRnd MilliSecs()   ;Ausgangswerte für Zufallsbefehle werden initialisiert

Global window_width, window_height, window_x, window_y, win_main
Global set_path$, tile_size, set_number, map_width, map_height ;Deklaration der Kartenvariablen
Global set_graphic, mouse_x, mouse_y, tile_active, tile_selected, selection_size, map_scroll_x, map_scroll_y
Global cue_counter = 0
   
window_width  = Int(ClientWidth(Desktop()) * 0.75 / 16) * 16
window_height = Int(ClientHeight(Desktop())* 0.75 / 16) * 16
window_x   = (ClientWidth(Desktop()) - window_width) / 2
window_y   = (ClientHeight(Desktop()) - window_height) / 2
win_main = CreateWindow("Wildlands TMG", window_x, window_y, window_width, window_height, Desktop(), 15)   ;Grafikfenster mit 3/4 der Bildschirmgröße
   
rt_menu_file    = CreateMenu("Datei", 10, WindowMenu(win_main))
menu_new       = CreateMenu("Neue Karte...", 11, rt_menu_file)
menu_line12    = CreateMenu("", 12, rt_menu_file)
menu_save       = CreateMenu("Speichern unter...", 13, rt_menu_file)
menu_load       = CreateMenu("Laden...", 14, rt_menu_file)
menu_line15    = CreateMenu("", 15, rt_menu_file)
menu_end       = CreateMenu("Beenden", 16, rt_menu_file)
UpdateWindowMenu(win_main)
   
Global can_x      = 16
Global can_y      = 16
Global can_width   = window_width - 4*16
Global can_height   = window_height - 7*16
Global can_mapedit   = CreateCanvas(16, 16, window_width-54, window_height-112, win_main, 65536)
SetBuffer CanvasBuffer(can_mapedit)
   
ConfigurateMap()
Dim map(200, 200)
Canvas()
   
Function Canvas()
   Repeat
      Cls
      
      DrawMap()
      DrawSelection()
      ScrollMap()
      SelectTileScroll()
      SelectTileMouse()
      PrintTileInfo()
      If MouseDown(1) Then DrawTile()
      If MouseDown(2) Then DeleteTile()
   
      If KeyDown(31) Then SaveMap()
      If KeyDown(38) Then LoadMap()
      If KeyDown(49)   
            For y = 0 To map_height
               For x = 0 To map_width
                  map(x,y) = 0
                Next
            Next   
            
            ConfigurateMap()
      EndIf
      If KeyHit(1)
         end_prog = Confirm("Soll das Programm beendet werden?", 0)
         If end_prog = 1 Then End
      EndIf
         
      Select WaitEvent()
         Case $803
            End
         Case $1001
            Select EventData()
               Case 11
                  ConfigurateMap()
               Case 13
                  SaveMap()
               Case 14
                  LoadMap()
               Case 16
                  end_prog = Confirm("Soll das Programm beendet werden?", 0)
                  If end_prog = 1 Then End
            End Select                  
      End Select

      FlipCanvas can_mapedit
   Forever
End Function

Function ConfigurateMap()
   cue_counter = cue_counter + 1
   
   win_width    = 24*16
   win_height   = 18*16
   win_config = CreateWindow ("Wildlands TMG - Einstellungen", window_x+16, window_y+16, win_width, win_height, win_main, 1)
   
   lbl_width   = 160
   lbl_height    = 16
   lbl_x      = 32
   lbl_y      = 32
      
   tf_width   = 160
   tf_height    = 20
   tf_x      = win_width - (tf_width + 32)
   tf_y      = 28
   
   but_x      = 64
   but_y      = 7*lbl_y
   but_width   = 96
   but_height   = 24
   
   lbl_set_path    = CreateLabel("Dateipfad des Tilesets: ", lbl_x, 1*lbl_y, 150, 16, win_config, 0)
   tf_set_path   = CreateTextField(tf_x, lbl_y - 4, tf_width - 32, tf_height, win_config, 0)
   but_set_path      = CreateButton("...", win_width - (tf_height + 32), lbl_y - 4, tf_height, tf_height, win_config, 1)
   SetGadgetText tf_set_path, "C:\Users\*\Documents\Programmieren\Blitz\TilemapGenerator"
      
   lbl_set_name      = CreateLabel("Name des Tilesets: ", lbl_x, 2*lbl_y, 150, 16, win_config, 0)
   tf_set_name         = CreateTextField(tf_x, 2*lbl_y - 4, tf_width, tf_height, win_config, 0)
   SetGadgetText tf_set_name, "tileset_ground.png"
      
   lbl_tile_size    = CreateLabel("Größe der einzelnen Tiles: ", lbl_x, 3*lbl_y, 150, 16, win_config, 0)
   tf_tile_size   = CreateTextField(tf_x, 3*lbl_y - 4, tf_width, tf_height, win_config, 0)
   SetGadgetText tf_tile_size, "16"
      
   lbl_tile_number = CreateLabel("Anzahl der Tiles im Set: ", lbl_x, 4*lbl_y, 150, 16, win_config, 0)
   tf_tile_number   = CreateTextField(tf_x, 4*lbl_y - 4, tf_width, tf_height, win_config, 0)
   SetGadgetText tf_tile_number, "15"
      
   lbl_map_width   = CreateLabel("Breite der Karte: ", lbl_x, 5*lbl_y, 150, 16, win_config, 0)
   tf_map_width   = CreateTextField(tf_x, 5*lbl_y - 4, tf_width, tf_height, win_config, 0)
   SetGadgetText tf_map_width, "20"
      
   lbl_map_height    = CreateLabel("Höhe der Karte: ", lbl_x, 6*lbl_y, 150, 16, win_config, 0)
   tf_map_height   = CreateTextField(tf_x, 6*lbl_y - 4, tf_width, tf_height, win_config, 0)
   SetGadgetText tf_map_height, "20"
      
   but_ok          = CreateButton("OK", lbl_x, but_y, but_width, but_height, win_config, 4)
   but_default   = CreateButton("Zurücksetzen...", (win_width / 2) - (but_width / 2), but_y, but_width, but_height, win_config, 4)
   but_cancel      = CreateButton("Abbrechen", win_width - (but_width + lbl_x), but_y, but_width, but_height, win_config, 5)
      
   Repeat
      Select WaitEvent()
         Case $401
            button = EventSource()
               
            If button = but_set_path
               selected_path$ = RequestDir("Dateipfad auswählen", "C:\Users\*\Documents\Programmieren\Blitz\TilemapGenerator")
               SetGadgetText tf_set_path, selected_path$
            ElseIf button = but_ok
               path$   = TextFieldText(tf_set_path)
               name$   = TextFieldText(tf_set_name)
                  
               set_path$ = path$ + "\" + name$
                  
               If LoadImage(set_path$) = 0
                  Confirm "Dateipfad konnte nicht gefunden werden!", 1
                  map_failed = 1
               EndIf
                  
               t_size$      = TextFieldText(tf_tile_size)
               s_number$   = TextFieldText(tf_tile_number)
               m_width$   = TextFieldText(tf_map_width)
               m_height$   = TextFieldText(tf_map_height)
                  
               tile_size    = Int(t_size$)
               set_number    = Int(s_number$)
               map_width    = Int(m_width$)
               map_height   = Int(m_height$)
                  
               If map_width > 200
                  SetGadgetText tf_map_width, "200"
                  map_width = 200
               EndIf
               If map_height > 200
                  SetGadgetText tf_map_height, "200"
                  map_height = 200
               EndIf
                                 
               If map_failed = 0
                  FreeGadget win_config
                  map_done = 1
                  CreateMap()
               EndIf
                  
               map_failed = 0
            ElseIf button = but_default
               SetGadgetText tf_set_path,       "C:\Users\*\Documents\Programmieren\Blitz\TilemapGenerator"
               SetGadgetText tf_set_name,       "tileset_ground.png"
               SetGadgetText tf_tile_size,    "16"
               SetGadgetText tf_map_width,    "20"
               SetGadgetText tf_map_height,   "20"
            ElseIf button = but_cancel
               If cue_counter = 1 Then End
               If cue_counter > 1 Then FreeGadget win_config
            EndIf
         Case $803
            If cue_counter = 1 Then End
            If cue_counter > 1 Then FreeGadget win_config
      End Select
   Until map_done = 1
End Function
   
Function CreateMap()   
   set_graphic   = LoadAnimImage(set_path$, tile_size, tile_size, 0, set_number)
   tile_active = 0
   tile_selected = 0
   selection_size = 3*tile_size
   
   map_scroll_x =  Int(((can_width / 2) - (map_width * tile_size) / 2) / tile_size) * tile_size
   map_scroll_y =  Int(((can_height / 2) - (map_width * tile_size) / 2) / tile_size) * tile_size
End Function
   
Function DrawMap()
   For y = 0 To map_height
      For x = 0 To map_width
         If y * tile_size + map_scroll_y < can_height - selection_size
            DrawBlock set_graphic, x * tile_size + map_scroll_x, y * tile_size + map_scroll_y, map(x,y)
         EndIf
      Next
   Next
End Function
   
Function DrawSelection()
   For i = 0 To set_number - 1
      DrawBlock set_graphic, tile_size + 2*i*tile_size, can_height + tile_size - selection_size, i
      
      If i = tile_selected
         Rect tile_size - 4 + 2*i*tile_size, can_height + tile_size - (selection_size + 4), tile_size + 8, tile_size + 8, 0
         Rect tile_size - 2 + 2*i*tile_size, can_height + tile_size - (selection_size + 2), tile_size + 4, tile_size + 4, 0
      EndIf
   Next
End Function

Function SelectTileScroll()
   mouse_scroll = MouseZSpeed()
   
   If mouse_scroll < 0 And tile_active < set_number - 1
      tile_active = tile_active + 1
      tile_selected = tile_selected + 1
   EndIf
   
   If mouse_scroll > 0 And tile_active > 0
      tile_active = tile_active - 1
      tile_selected = tile_selected - 1
   EndIf
End Function
   
Function SelectTileMouse()
   mouse_x = MouseX(can_mapedit)
   mouse_y = MouseY(can_mapedit)
      
   For i = 0 To set_number - 1
      If MouseDown(1) And mouse_x > tile_size + 2*i*tile_size And mouse_x < 2*tile_size + 2*i*tile_size
         If mouse_y > can_height + tile_size- selection_size And mouse_y < can_height + tile_size - (selection_size - tile_size)
            tile_active = i
            tile_selected = tile_active
         EndIf
      EndIf
   Next
End Function
   
Function PrintTileInfo()
   Text MouseX(can_mapedit) + 20, MouseY(can_mapedit) + 20, tile_active + 1
End Function
   
Function DrawTile()
   mouse_x = (MouseX(can_mapedit) - map_scroll_x) / tile_size
   mouse_y = (MouseY(can_mapedit) - map_scroll_y) / tile_size
   
   If mouse_x => 0 And mouse_x < map_width + 1 And mouse_y >= 0 And mouse_y < map_height + 1 Then map(mouse_x, mouse_y) = tile_active
End Function
   
Function DeleteTile()
   mouse_x = (MouseX(can_mapedit) - map_scroll_x) / tile_size
   mouse_y = (MouseY(can_mapedit) - map_scroll_y) / tile_size
      
   If mouse_x => 0 And mouse_x < map_width + 1 And mouse_y >= 0 And mouse_y < map_height + 1 Then map(mouse_x, mouse_y) = 0
End Function
   
Function ScrollMap()
   If KeyDown(200) And map_scroll_y < can_height - (selection_size + tile_size)   ;Oben
      map_scroll_y = map_scroll_y + tile_size
      Delay 10
   EndIf   
   If KeyDown(208) And map_scroll_y > 0 - map_height * tile_size      ;Unten
      map_scroll_y = map_scroll_y - tile_size
      Delay 10
   EndIf
   If KeyDown(203) And map_scroll_x < can_width          ;Links
      map_scroll_x = map_scroll_x + tile_size
      Delay 10
   EndIf
   If KeyDown(205) And map_scroll_x > 0 - map_width * tile_size      ;Rechts
      map_scroll_x = map_scroll_x - tile_size
      Delay 10
   EndIf
End Function
   
Function SaveMap()
   win_width    = 24*16
   win_height   = 10*16
   win_save = CreateWindow ("Wildlands TMG - Karte Speichern", window_x+16, window_y+16, win_width, win_height, win_main, 1)
   
   lbl_width   = 160
   lbl_height    = 16
   lbl_x      = 32
   lbl_y      = 32
   
   tf_width   = 160
   tf_height    = 20
   tf_x      = win_width - (tf_width + 32)
   tf_y      = 28
   
   but_x      = 64
   but_y      = 3*lbl_y
   but_width   = 96
   but_height   = 24
   
   lbl_spath    = CreateLabel("Dateipfad der Karte: ", lbl_x, 1*lbl_y, 150, 16, win_save, 0)
   tf_spath   = CreateTextField(tf_x, lbl_y - 4, tf_width - 32, tf_height, win_save, 0)
   but_spath   = CreateButton("...", win_width - (tf_height + 32), lbl_y - 4, tf_height, tf_height, win_save, 1)
   SetGadgetText tf_spath, "C:\Users\*\Documents\Programmieren\Blitz\TilemapGenerator"
   
   lbl_sname   = CreateLabel("Name der Karte: ", lbl_x, 2*lbl_y, 150, 16, win_save, 0)
   tf_sname   = CreateTextField(tf_x, 2*lbl_y - 4, tf_width - 48, tf_height, win_save, 0)
   lbl_sending   = CreateLabel(".map", tf_x + tf_width - 32, 2*lbl_y, 32, 16, win_save, 0)
   
   but_ok          = CreateButton("OK", but_x, but_y, but_width, but_height, win_save, 4)
   but_cancel      = CreateButton("Abbrechen", win_width - (but_width + but_x), but_y, but_width, but_height, win_save, 5)
   
   Repeat
      Select WaitEvent()
         Case $401
            button = EventSource()
            
            If button = but_path
               selected_path$ = RequestDir("Dateipfad auswählen", "C:\Users\*\Documents\Programmieren\Blitz\TilemapGenerator")
               SetGadgetText tf_spath, selected_path$
            ElseIf button = but_ok
               spath$   = TextFieldText(tf_spath)
               sname$   = TextFieldText(tf_sname)
               
               map_name$ = spath$ + "\" + sname$
                                             
               If map_failed = 0
                  map_file = WriteFile(map_name$ + ".map")
                  
                  WriteLine  map_file,   set_path$
                  WriteInt  map_file,      tile_size
                  WriteInt  map_file,      set_number
                  WriteInt  map_file,    map_width
                  WriteInt  map_file,    map_height
                  
                  WriteInt  map_file,      tile_active
                  WriteInt  map_file,      tile_selected

                  For x = 0 To map_width
                     For y = 0 To map_height
                        WriteInt  map_file, map(x,y)
                     Next
                  Next
                  
                  FreeGadget win_save
                  map_done = 1   
               EndIf
               
               map_failed = 0         
            ElseIf button = but_cancel
               FreeGadget win_save
            EndIf
         Case $803
            FreeGadget win_save
      End Select
   Until map_done = 1
   
   CloseFile map_file
End Function

Function LoadMap()
   win_width    = 24*16
   win_height   = 10*16
   win_load = CreateWindow ("Wildlands TMG - Karte Speichern", window_x+16, window_y+16, win_width, win_height, win_main, 1)
   
   lbl_width   = 160
   lbl_height    = 16
   lbl_x      = 32
   lbl_y      = 32
   
   tf_width   = 160
   tf_height    = 20
   tf_x      = win_width - (tf_width + 32)
   tf_y      = 28
   
   but_x      = 64
   but_y      = 3*lbl_y
   but_width   = 96
   but_height   = 24
   
   lbl_lpath    = CreateLabel("Dateipfad der Karte: ", lbl_x, 1*lbl_y, 150, 16, win_load, 0)
   tf_lpath   = CreateTextField(tf_x, lbl_y - 4, tf_width - 32, tf_height, win_load, 0)
   but_lpath   = CreateButton("...", win_width - (tf_height + 32), lbl_y - 4, tf_height, tf_height, win_load, 1)
   SetGadgetText tf_lpath, "C:\Users\*\Documents\Programmieren\Blitz\TilemapGenerator"
   
   lbl_lname   = CreateLabel("Name der Karte: ", lbl_x, 2*lbl_y, 150, 16, win_load, 0)
   tf_lname   = CreateTextField(tf_x, 2*lbl_y - 4, tf_width - 48, tf_height, win_load, 0)
   lbl_sending   = CreateLabel(".map", tf_x + tf_width - 32, 2*lbl_y, 32, 16, win_load, 0)
   
   but_ok       = CreateButton("OK", but_x, but_y, but_width, but_height, win_load, 4)
   but_cancel   = CreateButton("Abbrechen", win_width - (but_width + but_x), but_y, but_width, but_height, win_load, 5)
   
   Repeat
      Select WaitEvent()
         Case $401
            button = EventSource()
            
            If button = but_path
               selected_path$ = RequestDir("Dateipfad auswählen", "C:\Users\*\Documents\Programmieren\Blitz\TilemapGenerator")
               SetGadgetText tf_lpath, selected_path$
            ElseIf button = but_ok
               lpath$   = TextFieldText(tf_lpath)
               lname$   = TextFieldText(tf_lname)
               
               map_name$ = lpath$ + "\" + lname$
                                             
               If map_failed = 0
                  map_file = ReadFile(map_name$ + ".map")
                     
                  set_path$ = ReadLine (map_file)
                  tile_size = ReadInt (map_file)
                  set_number = ReadInt (map_file)
                  map_width = ReadInt (map_file)
                  map_height = ReadInt (map_file)
                  
                     tile_active = ReadInt (map_file)
                  tile_selected = ReadInt (map_file)

                  For x = 0 To map_width
                     For y = 0 To map_height
                        map(x,y) = ReadInt (map_file)
                     Next
                  Next
                  
                  FreeGadget win_load
                  CreateMap()
                  map_done = 1
               EndIf
               
               map_failed = 0         
            ElseIf button = but_cancel
               FreeGadget win_load
            EndIf
         Case $803
            FreeGadget win_load
      End Select
   Until map_done = 1
End Function


Am Anfang werden alle möglichen Variablen global deklariert, dann die Maße des Fensters errechnet (3/4 der Bildschirmgröße) und schließlich das Grafikfenster gesetzt. Dann werden Menüs definiert, und dann die Maße des Canvasfensters (ich habe 16x16 große Felder als Maßstab für alles genommen, Fenstergrößen, Textabstände etc.).

Mit ConfigurateMap() wird das Einstellungsfenster erstellt und die Mapdaten abgefragt. Mit Canvas() wird die Grafikschleife des Karteneditorcanvas erstellt, mit DrawMap() wird die Karte gezeichnet, mit DrawSelection() ein kleines Tileauswahlfenster unten auf der Canvasleinwand erstellt, mit ScrollMap() lässt sich die Karte durch die Pfeiltasten scrollen.

Mit SelectTileScroll() lässt sich der aktive Tile durch das Scrollrad auswählen (1. Problem!), mit PrintTileInfo wird der aktive Tile neben dem Cursor angezeigt. Dann folgen Tastenabfragen: bei linker Maustaste wird der aktive Tile bei Position des Mauszeigers gesetzt, bei rechter gelöscht.

Mit "S" wird die Karte gespeichert, mit "L" eine neue geladen. Mit "N" wird erst die Karte geleert (das ändere ich später noch) und dann wieder das Einstellungsfenster angezeigt. Darunter kommen etwas später die Menüabfragen, die dieselbe Funktion haben wie die Tastenkürzel.
  • Zuletzt bearbeitet von Bamboo am Mo, Apr 18, 2011 20:33, insgesamt 3-mal bearbeitet

Xaymar

ehemals "Cgamer"

BeitragDo, Apr 14, 2011 22:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Select WaitEvent()

Fix #1: Select PeekEvent()
oder Fix #2: CreateTimer

Durch den rest des Textes steig ich nicht durch, zu viel einer Wand, zu wenig strukturiert.
Warbseite
 

Bamboo

BeitragDo, Apr 14, 2011 22:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Gut, wartet bitte, ich versuch das alles noch mal zu kürzen und nur das wichtigste zu lassen.

Edit: Also du meinst, dass mit dem Scrollen liegt an Delay? Ich weiß, man soll es ja grundsätzlich nicht nehmen, aber auch wenn man es auslässt ist es so. Oder meinst du das als genereller Fix?

Xaymar

ehemals "Cgamer"

BeitragDo, Apr 14, 2011 22:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Delay ist so oder so schlimm.
WaitEvent wartet auf ein Event im Fenster. Ein tastendruck generiert WM_KEY_DOWN und das loslassen WM_KEY_UP. Manchmal generiert windows selbst ein WM_UPDATE und WM_DRAW event, was aber nicht ausreicht.
Also musst du dir selber aushelfen. Entweder mit Timer und WaitEvent(Timer generieren einen Timer Event) oder PeekEvent, wodurch dein Programm die volle CPU ungebremst ziehen würde.
Warbseite
 

Bamboo

BeitragDo, Apr 14, 2011 23:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Delay ist so oder so schlimm.


Ja, ich weiß ja schon, aber daran liegt das Problem nicht; zumindest habe ich es rausgenommen und ich hatte denselben Fehler.

Ich habe jetzt auch versucht, den oberen Code übersichtlicher zu gestalten. Und mir war schon klar, dass man nicht sofort das Programm versteht und den Fehler erkennt, aber das habe ich ja auch nicht verlangt.

Beziehen sich deine Tipps jetzt direkt auf die Fehler oder würdest du mir "nur" generell dazu raten?

Xaymar

ehemals "Cgamer"

BeitragDo, Apr 14, 2011 23:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Fixes beziehen sich auf das "Maus bewegen->Kein scrolllag, maus nicht bewegen->scroll lag"
Warbseite

ToeB

BeitragDo, Apr 14, 2011 23:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich finde z.B. WaitEvent( 16 ) ziemlich gut, da sowohl ein "Timer" (Delay) drin ist als auch die komplette Event-Abfrage (PeekEvent übergibt keine Parameter an EventSource etc.


mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Xaymar

ehemals "Cgamer"

BeitragFr, Apr 15, 2011 13:53
Antworten mit Zitat
Benutzer-Profile anzeigen
stimmt ToeB, da war ich schon zu weit auf dem API Level wo PeekEvent nur das Event holt aber nicht löscht.
WaitEvent(16) ist auch eine 'naja' Alternative. Diese 16msec sind nur das maximale das er warten soll, nicht erzwungen. D.H. wenn jemand die Maus bewegt geht es wieder schneller(Zwar nicht so extrem schneller aber doch schneller).

Das beste wäre zwar eine ausstrukturierung von Event-Schleife und Main-Schleife, wobei die Event-Schleife nur läuft wenn PeekEvent ein Event zurückliefert und du dieses dann per WaitEvent(1) abfangst.
Warbseite
 

Bamboo

BeitragFr, Apr 15, 2011 18:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Das klingt ja schon mal gut, danke! Ich werde es gleich ausprobieren!

EDIT: Danke, das hat schonmal funktioniert. Aber wie stehts mit den anderen Problemen, insbesondere 3. (also das Abstürzen des Programms beim Schließen von Nebenfenstern?

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group