ScreenDrawing

Anfängerfragen zum Programmieren mit PureBasic.
pede
Beiträge: 90
Registriert: 08.07.2007 20:37
Wohnort: brixen / Italien

ScreenDrawing

Beitrag von pede »

Hallo

Ich möchte mich jetzt ein bisschen mit Screens beschäftigen.
Dazu hab ich mir gedacht ich schreib mal ein einfaches Programm, das einfach bei jedem "a" Tastendruck zufällig irgendwo auf dem Screen ein a hinschreibt...

Hier mein Code

Code: Alles auswählen

InitSprite()
InitKeyboard()

OpenScreen(800, 600, 32, "Screen")
ClearScreen(RGB(0,0,0))

Repeat
ExamineKeyboard()

If StartDrawing(ScreenOutput())
    DrawText(0,0, "Esc zum Beenden drücken")
    StopDrawing()
EndIf



If KeyboardPushed(#PB_Key_Escape)
    CloseScreen()
    End
EndIf

If KeyboardPushed(#PB_Key_A)
    StartDrawing(ScreenOutput())
    DrawText(Random(800), Random(600),"a")
    StopDrawing()
EndIf
FlipBuffers()
      
ForEver 
Aber es klappt nicht, soll heißen, es werden bei jedem a-Druck viele a hingezeichnet
außerdem flackert der Screen...

Wo liegt mein Fehler?

mfg
"oh... ein Sarkasmus-Detektor... ein wirklich nützliches Gerät" .. dit.. dit.. ditditdit.. *bumm*
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Beitrag von Bisonte »

Das wird daran liegen, das es einfach zu schnell ist...

Du drückst auf "a" und wenn du sie wieder losläßt ist die schleife aber schon ein paarmal durchgelaufen.... (oder auch ein paarmal mehr ;) )

bau eine verzögerung ein und es werden weniger buchstaben gemalt ;)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

1. KeyboardPushed liefert bei jeder abfrage ein ergebnis, solange die taste gedrückt wurde.
wenn du nur eine einzige reaktion willst, musst du mit nem Flag arbeiten,
mit einer variable, die registriert, ob es der erste druck auf die taste war.

2. du zeichnest dein a immer nur auf einen buffer, du merkst dir nicht die position,
damit du es erneut zeichnen könntest.
da du keinen der beiden Buffer clearst (ClearScreen),
erscheint jedes der vorher gezeichneten As bei jedem zweiten durchlauf,
nämlich wenn der buffer angezeigt wird, auf den es gezeichnet wurde.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Vermilion
Beiträge: 1846
Registriert: 08.04.2006 16:00
Computerausstattung: Apple iMac (2010) & HP Notebook
Wohnort: Heidekreis

Beitrag von Vermilion »

Warum benutzt du nicht "KeyboardReleased()"? :freak:
Bild

Immer die neueste PureBasic Version. Auf allem Betriebssystemen. Ich bin ein OS-Nomad!
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

schlechter tip.
tasten sollen reagieren wenn man sie drückt, nicht wenn man sie losläßt. :freak:

aber zuerst muss er mal das double-buffering checken, warum es bei ihm "flackert",
dann kann er sich um Flags bemühen.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
pede
Beiträge: 90
Registriert: 08.07.2007 20:37
Wohnort: brixen / Italien

Beitrag von pede »

Code: Alles auswählen

InitSprite()
InitKeyboard()

Dim x(1000)
Dim y(1000)

anzahl_a = 0

OpenScreen(800, 600, 32, "Screen")


Repeat
ExamineKeyboard()

If StartDrawing(ScreenOutput())
    DrawText(0,0, "Esc zum Beenden drücken")
    StopDrawing()
EndIf



If KeyboardPushed(#PB_Key_Escape)
    CloseScreen()
    End
EndIf

If KeyboardPushed(#PB_Key_A)
    anzahl_a=anzahl_a+1
    ClearScreen(RGB(0,0,0))

    
    StartDrawing(ScreenOutput())
    x(anzahl_a) = Random(800)
    y(anzahl_a) = Random(600)
    
    For n=0 To anzahl_a-1
        DrawText(x(n),y(n) ,"a")
    Next n
    
    
    StopDrawing()
    Delay(100)
    FlipBuffers()
EndIf

      
ForEver 
so hab ich das nun gelöst!
funktioniert eig. ganz toll.

Wenn ich dann aber mal was kompizierteres programmier, soll heißen, viele Sprites ect., muss ich dann immer die ganzen Koordinaten abgespeichert haben, den Screen clearen, alles neu zeichnen und dann die Buffer flippen, oder geht das EINFACHER?
"oh... ein Sarkasmus-Detektor... ein wirklich nützliches Gerät" .. dit.. dit.. ditditdit.. *bumm*
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> muss ich dann immer die ganzen Koordinaten abgespeichert haben, den Screen clearen, alles neu zeichnen und dann die Buffer flippen
yup

> oder geht das EINFACHER
nuja, du könntest einen teil der sich nicht verändert, vorab auf ein größeres Sprite displayn, und dann nur das anzeigen.

> so hab ich das nun gelöst!
nuja... richtig "gelöst" ist das eigentlich nicht.
du displayst und flips hier ja nur als reaktion auf einen tastendruck.

der Screenmode dient ja dazu, dass man permanend wechselnde bilder erzeugen kann,
basierend auf mehreren von einander unabhängigen objekten.
die ganze screen-maschinerie ist drauf ausgelegt, die sprite geschichten möglichst schnell zu erledigen,
eben damit man hunderte und tausende darstellen kann, ohne dass es zur diashow verkommt.

wenn du anfangen willst, dich mit screen zu beschäftigen, dann stell dich von anfang an drauf ein,
bei jedem schleifendurchlauf zu beginn den screen zu clearen und am ende die buffer zu flippen.
nach und nach wirst du dann auch dahintersteigen, wo die vorteile liegen.

nimm dir halt mal sprites und nix gedrawtes...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

sorry für doppelpost

ich hab dein beispiel mal für permanentes flipping umgeschrieben, und das tastendruck-flag hinzugefügt.

Code: Alles auswählen

InitSprite()
InitKeyboard()

Dim x(1000)
Dim y(1000)
anzahl_a = -1 ; weil wir die 0 mitzählen, müssen wir bei -1 für "kein" anfangen

pushed_a = 0  ; dies ist das tasten-flag

OpenScreen(800, 600, 32, "Screen")

Repeat
    ExamineKeyboard()
    ClearScreen($000000)

    If KeyboardPushed(#PB_Key_Escape)
        EXIT = 1
    EndIf

    If KeyboardPushed(#PB_Key_A)
        If pushed_a = 0 
            pushed_a = 1
            anzahl_a=anzahl_a+1
            If anzahl_a > 1000 : anzahl_a = 0 : EndIf
            x(anzahl_a) = Random(800)
            y(anzahl_a) = Random(600)
        EndIf
    Else
        pushed_a = 0
    EndIf

    StartDrawing(ScreenOutput())
        DrawText(0,0, "Esc zum Beenden drücken")
        For n=0 To anzahl_a
            DrawText(x(n),y(n) ,"a")
        Next n
    StopDrawing()

    FlipBuffers()
     
Until EXIT = 1
Zuletzt geändert von Kaeru Gaman am 12.09.2007 21:51, insgesamt 1-mal geändert.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Fehlt nur noch das 'If', das abfängt, dass der Array-Index über 1000 steigt. :wink:
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

:lol: darn, ja (edit)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten