Probleme mit "TEXT" bei B+ ?!

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

bmurray

Betreff: Probleme mit "TEXT" bei B+ ?!

BeitragMi, März 20, 2013 14:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Gemeinde,

ich habe ein Problem bei meinem Fußballmanager. Ich glaube, dass es am für B+ langsamen Befehl "TEXT" liegt. Untenstehend mein Code, der folgendes macht:

Aus einer Liste von Spielern kann man mittels Drag & Drop diese Spieler auf einem Fußballfeld auf deren jeweiligen Positionen ablegen, man kann Spieler auf den Position tauschen, die Spieler auf eine andere Position ziehen, wieder runter löschen, usw, kurz, alles was man bei Anstoss 3 auch konnte. Dazu kann man die taktische Formation aussuchen, alle Spieler auf dem Feld löschen, sowie dem Co-Trainer die Aufstellung überlassen. Die ersten acht Spieler aufs Feld zu ziehen funktioniert wunderbar, ab dem 9. Spieler klappt das aber nicht mehr so gut, man braucht mehrere Anläufe, bis das Programm den Spieler auf dem Feld ablegt. Auch die Schleife mittels rechter Maustaste verlassen ("Until MouseHit(2)"), funktioniert bei voller Aufstellung nur nach mehrmaligen Drücken. Ich glaube, dass das daran liegt, dass das Programm mit "TEXT" so viel zu tun, und man den richtigen Moment erwischen muss, bis das Programm die gewünscht Funktion macht.

Die Texte als Image vorrendern wird wohl nicht gehen, da sie sich häufig ändern. So etwas wie SpeedText gibt es wohl nicht für B+?! Meine Frage nun: Habe ich das schlecht programmiert? Oder ist mein Programm auf B+ einfach nicht möglich, da ich viel "TEXT" verwende? Würde der Code so auf einer anderen Blitz-Plattform (eventuell mit speedtext o.ä.) besser laufen? Bin für jede Hilfe dankbar!


Code: [AUSKLAPPEN]
   Function aufstellung()
         ;VORHERIGE SCHLEIFENEINSTELLUNGEN
         If wahlaufstellung>=6 Then welcheposfeld(5)="MIT" Else welcheposfeld(5)="ABW"
         If wahlaufstellung>=3 Then welcheposfeld(6)="MIT" Else welcheposfeld(6)="ABW"
         If wahlaufstellung=5 Or wahlaufstellung=7 Then welcheposfeld(9)="STU" Else welcheposfeld(9)="MIT"
         If wahlaufstellung=2 Or wahlaufstellung>=4 Then welcheposfeld(10)="STU" Else welcheposfeld(10)="MIT"      
         Local abzug#
         auswahltaktik=1
   
      Repeat
         DrawBlock hintergrund(1),0,0
         DrawBlock hintergrund(6),20,100
         ywert=447
         mrz=MouseZSpeed()
         DrawImage sonstige(wahlaufstellung+7),20,100
                  
         For i = 1 To 7; FORMATION AUSWÄHLEN
            DrawImage sonstige(14+i),660,120+(i-1)*29
            If MouseX()>=660 And MouseX()<713 And MouseY()>=120+(i-1)*29 And MouseY()<147+(i-1)*29 Then
               If MouseHit(1) Then
                  wahlaufstellung=i
                  If wahlaufstellung>=6 Then welcheposfeld(5)="MIT" Else welcheposfeld(5)="ABW"
                  If wahlaufstellung>=3 Then welcheposfeld(6)="MIT" Else welcheposfeld(6)="ABW"
                  If wahlaufstellung=5 Or wahlaufstellung=7 Then welcheposfeld(9)="STU" Else welcheposfeld(9)="MIT"
                  If wahlaufstellung=2 Or wahlaufstellung>=4 Then welcheposfeld(10)="STU" Else welcheposfeld(10)="MIT"      
               End If
            End If
         Next
         DrawImage sonstige(wahlaufstellung+21),660,120+(wahlaufstellung-1)*29
         
         For i = 1 To 2; BUTTONS: TEAM LÖSCHEN + CO TRAINER
            DrawImage sonstige(29+i),675,323+(i-1)*29
            If MouseX()>=675 And MouseX()<713 And MouseY()>=323+(i-1)*29 And ;ABKÜR
               If MouseHit(1) Then loeco=i
            End If
         Next   

         If mrz > 0 Then  mausrad = mausrad - 1; SPIELERLISTE SCROLLEN
         If mrz < 0 Then  mausrad = mausrad + 1
         If mausrad < 1 Then mausrad = 1
         If mausrad > spieleranzahlmannschaft(teamspieler)-19 Then mausrad = spieleranzahlmannschaft(teamspieler)-19
         SetFont schrift1

      For q=mausrad To mausrad+19;SPIELER EINZEICHNEN & AUSWÄHLEN
         Color 0,0,0
         If MouseX()>=20 And MouseX()<=600 And MouseY()>=ywert+(q-(mausrad-1))*15 And ;ABK
            If MouseDown(1)=0 Then Color 56,26,230
            If MouseHit(1) Then
               aktbew$=nachname(teamspieler,q):aktbewpos$=position(teamspieler,q)
                                        aktsta=staerke(teamspieler,q):aktnum=nummer(teamspieler,q)
               abstandx=67:abstandy=16
               For i = 1 To 11; HIERMIT KANN MAN IN DER SPIELERLISTE DURCH MAUSKLICK
