 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
qbay
Anmeldungsdatum: 08.06.2008 Beiträge: 84
|
Verfasst am: 26.03.2011, 17:15 Titel: MINI PAINT |
|
|
hey Leute wie gehts?
also ich versuche ein kleines MS PAINT ähnliches Programm zu schreiben
aber da gibs noch einpaar schwierigkeiten
also erstens Löschen sich die Zeichnungen immer selbst
zweitens funktioniert der Kreis-Befehl nicht richtig, also nur in eine richtung
mit dem Programm kann man Linien, Vierecke bzw. Rechtecke und Kreise zeichnen durch das drücken von a , b oder der c-taste und durch erneutes drücken bestätigt man die Grafik.
Schauts euch am besten an und sagt mir was ihr davon haltet
Code: |
DIM SHARED AS INTEGER work_page, x, y, xstart, ystart, Radius
DIM SHARED AS STRING Auswahl
DECLARE SUB Linie
DECLARE SUB Viereck
DECLARE SUB Kreis
'Bildschirmmodus 640x480x8 mit zwei Seiten initialisieren
SCREEN 18, ,2
COLOR 2, 15
work_page = 0
x = 320
y = 240
DO
SLEEP 1
' Eine Seite beschreiben, während die andere angezeigt wird
SCREENSET work_page, work_page XOR 1
' Überprüfe die Pfeiltasten und aktualisiere die Koordinaten
' x, y entsprechend.
xstart = x
ystart = y
Auswahl = INKEY$
SELECT CASE Auswahl
CASE CHR(97)
Linie
CASE CHR(98)
Viereck
CASE CHR(99)
Kreis
END SELECT
IF MULTIKEY(&h4D) AND x < 639 THEN x += 1
IF MULTIKEY(&h4B) AND x > 0 THEN x -= 1
IF MULTIKEY(&h50) AND y < 479 THEN y += 1
IF MULTIKEY(&h48) AND y > 0 THEN y -= 1
CLS
CIRCLE(x, y), 10, , , , ,F
PRINT "Koordinaten : " & " x : " & x & " y : " & y
' Seite wechseln
work_page = work_page XOR 1
LOOP UNTIL INKEY = CHR(27)
' Bis ESC gedrückt wird weitermachen
' Setze aktive und sichtbare Bildschirmseite wieder auf 0
SCREENSET
PRINT "Beliebige Taste zum Beenden druecken."
GETKEY
SUB Linie
DO
SLEEP 1
SCREENSET work_page, work_page XOR 1
IF MULTIKEY(&h4D) AND x < 639 THEN x += 1
IF MULTIKEY(&h4B) AND x > 0 THEN x -= 1
IF MULTIKEY(&h50) AND y < 479 THEN y += 1
IF MULTIKEY(&h48) AND y > 0 THEN y -= 1
CLS
CIRCLE(x, y), 10, , , , ,F
LINE (xstart, ystart)-(x, y), 0
PRINT "Koordinaten : " & " x1: " & xstart & " y1: " & ystart & " x2: " & x & " y2: " & y
' Seite wechseln
work_page = work_page XOR 1
LOOP UNTIL INKEY = CHR(97)
END SUB
SUB Viereck
DO
SLEEP 1
SCREENSET work_page, work_page XOR 1
IF MULTIKEY(&h4D) AND x < 639 THEN x += 1
IF MULTIKEY(&h4B) AND x > 0 THEN x -= 1
IF MULTIKEY(&h50) AND y < 479 THEN y += 1
IF MULTIKEY(&h48) AND y > 0 THEN y -= 1
CLS
CIRCLE(x, y), 10, , , , ,F
LINE (xstart, ystart)-(x, y), 0, B
PRINT "Koordinaten : " & " x1: " & xstart & " y1: " & ystart & " x2: " & x & " y2: " & y
' Seite wechseln
work_page = work_page XOR 1
LOOP UNTIL INKEY = CHR(98)
END SUB
SUB Kreis
DO
SLEEP 1
SCREENSET work_page, work_page XOR 1
IF MULTIKEY(&h4D) AND x < 639 THEN x += 1
IF MULTIKEY(&h4B) AND x > 0 THEN x -= 1
IF MULTIKEY(&h50) AND y < 479 THEN y += 1
IF MULTIKEY(&h48) AND y > 0 THEN y -= 1
CLS
CIRCLE(x, y), 10, , , , ,F
Radius = xstart - x
Radius = Radius * (-1)
CIRCLE (xstart, ystart), Radius, 0 ' Zeichnet einen Kreis
PRINT "Koordinaten : " & " x1: " & xstart & " y1: " & ystart & " Radius: " & Radius
' Seite wechseln
work_page = work_page XOR 1
LOOP UNTIL INKEY = CHR(99)
END SUB
|
|
|
Nach oben |
|
 |
XOR
Anmeldungsdatum: 23.07.2010 Beiträge: 161
|
Verfasst am: 26.03.2011, 18:49 Titel: |
|
|
Zum problem mit dem kreis,
hast du noch nie was vom Pytagoras gehoert?
Nach bestaetigen der Form verschwindet sie.
Mit ESC konnte ich nicht beenden.
Eventuel Maus benutzen.
Ich hatte gerade langeweile und habe dein programm mal nen bissle veraendert
Code: | #Define FALSE &H00
#Define TRUE Not FALSE
Const Weite = 800
Const Hohe = 600
Const FullScreen = FALSE
Const BACK_R = 255
Const BACK_G = 255
Const BACK_B = 255
Const FRONT_R = 255
Const FRONT_G = 0
Const FRONT_B = 0
#Define DRAW_QUADS &H01
#Define DRAW_LINES &H02
#Define DRAW_CIRCLE &H03
Dim As Any Ptr Vorschau, ScreenP
Dim Flag As UInteger
Dim As Byte AP,BP,CP
Dim As Integer X,Y,B,XA,YA,BA
Dim As Integer SX,SY
ScreenRes Weite, Hohe, 32, ,IIf(FullScreen,1,0)
Line (0,0)-(Weite,Hohe),RGBA(BACK_R,BACK_G,BACK_B,255),bf
Vorschau = ImageCreate(Weite,Hohe,RGBA(255,0,255,2550),32) ''<- Objekt, das gerade gezeichnet wird
ScreenP = ImageCreate(Weite,Hohe,RGBA(BACK_R,BACK_G,BACK_B,255),32) ''<- Screen
Do
Sleep 1, 1 ''<- um den Prozessor nicht zu stark zu belasten
If MultiKey(30) And Not(AP) Then ''<- wenn taste "A" getrueckt wird
If Flag = DRAW_QUADS Then ''<- wenn gerade Quads aktivirt sind
Flag = FALSE ''<- dann werden sie ausgeschaltet
Else
Flag = DRAW_QUADS ''<- ansonnsten an
EndIf
AP = TRUE
EndIf
If Not(MultiKey(30)) And AP Then AP = FALSE ''<- Wenn die Taste wieder lossgelassen wird
If MultiKey(48) And Not(BP) Then ''<- das gleiche fuer "B"
If Flag = DRAW_LINES Then
Flag = FALSE
Else
Flag = DRAW_LINES
EndIf
BP = TRUE
EndIf
If Not(MultiKey(48)) And BP Then BP = FALSE ''<- und "C"
If MultiKey(46) And Not(CP) Then
If Flag = DRAW_CIRCLE Then
Flag = FALSE
Else
Flag = DRAW_CIRCLE
EndIf
CP = TRUE
EndIf
If Not(MultiKey(46)) And CP Then CP = FALSE
XA = X
YA = Y
BA = B
GetMouse X,Y,,B ''<- MausPosition
If B = 1 And BA = 0 Then ''<- Wenn Maus von nichtgedrueckt auf gedrueckt springt
SX = X ''<- startposition festlegen
SY = Y
EndIf
If B = 1 Then ''<- Wenn maus gedruekt wurde
If XA <> X Or YA <>Y Then ''<- und sich die Maus Position veraendert hat
Line Vorschau,(0,0)-(Weite,Hohe),RGBA(255,0,255,0),bf ''<- Obj. bild reinigen
Select Case Flag ''<- und zeichnen
Case DRAW_QUADS
Line Vorschau,(SX,SY)-(X,Y),RGB(FRONT_R,FRONT_G,FRONT_B),b
Case DRAW_LINES
Line Vorschau,(SX,SY)-(X,Y),RGB(FRONT_R,FRONT_G,FRONT_B)
Case DRAW_CIRCLE
Circle Vorschau,(SX,SY),((SX-X)^2+(SY-Y)^2)^0.5,RGB(FRONT_R,FRONT_G,FRONT_B) ''<- um den richtigen radius zu haben, wird der Pytagoras benutzt
End Select
Put(0,0),ScreenP,PSet ''<- screen bild
Put(0,0),Vorschau,TRANS ''<- objekt bild
EndIf
EndIf
If B = 0 And BA = 1 Then ''<- wenn maustaste losgelassen wird
Put ScreenP,(0,0),Vorschau,Trans ''<- objekt endgueltig zeichnen
Line Vorschau,(0,0)-(Weite,Hohe),RGBA(255,0,255,0),bf
EndIf
Loop Until MultiKey(1) Or InKey = Chr(255)+"k" ''<- beenden mit ESC oder X-Button
ImageDestroy(Vorschau)
ImageDestroy(ScreenP)
End
|
Zuletzt bearbeitet von XOR am 26.03.2011, 19:47, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
|
Nach oben |
|
 |
