AMIGA-RESISTANCE

Die Projektseite für alles rund um den Amiga
Aktuelle Zeit: 18 Dez 2017, 10:49

Alle Zeiten sind UTC




Ein neues Thema erstellen Auf das Thema antworten  [ 31 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3  Nächste
Autor Nachricht
 Betreff des Beitrags: Re: Code Snippets
BeitragVerfasst: 16 Sep 2009, 16:00 
Offline
Schreiberling

Registriert: 10 Aug 2007, 23:47
Beiträge: 261
McFly hat geschrieben:
@Murmel

moin, habe Dein Script mal bei mir angetestet, hier kommt ein Requester mit folgender Meldung:
"Es wurde ein String erwartet!"
Datei: Test.hws (aktuelle Zeile:9)

Kann es sein, weil ich "nur" Hollywood 3.0 habe? Sollte nicht oder?
Habe den Text von Dir so wie er ist kopiert.


Es solte ab Hw2.0 laufen.
Hast Du es mit Owb kopiert ? Das haut am Anfang lauter "Ä" rein :/ Diese löschen oder mit IBrowse kopieren damit gehts.
"Aber mit IBrowse geht das posten hier im Forum nicht Oo"


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Code Snippets
BeitragVerfasst: 16 Sep 2009, 18:07 
Murmel hat geschrieben:
Es solte ab Hw2.0 laufen.
Hast Du es mit Owb kopiert ? Das haut am Anfang lauter "Ä" rein :/ Diese löschen oder mit IBrowse kopieren damit gehts.
"Aber mit IBrowse geht das posten hier im Forum nicht Oo"


Namd,

nöö, ich hab den Text mit IB kopiert, daher wundert mich das.
Ich probiere das aber morgen nochmal, sitze gerade nicht am Amiga.

Das posten mit IB geht, allerdings nur mit kleinen Tricks :wink:
Entweder ohne Umlaute und ss statt ß, oder aber, die Lösung bevorzuge ich mit einem kleinen Tool von Onyxsoft UTF-8, das einfach vor IB anschmeissen, es wandelt automatisch alle Texeingaben zum posten hier, um.
Kannste ja mal antesten wenn Du magst, hier der Link:
http://www.onyxsoft.se/utf-8.html

Ich gebe dann nochmal bescheid ob Dein Skript klappt.

gruß


Nach oben
  
 
 Betreff des Beitrags: Re: Code Snippets
BeitragVerfasst: 16 Sep 2009, 18:49 
Offline
Administrator
Benutzeravatar

Registriert: 30 Aug 2005, 19:42
Beiträge: 4668
Wohnort: 46047 Oberhausen
Hi Murmel
Hab dein Skript grad auch mal probiert, kommt der gleiche Fehler wie bei McFly.
Wie merkwürdig ist das denn mit OWB, hab das auch damit kopiert, aber keine Ä's oder andere Zeichen mit drin gehabt :?: :?

_________________
Gruß Helmut
Amiga 2000, Amiga 500, Amiga One


Nach oben
 Profil { PERSONAL_ALBUM }  
 
 Betreff des Beitrags: Re: Code Snippets
BeitragVerfasst: 16 Sep 2009, 21:02 
Offline
Schreiberling

Registriert: 10 Aug 2007, 23:47
Beiträge: 261
Also es ist kein Fehler im Script, zumindest kein offensichtlicher ;) Habe es jetzt nochmal mit OWB abkopiert und der Fehler in Zeile 9 sind 3 Ä die da nicht hingehören und in 2-3 weiteren Zeilen auch. Mit Ibrowse gehts bei mir unter MorphOS. Hänge es jetzt als Download oben dran.

Könntet ihr mal schauen ob der Festplattenplatz stimmt ? Eingend sollte das doch in Hw4.0 wieder gehen ?


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Code Snippets
BeitragVerfasst: 16 Sep 2009, 22:29 
Offline
Schreiberling
Benutzeravatar

Registriert: 17 Okt 2007, 21:48
Beiträge: 932
Wohnort: Muttenz CH
Salli Murmel

Also bei mir läuft das Script, welches ich aus dem
Thread herauskopiert habe, grundsätzlich einwandfrei.

Aber die Festplattengrösse, egal ob frei oder belegt
ist falsch.

Griessli
Tipsi


Nach oben
 Profil { PERSONAL_ALBUM }  
 
 Betreff des Beitrags: Re: Code Snippets
