FlipBuffers - Alternative?

Anfängerfragen zum Programmieren mit PureBasic.
Tombi
Beiträge: 369
Registriert: 05.03.2008 22:05

FlipBuffers - Alternative?

Beitrag von Tombi »

Code:

Code: Alles auswählen

;**************************************** 
;*** Start.pb 
;*** 
;*** Starte das Malprogramm...
;*** ^^^^^^
;*** 
;*** by Tombi, March.7th,2008 
;*** PB Ver 3.30 Win 
;**************************************** 

;Includes
IncludeFile "init.pb"
IncludeFile "options.pb"
IncludeFile "procedure.pb"

;Fenster öffnen
OpenWindow(0,pX,pY,wX,wY,#PB_Window_MinimizeGadget,"Malen")
OpenWindowedScreen(WindowID(0), 0, 0, wX, wY, 0, 0, 0)



Repeat 
  
  While WindowEvent() : Wend 
  
  FlipBuffers()
   
  ExamineKeyboard()  
  
  MLC = GetAsyncKeyState_(#VK_LBUTTON) 
  MRC = GetAsyncKeyState_(#VK_RBUTTON) 
    
  If MLC
    
    ;Die alten Mouse-Kooardinaten speichern
    OldMouseX = MouseX
    OldMouseY = MouseY
    
    MouseX = WindowMouseX()
    MouseY = WindowMouseY()
    
    ;Wenn die Mouse-Koordinaten nicht die gleichen sind, ins Debug-Fenster schreiben.
    If Not(MouseX, OldMouseX) Or Not(MouseY, OldMouseY)
    Debug Str(MouseX) + "|" + Str(MouseY)
    EndIf
    
    StartDrawing(ScreenOutput()) 
    FrontColor(255,255,255) 
    Plot(MouseX-3,MouseY-22) 
    StopDrawing()
  EndIf
  
  Delay(1) 

Until KeyboardPushed(#PB_Key_Escape)
Init.pb -> InitSprite und so...
Options.pb -> pX,pY,wX,wY sind dort vorhanden (Inhalt selbsterklärend)

Procedure.pb hier:

Code: Alles auswählen

Procedure Not(x.w,y.w)
If x.w = y.w
ProcedureReturn 0
Else
ProcedureReturn 1
EndIf

EndProcedure
Ja ich weiß, wegen so wenig Code ist ein Include nicht so dringend, aber ich finde es einfach übersichtlicher und schöner.


Mein Problem nun aber:
Wenn man die Maus längere Zeit gedrückt hällt, so wir nur "jeder 2. Punkt" gemalt. Dies liegt wohl am FlipBuffers()-Befehl. Wie kann man das umgehen?
Bild Bild Bild
Intel Pentium 4 630 (3 GHZ)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

du musst die punkte "mitschreiben" und in jedem Fame alle punkte neu malen nach nem ClearScreen.

...woran du siehst, dass es nicht unbedingt die geschickteste lösung ist.
probier mal, auf ein Image zu malen, wenn du ein malprogramm machen willst.

btw
in diesem fall ist der code nicht nötig, um dein problem nachzuvollziehen,
aber wenn das der fall sein sollte, dann poste vollständigen, lauffähigen code.
also am besten kopierst du dann die includes in den hauptcode, damit man das testen kann.
wenn du hilfe möchtest, und die kollegen deinen code laufen lassen sollen,
dann muss das mit einem einzigen copy/paste zu bewerkstelligen sein,
sonst macht sich kaum jemand die mühe.
Zuletzt geändert von Kaeru Gaman am 07.03.2008 22:21, insgesamt 2-mal geändert.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

ich denke mal das ein Plot nicht ausreicht:

Mach mal das :

Code: Alles auswählen

StartDrawing(ScreenOutput()) 
    FrontColor(255,255,255) 
    LineXY(OldMouseX-3, OldMouseY-22,MouseX-3,MouseY-22) 
    StopDrawing()
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Tombi
Beiträge: 369
Registriert: 05.03.2008 22:05

Beitrag von Tombi »

Jeden Punkt speichern und neu zeichnen? Wäre eine Idee, aber geht das nicht einfacher?

@Stargate: Danke :) - Jedoch wird wenn man an eine bestimmte Position einmal kurz drückt gleich ein Strich dahin geführt, was ich jedoch (noch) nicht damit bewirken wollte.

Das einmal-kurz drücken könnte man ja unterbinden, aber wie prüfe ich ob gedrückt gehalten wird oder nur kurz gedürckt wird?

Da ich keinen passenden Befehl gefunden habe vielleicht so in der Art:

Wenn linker Mausklick
->100/1000 Millisekunden warten
-> Prüfen ob Maus (noch/wieder) gedrückt ist

-> Befehl ausführen

-> ansonsten ...
Bild Bild Bild
Intel Pentium 4 630 (3 GHZ)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

Nein du überprüfst einfach ob die Maus gedrück wird ganz normal und lasst, wenn es so ist, eine Laufvariable laufen.

wird die Maus dann losgelassen wird diese wieder auf 0 gesetzt:

Code: Alles auswählen

If MLC 
 MausDown + 1
Else
 MausDown = 0
EndIf
wenn nun MausDown irgendwann 1 wird, weißt du das di Maus gerade "angefangen" wurde zu Drücken, sodass du also noch KEINE Linie Ziehen darfst, weil ja OldMouse noch von der alten Position ist.

Zeichnen tust du also nur bei :

Code: Alles auswählen

If MausDown > 1
 ; ...
EndIf
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

Tombi hat geschrieben:Jeden Punkt speichern und neu zeichnen? Wäre eine Idee, aber geht das nicht einfacher?
nicht mit einem dublebuffer-screen, denn da musst du die punkte in beide buffer bringen.
der ist dafür gemacht, dass sich vieles ständig ändert, also grundsätzlich für games.

ein zeichenbereich hingegen hat normalerweise keinen doublebuffer,
sondern nur eine zeichenebene, die ständig angezeigt wird.
für sowas bietet sich wie gesagt ein Image in einem Imagegadget an,
bzw. es gab da auch irgendwelche spezielleren teile, die wie die zeichenfläche in PAINT sind,
die sind allerdings nicht bestandteil des PB-standardumfangs.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

Tombi hat geschrieben:Jeden Punkt speichern und neu zeichnen? Wäre eine Idee, aber geht das nicht einfacher?
Bevor wir nicht genau wissen, was du mit diesem Punkten vor hast ...
können wir dir da leider nicht direkt weiter helfen.

Hm, da steht was von "malprogramm" ... wenn das so was wie Paint
werden soll, also ganz einfach auf Pixelebene ... könnteste auch ein
Sprite erstellen in der größe des Screens und darauf dann die Punkte
malen.

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Antworten