XOR
Anmeldungsdatum: 23.07.2010 Beiträge: 161
|
Verfasst am: 26.03.2011, 19:50 Titel: |
|
|
Habe es Oben eingebaut.
Zitat: | sonst "breakst" du beim ersten tastendruck nämlich das sleep 1 für immer weg. |
Ich wusste nicht das es bei einem tastendruck auch jedes weitere sleep "gebreakt" wird |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 26.03.2011, 20:04 Titel: |
|
|
Die Quelldatei sagt so ziemlich gar nix über die Funktionsweise von Sleep aus. Was ist der Unterschied zwischen fb_Delay und fb_Sleep? Wo wird der Parameter "kind" wie verwendet?
Zitat: | Ich wusste nicht das es bei einem tastendruck auch jedes weitere sleep "gebreakt" wird | Wird's auch nicht. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
qbay
Anmeldungsdatum: 08.06.2008 Beiträge: 84
|
Verfasst am: 26.03.2011, 21:16 Titel: |
|
|
hey danke leute
also erstmal XOR dein Beispiel funktioniert wirklich gut
ich weis das ist nervig aber kannst du dein beispiel noch etwas erläutern
vorallem :
Zitat: |
#Define FALSE &H00
#Define TRUE Not FALSE
|
is mir noch ein Rätsel
Makros im allgemeinen versteh ich nich  |
|
Nach oben |
|
 |