; EINEN AUF DEM FELD BEFINDLICHEN SPIELER AUS DER AUFSTELLING LÖSCHEN
                  If aktnum=spielernummerfeld(i) Then spielerfeld(i)=0
               Next
            End If
         End If
         SetFont schrift1
         For i = 1 To 11; AUF DEM FELD BEFINDLICHE SPIELER WERDEN IN DER SPIELERLISTE FETT GEZEICHNET
            If nummer(teamspieler,q)=spielernummerfeld(i) Then SetFont schrift4
         Next
         Text 20,ywert+(q-(mausrad-1))*15,nummer(teamspieler,q)
         Text 50,ywert+(q-(mausrad-1))*15,vorname(teamspieler,q)+nachname(teamspieler,q)
         Text 240,ywert+(q-(mausrad-1))*15,position(teamspieler,q)
         DrawImage flagge(nationalitaet(teamspieler,q)),285,ywert+(q-(mausrad-1))*15
         Text 320,ywert+(q-(mausrad-1))*15,alter(teamspieler,q)
         DrawImage sonstige(talent(teamspieler,q)),350,ywert+(q-(mausrad-1))*15
         Text 450,ywert+(q-(mausrad-1))*15,kondition(teamspieler,q)
         Text 490,ywert+(q-(mausrad-1))*15,frische(teamspieler,q)
         Text 530,ywert+(q-(mausrad-1))*15,motivation(teamspieler,q)
         Text 580,ywert+(q-(mausrad-1))*15,staerke(teamspieler,q)
      Next
      
         SetFont schrift4
         Color 0,0,0
         For i=1 To 11;WENN AUS DEM FELD EIN SPIELER AUSGEWÄHLT WIRD
            If MouseX()>=koorfeldx(wahlaufstellung,i) And MouseX();ABK
               If MouseHit(1) Then
                  aktbew$=spielernamefeld(i):aktbewpos$=spielerposfeld(i)
                                                spielerfeld(i)=0:aktnum=spielernummerfeld(i)
                                                aktsta=spielerstaerkefeld(i):aktfeld=i
                  abstandx=MouseX()-koorfeldx(wahlaufstellung,i):abstandy=MouseY()-koorfeldy(wahlaufstellung,i)
               End If
            End If
         Next

         tempdoppelt=0; TEMP. EINSTELLUNGEN
         tauschname$=""
         tauschpos$=""
         tauschnum=0
         tauschsta=0
         
         If Not aktbew="" Then;EIN SPIELER WIRD IM FELD ABGELEGT
            For i = 1 To 11
               If MouseX()>=koorfeldx(wahlaufstellung,i) And MouseX();ABK
                  If MouseDown(1)=0 Then
                     If tempdoppelt=0 Then
                        If spielerfeld(i)=1 Then
                           tempdoppelt=1
                           tauschname=spielernamefeld(i)
                           tauschpos=spielerposfeld(i)
                           tauschnum=spielernummerfeld(i)
                           tauschsta=spielerstaerkefeld(i)
                        End If
                     End If
                     spielerfeld(i)=1:spielernamefeld(i)=aktbew:spielerposfeld(i)=aktbewpos
spielernummerfeld(i)=aktnum:spielerstaerkefeld(i)=aktsta
                     For j= 1 To 11; SPIELER DARF NICHT DOPPELT AUF DEM FELD SEIN
                        If Not i=j Then
                           If spielernummerfeld(i)=spielernummerfeld(j) Then spielerfeld(j)=0
                        End If
                     Next
                  End If
               End If
            Next            
         End If

         If tempdoppelt = 1 Then; ZWEI SPIELER WURDEN AUF DEM FELD GETAUSCHT
            spielerfeld(aktfeld)=1:spielernamefeld(aktfeld)=tauschname:spielerposfeld(aktfeld)=tauschpos
spielernummerfeld(aktfeld)=tauschnum:spielerstaerkefeld(aktfeld)=tauschsta
         End If

         For i = 1 To 11   ;DIE SPIELER WERDEN INS FELD GEZEICHNET
            If spielerfeld(i)=1 Then
               DrawImage sonstige(29),koorfeldx(wahlaufstellung,i),koorfeldy(wahlaufstellung,i)
               Text koorfeldx(wahlaufstellung,i)+2,koorfeldy(wahlaufstellung,i)-1, spielernamefeld(i)
               
               abzug=1:temp=1; DIE STÄRKE EINES SPIELERS ÄNDERT SICH, WENN ER AUF EINER FALSCHEN POSITION ABGELEGT WURDE
               If i > 1 And spielerposfeld(i) <> welcheposfeld(i) Then abzug=0.8 : temp=2
               If i = 1 And spielerposfeld(1) <> "TW" Then abzug=0.4 : temp=2
               If i > 1 And spielerposfeld(i) = "TW" Then abzug=0.4 : temp=2
               
               If temp=2 Then Color 255,0,0 Else Color 0,0,0;WENN EINE POSITION NICHT STIMMT, DANN WIRD STÄRKE UND POSITION ROT GEZEICHNET
               Text koorfeldx(wahlaufstellung,i)+92,koorfeldy(wahlaufstellung,i)+14, spielerposfeld(i)
               Text koorfeldx(wahlaufstellung,i)+2,koorfeldy(wahlaufstellung,i)+14, Int (spielerstaerkefeld(i)*abzug)
               Color 0,0,0
               If welcheposfeld(i)="TW" Then tempoff#=0.05:tempdef#=0.95; BEITRAG EINES SPIELERS ZUR OFFENSIV/DEFENSIVSTÄRKE
               If welcheposfeld(i)="ABW" Then tempoff#=0.1:tempdef#=0.9
               If welcheposfeld(i)="MIT" Then tempoff#=0.5:tempdef#=0.5
               If welcheposfeld(i)="STU" Then tempoff#=0.9:tempdef#=0.1
               offensivstaerkefeld(teamspieler,i)= Int (spielerstaerkefeld(i)*abzug)*tempoff*taktikwertoff(auswahltaktik)
               defensivstaerkefeld(teamspieler,i)= Int (spielerstaerkefeld(i)*abzug)*tempdef*taktikwertdef(auswahltaktik)
            End If
         Next

         If MouseDown(1)=1 Then; ANZEIGE DER AUSWAHL DES SPIELERS VOM GAMER
            If Not aktbew="" Then DrawImage sonstige(29),MouseX()-abstandx,MouseY()-abstandy
            Text MouseX()-(abstandx-2),MouseY()-(abstandy+1),aktbew
            Text MouseX()-(abstandx-92),MouseY()-(abstandy-14),aktbewpos
            If Not aktbew="" Then Text MouseX()-(abstandx-2),MouseY()-(abstandy-14),aktsta
         Else aktbew="":aktbewpos="":aktnum=0:aktfeld=0
         EndIf
         
         If loeco=1 Then; AUFSTELLUNG LÖSCHEN
            For i = 1 To 11
               spielerfeld(i)=0
            Next
            auswahltaktik=auswahltaktik+1
            loeco=0
         End If
         
         For i = 1 To 11; ATTRIBUTE ALLER LEEREN POSITIONEN AUF DEM FELD LÖSCHEN
            If spielerfeld(i)=0 Then spielernamefeld(i)="":spielerposfeld(i)="":spielernummerfeld(i)=0