BeitragVerfasst: 18 Sep 2009, 08:46 
@Murmel

danke für den Download, jetzt funzt das Script auch bei mir :daumen3:

Also bei mir stimmen die angezeigten Werte der HD so ungefähr...
Siehe Screenshot

Dateianhang:
Systemwatch.jpg
Systemwatch.jpg [ 26.71 KiB | 3156-mal betrachtet ]


Nach oben
  
 
 Betreff des Beitrags: Re: Code Snippets
BeitragVerfasst: 18 Sep 2009, 18:12 
Offline
Schreiberling

Registriert: 10 Aug 2007, 23:47
Beiträge: 261
@McFly

Aha interessant. Hast Du eine 1 Terrabyte oder 1 GB Festplatte ? Wäre noch interessant zu wissen wies unter Aros und OS3 ausieht Unter MorphOS 2.3 scheints ein Bug zu sein, denn da stimmen die Werte nicht.

PS: Cool hast Du viel Chipram xD ;)


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Code Snippets
BeitragVerfasst: 18 Sep 2009, 18:22 
Hi Murmel,

ich habe ne 400Gig Platte verbaut und 512 MB Speicher im AOne.
OS4 sagt mir, das wenn ich das System gestartet habe das ich ungefähr
(muß überlegen, sitze gerade nicht am A1) etwas über 310 MB Speicher freihabe bzw. frei ist, laut OS-Menüleiste.

Hoffe Du kannst mit den Angaben etwas anfangen. Die Platte hängt nicht am internen IDE sondern am SII-Controller, falls das wichtig ist.

gruß
McFly


Nach oben
  
 
 Betreff des Beitrags: Re: Code Snippets
BeitragVerfasst: 18 Sep 2009, 19:40 
Offline
Administrator
Benutzeravatar

Registriert: 30 Aug 2005, 19:42
Beiträge: 4668
Wohnort: 46047 Oberhausen
Abend Murmel
Script läuft nu auch bei mir, anstatt Ää's waren bei mir Leerzeichen drin, die nicht da rein gehörten.
Und so siehts bei mir aus:
Dateianhang:
Systemwatch.jpg
Systemwatch.jpg [ 23.59 KiB | 3130-mal betrachtet ]


Und das ist in meinem A1 drin:
Speicher 512 MB
OS4.1
1x 160GB Platte
1x 60Gb Platte

_________________
Gruß Helmut
Amiga 2000, Amiga 500, Amiga One


Nach oben
 Profil { PERSONAL_ALBUM }  
 
 Betreff des Beitrags: Re: Code Snippets
BeitragVerfasst: 18 Sep 2009, 22:52 
Offline
Schreiberling

Registriert: 10 Aug 2007, 23:47
Beiträge: 261
Tja danke euch für die Info. Also ist