XOR
Anmeldungsdatum: 23.07.2010 Beiträge: 161
|
Verfasst am: 26.03.2011, 21:39 Titel: |
|
|
das
bedeutet, das alle "FALSE" - worte im Ptogramm durch "&H00" also "0" ersetzt werden.
bei
Code: | #Define TRUE Not FALSE |
werden alle "TRUE"s durch "Not FALSE" ersetzt, hier dann noch das "FALSE" durch "0".
Im Code der dann Compilirt wird steht dann also fuer FALSE -> &H00 und fuer TRUE -> Not &H00
beschreibund von define hier |
|
Nach oben |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 26.03.2011, 23:26 Titel: |
|
|
Um das mit dem Sleep mal zu klären:
Der Sleep-Befehl ist recht stark verteilt auf die verschiedenen Dateien des Codes.
Es gibt zunächst einmal drei verschiedene Varianten. Das normale Sleep, das Sleep in -lang qb und das Sleep mit zweitem Parameter.
Das QB-Sleep (fb_SleepQB) gibt eigentlich nur weiter an das normale Sleep (fb_Sleep), nur das aus Millisekunden normale Sekunden werden.
Das Sleep mit zweitem Parameter (fb_SleepEx) prüft diesen Parameter und ruft bei 0 das normale Sleep auf und bei 1 fb_Delay.
Beim normalen Sleep (fb_Sleep) wird geprüft, ob der Grafikbildschirm geöffnet ist.
Falls ja, geht das ganze an die gfxlib weiter, die ihr eigenes Sleep hat (fb_GfxSleep).
Hier wird dann auch das gemacht, was in der Referenz steht, nämlich alles unter 100ms ignoriert.
Danach wird dann fb_Delay aufgerufen.
Alternativ wird fb_ConsoleSleep aufgerufen und auch hier wird die Prüfung auf die 100ms gemacht.
Es folgt wieder fb_Delay.
Die Trennung ist wegen der Tastenerkennung nötig, da Console und GFX verschiedene Eingabepuffer haben.
fb_Delay ruft schließlich das Sleep des Systems auf, welches sich aus den verschiedenen Includes ergibt.
Folglich stimmen alle Angaben der Referenz. |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 27.03.2011, 14:22 Titel: |
|
|
ThePuppetMaster hat Folgendes geschrieben: | in beiden sources findet sich kein einzigster punkt, der darauf hinweist, das eine veränderung der sleepzeiten eintritt. | Hö? Hat auch niemand behauptet. Aber wenn du dir das gfxlib-Sleep anschaust, siehst du, dass bei Verzögerungen unter 100msec das Pollen der Tastatur wegfällt. Bei Verzögerungen ab 100msec dagegen wird Sleep abgebrochen, sobald sich der Zustand des Tastaturpuffers geändert hat, also sobald eine Taste gedrückt wurde. Je nachdem, ob "kind" 0 oder 1 ist, wird fb_GfxSleep (bzw auf der Konsole das Äquivalent) oder direkt fbDelay aufgerufen. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
qbay
Anmeldungsdatum: 08.06.2008 Beiträge: 84
|
Verfasst am: 27.03.2011, 15:19 Titel: |
|
|
XOR hat Folgendes geschrieben: | das
bedeutet, das alle "FALSE" - worte im Ptogramm durch "&H00" also "0" ersetzt werden.
bei
Code: | #Define TRUE Not FALSE |
werden alle "TRUE"s durch "Not FALSE" ersetzt, hier dann noch das "FALSE" durch "0".
Im Code der dann Compilirt wird steht dann also fuer FALSE -> &H00 und fuer TRUE -> Not &H00
beschreibund von define hier |
Damit ich das richtig verstehe
jede Ausgabe des Programmes, wie z.B. wenn der Mauszeiger über dem SCREEN ist, wird als FALSE angegeben?
und das wird ersetzt durch &H00, Richtig? |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4700 Wohnort: ~/
|
Verfasst am: 27.03.2011, 15:31 Titel: |
|
|
FALSE wird hier lediglich als Äquivalent zu 0 (=&h00) festgelegt. Z. B. ergibt
die Ausgabe 0, eben weil der Ausdruck falsch ist. Mit dem #DEFINE kannst du jetzt den Ausdruck FALSE ebenfalls verwenden:
Code: | DIM ausdruck AS INTEGER
ausdruck = (1 = 2) ' eindeutig ein falscher Ausdruck
PRINT ausdruck ' Ergebnis: 0
IF ausdruck = 0 THEN PRINT "Fehler" ' geht immer
#DEFINE FALSE &h00
IF ausdruck = FALSE THEN PRINT "Fehler" ' geht erst nach dem #DEFINE |
Die FALSE-Methode ist halt in der Regel leichter lesbar (obwohl ich mit =0 auch noch nie Probleme hatte) _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
qbay
Anmeldungsdatum: 08.06.2008 Beiträge: 84
|
Verfasst am: 27.03.2011, 15:59 Titel: |
|
|
@nemored
ehrlichgesagt verstehe ich es nich
wenn in deinem Beispiel die Variabel ausdruck immer "0" ergibt
wozu brauch ich überhaupt #DEFINE FALSE &h00 ??
tut mir leid aber was das angeht bin ich echt Begriffsstutzig  |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 27.03.2011, 16:09 Titel: |
|
|
es ist nur eine vereinfachung zum lesen und scheiben des quellcodes. Etwas, das mehr für den menschlichen part sinvoller ist, als für die maschine.
Wenn man den Quellcode liest, dann sieht man das wort "false" (Englisch für "Falsch" oder "nicht erfüllt") was leichter zu verstehen ist als eine 0.
In manchen zusammenhängen kann 0 auch für andere dinge stehen. Daher kann man hier eine differenzierung treffen.
z.B. gibt ein API aufruf eine 0 zurück. nutzt man hier das wort false, kann man es verständlicher lesen als eine 0.
0 könnte in anderen fällen z.B. auch bedeuten, das alles ok war. oder hat eine ganz andere bedeutung. daher legt man eine definition eines wortes an, und verknüpft diese mit einem wert.
so kann man z.B. werte wie -1 mit false belegen, oder 0 oder 1 ... andere funktionen möchten es vieleicht anders, wie auch immer, man kann hier einfach eine vereinfachung beim lesen des quellcodes hervorrufen.
ist natürlich nicht zwingend. man kann das machen, wie man mag.
persönlich nutze ich false und true definitionen auch nicht, und schreibe beispiele teilweise auch auf normale numerische wertigkeiten um, da false man 0 oder auch mal -1 sein kann, und man anhand der definition den realen rückgabewert erst dann erkennt, wen man auch die definition des wortes kennt.
false = 0 kann man auch mit &H00 oder &H0, &H000000, &H00000000, 0, usw. vergleichen. manchmal ist es einfach einfacher andere schreibweisen zu nutzen.
ein farbwert wie 2846527 im dezimalen ist im HEX einfach verständlicher .. z.B. &HFFAA77 .. man erkennt die RGB komponenten R:FF G:AA B:77 und deren wertigkeit auf anhieb, was bei dezimaler schreibweise nicht so einfach gehen würde.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
XOR
Anmeldungsdatum: 23.07.2010 Beiträge: 161
|
Verfasst am: 27.03.2011, 23:07 Titel: |
|
|
Ich mache das immer gerne so mit den Marcos.
Ich habe an code oben noch ein bischen rumgebastelt.
Tasten:
-> F1 -> Quadrate zeichnen
-> F2 -> Linien zeichnen
-> F3 -> Kreise zeichnen
-> F4 -> Frei Hand zeichnen
-> F5 -> Folle Quadrate zeichnen
-> F6 -> Folle Kreise zeichnen
-> F7 -> einen bereich mit einer Farbe fuellen
-> F8 -> Farbe auswahl
-> n -> neu
-> STRL + Z -> rueckgaengig
-> ESC -> beenden
Hier der Link
Ihr durft euch den code veraendern, copieren und mit ihm machen was ihr wollt.
Ich werde nicht wohl nicht mehr an diesem Programm arbeiten. |
|
Nach oben |
|
 |
qbay
Anmeldungsdatum: 08.06.2008 Beiträge: 84
|
Verfasst am: 28.03.2011, 16:29 Titel: |
|
|
ok danke für eure hilfe leute^^ |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|