offensivstaerkefeld(teamspieler,i)=0:defensivstaerkefeld(teamspieler,i)=0
         Next

         Select wahlaufstellung; DIVISIORAUSWAHL FÜR TAKTISCHE FORMATION
            Case 1 tempdivoff#=3.45:tempdivdef#=7.55
            Case 2 tempdivoff#=3.85:tempdivdef#=7.15
            Case 3 tempdivoff#=3.85:tempdivdef#=7.15
            Case 4 tempdivoff#=4.25:tempdivdef#=6.75
            Case 5 tempdivoff#=4.65:tempdivdef#=6.35
            Case 6 tempdivoff#=4.65:tempdivdef#=6.35
            Case 7 tempdivoff#=5.05:tempdivdef#=5.95
         End Select

            offensivstaerke(teamspieler)=0; BERECHNUNG DER OFFENSIV- UND DEFENSIVSTÄRKE DES TEAMS
            defensivstaerke(teamspieler)=0
         For i = 1 To 11
            offensivstaerke(teamspieler)=offensivstaerke(teamspieler)+offensivstaerkefeld(teamspieler,i)
            defensivstaerke(teamspieler)=defensivstaerke(teamspieler)+defensivstaerkefeld(teamspieler,i)
         Next
            offensivstaerke(teamspieler)=offensivstaerke(teamspieler)/tempdivoff
            defensivstaerke(teamspieler)=defensivstaerke(teamspieler)/tempdivdef

         DrawImage sonstige(32),800,120; ANZEIGE DEROFFENSIV- UND DEFENSIVSTÄRKE DES TEAMS
         DrawImage sonstige(33),900,120
         SetFont schrift3      
         Text 840,170,offensivstaerke(teamspieler)
         Text 940,170,defensivstaerke(teamspieler)
                        
         If MouseDown(1)=0 Then FlushMouse
         DrawImage maus,MouseX(),MouseY()
         WaitTimer timercpu
         Flip
      Until MouseHit(2)
   End Function
   

Addi

BeitragMi, März 20, 2013 14:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaube eher, dass das daran liegt, dass du MouseHit() mehrmals hintereinander aufrufst ohne den Buffer zu leeren.
Probiere mal aus MouseHit() zwischen zu speichern und dann über die Variable zu gehen.
BP/B3D/BMax : Lerne Java : Früher mal Lite-C : Gewinner BCC 62

Xeres

Moderator