GetVolumeInfo(name$ ,#FREESPACE) #USEDSPACE

immer noch fehlerhaft.


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Code Snippets
BeitragVerfasst: 02 Nov 2009, 17:28 
Offline
Alter Hase

Registriert: 21 Dez 2007, 20:44
Beiträge: 58
(Brush)/Layer von x nach y bewegen und dabei gleichzeitig verkleinern (über Designer Codefenster)

PRINZIP:
Layer/Objekt um x% verkleinern -> Layer/Objekt um x verschieben -> Layer/Objekt erneut um x% von der momentanen Größe verkleinern -> schieben -> usw .....

HINWEISE:
1. Das Objekt auf den sich der Code bezieht muß VOR ! dem Code stehen. D.h. der Code muß im Codefenster eines Objektes eingetippt werden, was nach dem "zu bewegendem Objekt/Brush" steht. => eigentlich logisch, weil ja eins nachm anderen abgearbeitet wird...
Da ich im konkreten Falle mehrere Brushes/Layer bewegen wollte habe ich ein Objekt ganz unten eingefügt (unsichtb. Linie) welches für alle "Bewegungsobjekte" den Code hat.

2. ScaleLayer() war nen bisserl schwierig, da ich prozentual verkleinern wollte, ScaleLayer(2,50%,50%) geht leider nicht, da "%" als Operator in Hollywood geschützt ist, also muß ich mit Esc-Code+Asciizeichen arbeiten s.u.

3. Der Code ist sicherlich nen bisschen umständlich, und man könnte es mit einer schönen Funkton mit Variablen Übergabe besser regeln, aber es zeigt wo es lang geht:

CODE:

Code:
VerklFakt = 100 /* Var initialisieren */

/* --------- 1. Layer ------------- */

/* 1.Layer Position Startposition */
ax = 400
ay = 130
/* 1. Layer Endposition auf Startposition setzen */
bx = ax
by = ay

/* Layer auf 50 Proz verkleinern in zehner Schritten */
For VerklFakt = 100 to 50 Step -10
  VerklFakt$ = ToString(i) /* Verkl. Prozentzahl in String wandeln */
  a$ = AddStr(VerklFakt,"\037")       /* 037 Ascii Code Prozentzeichen an String h?ngen*/
  ScaleLayer(8,a$,a$) /* Layer verkleinern */
  bx = bx - 66 /* nächste Position des verkleinerten Layers berechnen, abhängig von Pos. im vorangegangenen Schleifendurchlauf */
  by = by + 21
  MoveLayer(8, ax, ay, bx, by, {Speed = #FASTSPEED}) /* Layer entsprechend ein Stück bewegen */
  ax = bx /* Startposition auf neue Endposition setzen für den nächsten Durchläufe... */
  ay = by
Next


gruß gerograph


Nach oben
 Profil  
 
 Betreff des Beitrags: Real 3D Engine von ArtBlink
BeitragVerfasst: 06 Dez 2010, 22:21 
Offline
Administrator
Benutzeravatar

Registriert: 30 Aug 2005, 19:42
Beiträge: 4668
Wohnort: 46047 Oberhausen
ArtBlink hat mir erlaubt hier seinen Quellcode von seiner Real 3D Engine reinzustellen, dies ist die erste Version.

Code:
@SCREEN {Mode = "ask", Width = 640, Height = 400}
SetFormStyle(#ANTIALIAS) ; Antialiasing sur le cube
FC=200
CX=160
CY=100
CZ=200
Function Controle()
   If IsKeyDown("Left")=True Then Gauche() ; Vers la gauche
   If IsKeyDown("Right")=True Then Droite() ; Vers la droite
   If IsKeyDown("Up")=True Then Haut() ; Vers le Haut
   If IsKeyDown("Down")=True Then Bas() ; Vers le bas
   If IsKeyDown("RSHIFT")=True Then Zoomin() ; Zoom in
   If IsKeyDown("RCONTROL")=True Then Zoomout() ; Zoom Out
EndFunction

Function Gauche()
   AY=AY+1
   If AY>359 Then AY=0
EndFunction

Function Droite()
   AY=AY-1
   If AY<0 Then AY=359
EndFunction

Function Haut()
   AX=AX+1
   If AX>359 Then AX=0
EndFunction
       
Function Bas()
   AX=AX-1
   If AX<0 Then AX=359
EndFunction

Function Zoomin()
   CZ=CZ+10
   If CZ>500 Then CZ=500
EndFunction

Function Zoomout()
   CZ=CZ-10
   If CZ<80 Then CZ=80)
EndFunction

Function PRG()
   
   Controle() ; Exécution de la fonction Controle
   ; Réservation mémoire et création des tableaux
   Dim CO[360] ; 360 cases réservé car une rotation c'est 360° pour le Cosinus
   Dim SI[360] ; 360 cases réservé car une rotation c'est 360° pour le Sinus
   Dim X[8] ; Un cube, c'est 8 points en X
   Dim Y[8] ; Un cube, c'est 8 points en Y
   Dim Z[8] ; Un cube, c'est 8 points en Z
   Dim XE[8] ; Point final du cube a dessiner en X
   Dim YE[8] ; Point final du cube a dessiner en Y
   Dim ZZ[8] ; Point final du cube a dessiner en Z
   Dim P1[12] ; Un cube, c'est 12 lignes (point de départ de la ligne)
   Dim P2[12] ; Un cube, c'est 12 lignes (point final de la ligne)
   
Flip ; Flip d'écran pour le double buffer
Cls ; Effacement de l'écran sinon on verrait des cube partout lol

For I=0 To 359
   CO[I]=Cos(I*0.1)*256 ; Mise en mémoire de 360 calcule du Cosinus des angles sur 360°
   SI[I]=Sin(I*0.1)*256 ; Mise en mémoire de 360 calcule du Sinus des angles sur 360°
Next

   For I=0 To 7
      X = {-50,50,50,-50,-50,50,50,-50} ; Coordonnées des points dans l'espace en X
      Y = {-50,-50,50,50,-50,-50,50,50} ; Coordonnées des points dans l'espace en Y
      Z = {-50,-50,-50,-50,50,50,50,50} ; Coordonnées des points dans l'espace en Z
      P1 = {0,1,2,3,4,5,6,7,0,1,2,3} ; Point de départ pour tracer la ligne
      P2 = {1,2,3,0,5,6,7,4,4,5,6,7} ; Point d'arrivée pour tracer la ligne
      ;Calcule 3D grâce au magazine Dream N°27 de Mars 1996
      Y1=(Y[I]*CO[AX]+Z[I]*SI[AX])/256
      Z1=(-Y[I]*SI[AX]+Z[I]*CO[AX])/256
      X1=(X[I]*CO[AY]+Z1*SI[AY])/256
      ZZ[I]=(-X[I]*SI[AY]+Z1*CO[AY])/256
      X=(X1*CO[AZ]+Y1*SI[AZ])/256
      Y=(-X1*SI[AZ]+Y1*CO[AZ])/256
      D=FC/(Sqrt(X^2+Y^2+(CZ+ZZ[I])^2))
      XE[I]=320+X*D
      YE[I]=200+Y*D
   Next
   ; Calcule final
   For I=0 To 11
      GP1=P1[I]
      GP2=P2[I]
      X=XE[GP1]
      Y=YE[GP1]
      X1=XE[GP2]
      Y1=YE[GP2]
      Line (X,Y,X1,Y1,#WHITE) ; Traçage des lignes
   Next
EndFunction

BeginDoubleBuffer

SetInterval(1,PRG,1000/50)

Repeat
WaitEvent
Forever


Zum ersten Quellcode im englischen Hollyood Forum

Die zweite Version von seiner Real 3D Engine.
Code:
@SCREEN {Mode = "ask", Width = 640, Height = 400}
FC=200
CZ=200
Function Controle()
   If IsKeyDown("Left")=True Then Gauche() ; Vers la gauche
   If IsKeyDown("Right")=True Then Droite() ; Vers la droite
   If IsKeyDown("Up")=True Then Haut() ; Vers le Haut
   If IsKeyDown("Down")=True Then Bas() ; Vers le bas
   If IsKeyDown("a")=True Then Zoomin() ; Zoom in
   If IsKeyDown("z")=True Then Zoomout() ; Zoom Out
   If IsKeyDown("p")=True Then SetFillStyle(#FILLCOLOR) ; Zoom Out
   If IsKeyDown("o")=True Then SetFillStyle(#FILLNONE)   
   If IsKeyDown("i")=True Then SetFillStyle(#FILLGRADIENT, #LINEAR, $888888, $FFFFFF)
   If IsKeyDown("u")= True Then SetFormStyle(#ANTIALIAS)
   If IsKeyDown("y")= True Then SetFormStyle(#NORMAL)
EndFunction

Function Gauche()
   AY=AY+1
   If AY>359 Then AY=0
EndFunction

Function Droite()
   AY=AY-1
   If AY<0 Then AY=359
EndFunction

Function Haut()
   AX=AX+1
   If AX>359 Then AX=0
EndFunction
   
Function Bas()
   AX=AX-1
   If AX<0 Then AX=359
EndFunction

Function Zoomin()
   CZ=CZ+10
   If CZ>600 Then CZ=600
EndFunction

Function Zoomout()
   CZ=CZ-10
   If CZ<150 Then CZ=150
EndFunction

Function PRG()
   
   Controle() ; Exécution de la fonction Controle
   ; Réservation mémoire et création des tableaux
   Dim CO[360] ; 360 cases réservé car une rotation c'est 360° pour le Cosinus
   Dim SI[360] ; 360 cases réservé car une rotation c'est 360° pour le Sinus
   Dim X[8] ; Un cube, c'est 8 points en X
   Dim Y[8] ; Un cube, c'est 8 points en Y
   Dim Z[8] ; Un cube, c'est 8 points en Z
   Dim XE[8] ; Point final du cube a dessiner en X
   Dim YE[8] ; Point final du cube a dessiner en Y
   Dim ZZ[8] ; Point final du cube a dessiner en Z
   Dim P1[10] ; Polygone 1
   Dim P2[10] ; Polygone 2
   Dim P3[10] ; Polygone 3
   Dim P4[10] ; Polygone 4
   Dim P5[10] ; Polygone 5
   Dim P6[10] ; Polygone 6
   
Flip ; Flip d'écran pour le double buffer
Cls ; Effacement de l'écran sinon on verrait des cube partout lol

For I=0 To 359
   CO[I]=Cos(I*0.1)*360 ; Mise en mémoire de 360 calcule du Cosinus des angles sur 360°
   SI[I]=Sin(I*0.1)*360 ; Mise en mémoire de 360 calcule du Sinus des angles sur 360°
Next

   For I=0 To 7
      X = {-50,50,50,-50,-50,50,50,-50} ; Coordonnées des points dans l'espace en X
      Y = {-50,-50,50,50,-50,-50,50,50} ; Coordonnées des points dans l'espace en Y
      Z = {-50,-50,-50,-50,50,50,50,50} ; Coordonnées des points dans l'espace en Z
     
      ;P={0,1,2,3,1,5,6,2,4,5,1,0,4,5,6,7,4,0,3,7,3,2,6,7}
      ;Calcule 3D grâce au magazine Dream N°27 de Mars 1996
      Y1=(Y[I]*CO[AX]+Z[I]*SI[AX])/360
      Z1=(-Y[I]*SI[AX]+Z[I]*CO[AX])/360
      X1=(X[I]*CO[AY]+Z1*SI[AY])/360
      ZZ[I]=(-X[I]*SI[AY]+Z1*CO[AY])/360
      X=(X1*CO[AZ]+Y1*SI[AZ])/360
      Y=(-X1*SI[AZ]+Y1*CO[AZ])/360
      D=FC/(Sqrt(X^2+Y^2+(CZ+ZZ[I])^2))
      XE[I]=320+X*D
      YE[I]=200+Y*D
   
   Next
    ; Calcule final
      P1 = {XE[0],YE[0],XE[1],YE[1],XE[2],YE[2],XE[3],YE[3],XE[0],YE[0]} ; Polygon 1
      P2 = {XE[1],YE[1],XE[5],YE[5],XE[6],YE[6],XE[2],YE[2],XE[1],YE[1]} ; Polygon 2
      P3 = {XE[4],YE[4],XE[5],YE[5],XE[1],YE[1],XE[0],YE[0],XE[4],YE[4]} ; Polygon 3
      P4 = {XE[4],YE[4],XE[5],YE[5],XE[6],YE[6],XE[7],YE[7],XE[4],YE[4]} ; Polygon 4
      P5 = {XE[4],YE[4],XE[0],YE[0],XE[3],YE[3],XE[7],YE[7],XE[4],YE[4]} ; Polygon 5
      P6 = {XE[3],YE[3],XE[2],YE[2],XE[6],YE[6],XE[7],YE[7],XE[3],YE[3]} ; Polygon 6

      Box (0,0,640,200,$3333EE)
      Locate (0,0)
      Print ("Flèche => Rotation cube")
      Locate (0,12)
      Print ("Touche a => Zoom OUT")
      Locate (0,24)
      Print ("Touche b => Zoom IN")
      Locate (0,36)
      Print ("Touche p => coloration de Garnier")
      Locate (0,48)
      Print ("Touche o => annuler la coloration")
      Locate (0,60)
      Print ("Touche i => Un monde d'acier ;-)")
      Locate (0,72)
      Print ("Touche u => Antialiasing")
      Locate (0,84)
      Print ("Touche y => enlever l'Antialiasing")
      Locate (0,96)
      Print ("Ctrl+c => Quitter")

      ; Traçage des polygones avec tests
      ; les tests se font sur la coordonnées en Z
      ; en gros si le polygone passe derrière les autres alors il s'affiche pas
      ; je crois que normalement sa fais gagner du temp CPU... Non?
      If ZZ[1]+ZZ[5]+ZZ[6]+ZZ[2]<-40 Then Polygon (0,0,P2,5,#BLUE)
      If ZZ[4]+ZZ[5]+ZZ[1]+ZZ[0]<-40 Then Polygon (0,0,P3,5,#RED)
      If ZZ[0]+ZZ[1]+ZZ[2]+ZZ[3]>40 Then Polygon (0,0,P4,5,#YELLOW)
      If ZZ[1]+ZZ[5]+ZZ[6]+ZZ[2]>40 Then Polygon (0,0,P5,5,#WHITE)
      If ZZ[4]+ZZ[5]+ZZ[1]+ZZ[0]>40 Then Polygon (0,0,P6,5,#GREEN)
      If ZZ[0]+ZZ[1]+ZZ[2]+ZZ[3]<-40 Then Polygon (0,0,P1,5,#PURPLE)
EndFunction

BeginDoubleBuffer

SetInterval(1,PRG,1000/50)

Repeat
WaitEvent
Forever


Zum zweiten Quellcode im englischen Hollyood Forum

_________________
Gruß Helmut
Amiga 2000, Amiga 500, Amiga One


Nach oben
 Profil { PERSONAL_ALBUM }  
 
 Betreff des Beitrags: Re: Real 3D Engine von ArtBlink
BeitragVerfasst: 07 Dez 2010, 20:46 
Offline
Schreiberling
Benutzeravatar

Registriert: 17 Okt 2007, 21:48
Beiträge: 932
Wohnort: Muttenz CH
Beim Code müsst Ihr eine der beiden Zeilen ändern:

HelmutH hat geschrieben:
Die zweite Version von seiner Real 3D Engine.
Code:
Function Controle()
...
   If IsKeyDown("z")=True Then Zoomout() ; Zoom Out
...
EndFunction
Hier entweder ("z") in ("b") oder

Zitat:
Code:
Function PRG()
...
      Print ("Touche b => Zoom IN")
...
EndFunction
oder hier b in z ändern.

Wenn ihr aber zu faul zum Ändern seid, drückt bei Zoom IN
einfach die Taste z.

ArtBlink benutzt eine englischsprachliche Tastatur, da ist
natürlich a und z über- bzw. untereinander.

Griessli
Tipsi


Nach oben
 Profil { PERSONAL_ALBUM }  
 
 Betreff des Beitrags: Re: Code Snippets
BeitragVerfasst: 08 Dez 2010, 12:22 
Offline
Administrator
Benutzeravatar

Registriert: 30 Aug 2005, 19:42
Beiträge: 4668
Wohnort: 46047 Oberhausen
Hi Tipsi

Prima das du es auch probiert hast und mir da zuvor gekommen bist und das mit der vertauschten Tasten für die Zoom In hier noch nachgetragen hast.
ArtBlink hat da noch mehr Codes im englische Forum drin, wo ich ihn noch nach fragen werde, ob wir die hier auch reinstellen dürfen.

_________________
Gruß Helmut
Amiga 2000, Amiga 500, Amiga One


Nach oben
 Profil { PERSONAL_ALBUM }  
 
 Betreff des Beitrags: Re: Code Snippets
BeitragVerfasst: 17 Dez 2012, 00:04 
Offline
Schreiberling
Benutzeravatar

Registriert: 17 Okt 2007, 21:48
Beiträge: 932
Wohnort: Muttenz CH
Format Tags

Einige von uns benutzen ja die ScuiLib, um dem Programm
GUI Elemente zu verpassen. Hier mal ein Beispiel:

Bild

Die Wörter sind in jedem Knopf zentriert, so sieht es
eigentlich nicht schlecht aus. Aber falls jemand nun
Format Tags benutzen möchte, kann das schrecklich
aussehen. Im nächsten Beispiel sind teilweise Buchstaben
unterstrichen, damit der Benutzer weiss, welche
Tastaturkürzel er benutzen könnte:

Bild

Warum nun diese Verschiebung des Textes? Der ScuiLib
werden nun mehr Zeichen übergeben, als nachher im
Knopf sichtbar sind. Nehmen wir mal die Zeile Sprache.
Sprache hat sieben Buchstaben. Die ScuiLib berechnet
nun für sieben Buchstaben die Verschiebung aus, damit
nachher Sprache zentriert im Knopf erscheint. Möchte
man allerdings zwei Buchstaben unterstreichen, dann
sieht das so aus:
Code:
[u]S[/u]prach[u]e[/u]

Der ScuiLib werden somit 21 Buchstaben übergeben,
obwohl nachher nur sieben sichtbar sind. Das müssen
wir ändern.

Wir basteln uns eine p_NoFormatTags Funktion und fügen
diese in die ScuiLib ein. Ich persönlich habe sie vor die
Funktion helpers.GetBrushID() hineingesetzt.

Nun suchen wir in der ScuiLib jede Stelle (ca. 15), welche den
Hollywoodbefehl TextWidth() benutzt. Dann fügen wir eine Zeile
vorher den Befehl p_NoFormatTags() ein und übernehmen die
Variable, welche der Befehl TextWidth benutzt hat. Hier ein Beispiel
aus der ScuiLib:

Code:
CWidth = TextWidth(CChar)

Diese Zeile müssen wir nun neu als Zweizeiler schreiben:

Code:
NeuerText = p_NoFormatTags(CChar)
CWidth = TextWidth(NeuerText)

So, und wie sieht diese p_NoFormatTags Funktion aus?
Wir wollen in unserem Beispiel sämtliche
Code:
[u][/u]

bei der Breitenberechnung ausklammern:

Code:
Function p_NoFormatTags(Text)
  Text=ReplaceStr(Text,[u],"")
  Text=ReplaceStr(Text,[/u],"")
  Return(Text)
EndFunction

Das sieht dann bei den Knöpfen so aus:

Bild

Super. Und wenn man Italic und Bold auch noch
berücksichtigen möchte, dann sieht die Funktion
nicht viel anderst aus:
Code:
Function p_NoFormatTags(Text)
  Text=ReplaceStr(Text,[u],"")
  Text=ReplaceStr(Text,[/u],"")
  Text=ReplaceStr(Text,[i],"")
  Text=ReplaceStr(Text,[/i],"")
  Text=ReplaceStr(Text,[b],"")
  Text=ReplaceStr(Text,[/b],"")
  Return(Text)
EndFunction

Toll. Falls wir sonst keine Format Tags brauchen, dann
haben wir bereits unsere Funktion gebastelt. Aber ich
muss gestehen, dass ich Bold und Italic nie getestet
habe. Gerüchten zufolge funktioniert das mit Bold nicht
ganz zufriedenstellend.

Wenn wir aber (und das wollen wir jetzt) noch andere
Format Tags wie
Code:
[color=<new color>], [/color]
[shadow=<shadow color>,<shadow size>,<shadow direction>][/shadow]
[edge=<edge color>,<edge size>] [/edge]
benutzen möchten, wird die Funktion etwas grösser:

Code:
Function p_NoFormatTags(Text)

  Local TextArray=StrToArray(Text)
  Local AnzahlArray=ListItems(TextArray)
  Local NeuerText=""
  Local On="ON"
  Local Off="Off"
  Local FormatTag=Off

  Local KlammerAuf=Asc("[")
  Local KlammerZu=Asc("]")

  For ii=0 To AnzahlArray-1
    If TextArray[ii]=KlammerAuf
      FormatTag=On
    EndIf

    If FormatTag=Off
      NeuerText=NeuerText..Chr(TextArray[ii])
    EndIf

    If TextArray[ii]=KlammerZu
      FormatTag=Off
    EndIf
  Next

  Return(NeuerText)

EndFunction


Die For-Next Schleife wird sooft durchlaufen, wie Zeichen
in der Variablen Text übergeben wurde. Dann wird in dieser
Schleife jedes einzelne Zeichen überprüft, ob es eine
öffnende eckige Klammer [ ist. Falls nicht, wird der Variable
NeuerText dieses Zeichen angefügt. Falls es aber doch ein [
ist, wird das Anfügen übersprungen, bis eine schliessende
eckige Klammer ] kommt. Ab da werden die Zeichen wieder
in der Variablen NeuerText angefügt.

Die beiden Variablen On und Off können auch etwas
anderes beinhalten, wie z.B. 1 und 0, "Ja" und "Nein",
"Franz" und "Sussi" oder was weiss ich. Auch ii als
Zähler kann natürlich anderst heissen.

Diese Funktion hat allerdings eine Schwäche. Falls im
Text neben den Format Tags die beiden eckigen Klammern
vorkommen, dann werden diese auch als Format Tags
behandelt. Das geht allerdings schief. In diesem Fall
hilft nur noch diese Funktion:

Code:
Function p_NoFormatTags(Text)

  Local TextArray=StrToArray(Text)
  Local AnzahlArray=ListItems(TextArray)
  Local NeuerText=""
  Local On="ON"
  Local Off="Off"
  Local FormatTag=Off

  Local KlammerAuf=Asc("[")
  Local KlammerZu=Asc("]")

  For ii=0 To AnzahlArray-1
    If TextArray[ii]=KlammerAuf
      If Chr(TextArray[ii])..Chr(TextArray[ii+1])..Chr(TextArray[ii+2])="[b]"
        FormatTag=On
      ElseIf Chr(TextArray[ii])..Chr(TextArray[ii+1])..Chr(TextArray[ii+2])="[i]"
        FormatTag=On
      ElseIf Chr(TextArray[ii])..Chr(TextArray[ii+1])..Chr(TextArray[ii+2])="[u]"
        FormatTag=On
      ElseIf Chr(TextArray[ii])..Chr(TextArray[ii+1])..Chr(TextArray[ii+2])..Chr(TextArray[ii+3])="[/b]"
        FormatTag=On
      ElseIf Chr(TextArray[ii])..Chr(TextArray[ii+1])..Chr(TextArray[ii+2])..Chr(TextArray[ii+3])="[/i]"
        FormatTag=On
      ElseIf Chr(TextArray[ii])..Chr(TextArray[ii+1])..Chr(TextArray[ii+2])..Chr(TextArray[ii+3])="[/u]"
        FormatTag=On
      ElseIf Chr(TextArray[ii])..Chr(TextArray[ii+1])..Chr(TextArray[ii+2])..Chr(TextArray[ii+3])..
        Chr(TextArray[ii+4])..Chr(TextArray[ii+5])..Chr(TextArray[ii+6])..Chr(TextArray[ii+7])="[shadow="
        FormatTag=On
      ElseIf Chr(TextArray[ii])..Chr(TextArray[ii+1])..Chr(TextArray[ii+2])..Chr(TextArray[ii+3])..
        Chr(TextArray[ii+4])..Chr(TextArray[ii+5])..Chr(TextArray[ii+6])..Chr(TextArray[ii+7])..
        Chr(TextArray[ii+8])="[/shadow]"
        FormatTag=On
      ElseIf Chr(TextArray[ii])..Chr(TextArray[ii+1])..Chr(TextArray[ii+2])..Chr(TextArray[ii+3])..
        Chr(TextArray[ii+4])..Chr(TextArray[ii+5])="[edge="
        FormatTag=On
      ElseIf Chr(TextArray[ii])..Chr(TextArray[ii+1])..Chr(TextArray[ii+2])..Chr(TextArray[ii+3])..
        Chr(TextArray[ii+4])..Chr(TextArray[ii+5])..Chr(TextArray[ii+6])="[/edge]"
        FormatTag=On
      ElseIf Chr(TextArray[ii])..Chr(TextArray[ii+1])..Chr(TextArray[ii+2])..Chr(TextArray[ii+3])..
        Chr(TextArray[ii+4])..Chr(TextArray[ii+5])..Chr(TextArray[ii+6])="[color="
        FormatTag=On
      ElseIf Chr(TextArray[ii])..Chr(TextArray[ii+1])..Chr(TextArray[ii+2])..Chr(TextArray[ii+3])..
        Chr(TextArray[ii+4])..Chr(TextArray[ii+5])..Chr(TextArray[ii+6])..Chr(TextArray[ii+7])="[/color]"
        FormatTag=On
      EndIf
    EndIf

    If FormatTag=Off
      NeuerText=NeuerText..Chr(TextArray[ii])
    EndIf

    If FormatTag=On
      If TextArray[ii]=KlammerZu
        FormatTag=Off
      EndIf
    EndIf
  Next

  Return(NeuerText)

EndFunction


Nun wird bei jeder öffnenden eckigen Klammer überprüft,
ob anschliessend ein Format Tag folgt. Falls ja werden alle
Zeichen bis zur schliessenden eckigen Klammer ignoriert.
Falls nein, dann wird diese Klammer in der Breitenberechnung
berücksichtigt.

Ich habe bei mir die letzte grosse Funktion eingepflanzt. Ich
glaube, ob bei 12835 Codezeilen der ScuiLib noch ca. 60 mehr
oder weniger dazukommen, spielt keine Rolle mehr.

So, das wärs. Falls jemand die Funktionen genauer erklärt
haben möchte, dann bitte melden.

Griessli
Tipsi


Tante Edit: Bilder wieder hinzugefügt, ein paar Schreibfehler entfernt


Zuletzt geändert von Tipsi am 26 Mai 2017, 08:54, insgesamt 2-mal geändert.

Nach oben
 Profil { PERSONAL_ALBUM }  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 31 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3  Nächste

Alle Zeiten sind UTC


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
POWERED_BY
Deutsche Übersetzung durch phpBB.de