Seite 1 von 2

ScreenDrawing

Verfasst: 12.09.2007 16:56
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

Verfasst: 12.09.2007 17:00
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 ;)

Verfasst: 12.09.2007 17:01
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.

Verfasst: 12.09.2007 20:02
von Vermilion
Warum benutzt du nicht "KeyboardReleased()"? :freak:

Verfasst: 12.09.2007 20:42
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.

Verfasst: 12.09.2007 20:59
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?

Verfasst: 12.09.2007 21:07
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...

Verfasst: 12.09.2007 21:25
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

Verfasst: 12.09.2007 21:33
von NicTheQuick
Fehlt nur noch das 'If', das abfängt, dass der Array-Index über 1000 steigt. :wink:

Verfasst: 12.09.2007 21:50
von Kaeru Gaman
:lol: darn, ja (edit)