BeitragMi, März 20, 2013 16:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie Addi schon sagte, wird es an der Mausbutton Abfrage liegen - denn B+ schaut in den Puffer und löscht ihn danach.
Man könnte den ganzen Code in jedem Fall hübscher machen:
- Konstanten benutzen: Die ganzen magischen, losen Zahlen da drin sagen ausschließlich dir was und sind zudem schlecht zu warten. Auch diese String Abfragen können bei genügender Anzahl deutlich langsamer sein als Zahlen - und sind wiederum Fehleranfällig.
- Lass den Unsinn, mit Doppelpunkt mehrere Befehle in eine Zeile zu quetschen - dafür gibt es keinen guten Grund, du machst es dir nur künstlich schwerer.
- Ziehe Types vor, wenn es Sinn macht. Spielername, nummer usw. sind in einem Objekt viel besser aufgehoben.
- Den Code einfach so runter zu tippen geht zum testen in Ordung, aber spätestens jetzt solltest du das alles in Funktionen abkapseln.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

bmurray

BeitragMi, März 20, 2013 21:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die Tipps, dann werde ich den Code mal dahingehend umschreiben. Bezüglich den Spielerattributen dachte ich, dass DIM-Arrays besser sind, weil die Anzahl ja relativ konstant bleibt (Jedes Team mit maximal 30 Spielern). Da man Types, so wie ich das bisher verstanden hab, nicht direkt ansprechen kann (also nur mit NEXT, LAST, BEFORE, etc.) schien mir das auch der bessere Weg zu sein.

Lobby

BeitragMi, März 20, 2013 21:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Man kann auch ein Array aus Type-Objekten machen. Das könnte dann zum Beispiel so aussehen. BlitzBasic: [AUSKLAPPEN]
Dim players.TPlayer(10)

;Spieler erstellen und in das Array einfügen
For i = 0 To 10
player.TPlayer = New TPlayer
player\prename = "Spieler " + i
player\sucname = "Testificate" + Rand(0,1000)
players(i) = player
Next

;Spieler durchgehen und Vor- und Nachnamen ausgeben
For i = 0 To 10
player.TPlayer = players(i)
Print player\prename + " - " + player\sucname
Next
WaitKey

Type TPlayer
Field prename$
Field sucname$
End Type

Und schon hat man die Informationen über Spieler schön gekapselt.

bmurray

BeitragDo, März 21, 2013 9:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Types... Ich glaube, so langsam verstehe ich das. Ich habe deinen Code jetzt mal für mein Programm übersetzt:

Code: [AUSKLAPPEN]
Dim players.Tplayer(18,35)

   For i = 1 To 18
      Local dateispielerteam$,dateihandlespielerteam%
      dateispielerteam="data\spieler\ger"+i+".txt"
      dateihandlespielerteam=ReadFile(dateispielerteam)
      For j = 1 To 35
         player.Tplayer = New Tplayer
         player\vorname$ = ReadLine(dateihandlespielerteam)         
         player\nachname$ = ReadLine(dateihandlespielerteam)         
         player\position$ = ReadLine(dateihandlespielerteam)
         player\nummer = ReadLine(dateihandlespielerteam)
         player\staerke = ReadLine(dateihandlespielerteam)
         player\talent = ReadLine(dateihandlespielerteam)
         player\alter = ReadLine(dateihandlespielerteam)
         player\nationalitaet = ReadLine(dateihandlespielerteam)
         players(i,j) = player
      Next
   Next
   CloseFile dateihandlespielerteam

;Spieler von Team 1 anzeigen:
i=1
For j = 1 To 35
   player.TPlayer = players(i,j)
   Print player\vorname+player\nachname
Next

Type Tplayer
   Field vorname$
   Field nachname$
   Field position$
   Field nummer%
   Field staerke%
   Field talent%
   Field alter%
   Field nationalitaet%
   Field motivation%
   Field kondition%
   Field frische%
   Field gehalt%
   Field vertragsdauer%
End Type



Zitat:
players(i,j) = player
Genau damit kann ich nun die Spieler ansprechen?! Das war mein Problem bisher, warum ich Types ausgewichen bin.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group