Bild flimmert!

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Mathe

Betreff: Bild flimmert!

BeitragMo, Jun 23, 2008 20:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Leute,

ich programmiere jetzt seit einiger Zeit mit Blitz3D und probiere gerade mein zweites TicTacToe mit Menüs usw... zu programmier! Nun jetzt hab ich ein Problem wenn ich mit meiner Abfrage (Rotgekennzeichnet) die Kreuz & Kreis abfrage mache flimmert das Bild (Die Kreise und Kreuze) jetzt wollt ich mal fragen ob es möglich wäre die Schleife ein wenig umzubauen, dass das blöde Flimmern aufhört!!!

Mein Code ist glaub ich nicht gerade übersichtlich aber er dürfte eigentlich nicht ganz so falsch sein!!!
Der Code ist noch länger änderungen mit Variablen hab ich schon ausprobiert!!! Den CreateTimer wollte ich nicht weiter rauf setzen, weils sonst die PCLast zu hoch wird!!!

Wichtiges:

SetA% = Ist der Anzeigemodus(Vollbild, Fenster)
In diesem Spiel gibt es insgesammt 3 Auflösungen(640x480/800x600/1024x768)
Menüs sind Komplett fertig!

Code: [AUSKLAPPEN]

.Player1
WaitMouse
framerate = CreateTimer(30)
Repeat
   FlushMouse
   WaitTimer(framerate)
   SetBuffer BackBuffer()
   Cls
   X = MouseX()
   Y = MouseY()
   If SetA% = 1 Then DrawImage Curser1, X,Y
   DrawImage Play1, 0,0
   Flip
   
   
   [color=red]; Kreuz & Kreis abfrage! (800x600)[/color]
   If Xkoors% = 800 Then
      ; Kreuz abfrage!
      If KreuzPlay(0) = 1 Then DrawImage Kreuz, 250 + 10, 150 + 10
      If KreuzPlay(1) = 1 Then DrawImage Kreuz, 350 + 10, 150 + 10
      If KreuzPlay(2) = 1 Then DrawImage Kreuz, 450 + 10, 150 + 10
      If KreuzPlay(3) = 1 Then DrawImage Kreuz, 250 + 10,250 + 10
      If KreuzPlay(4) = 1 Then DrawImage Kreuz, 350 + 10, 250 + 10
      If KreuzPlay(5) = 1 Then DrawImage Kreuz, 450 + 10, 250 + 10
      If KreuzPlay(6) = 1 Then DrawImage Kreuz, 250 + 10, 350 + 10
      If KreuzPlay(7) = 1 Then DrawImage Kreuz, 350 + 10, 350 + 10
      If KreuzPlay(8) = 1 Then DrawImage Kreuz, 450 + 10, 350 + 10
      ; Kreis abfrage
      If KreisPlay(0) = 1 Then DrawImage Kreis, 250 + 10, 150 + 10
      If KreisPlay(1) = 1 Then DrawImage Kreis, 350 + 10, 150 + 10
      If KreisPlay(2) = 1 Then DrawImage Kreis, 450 + 10, 150 + 10
      If KreisPlay(3) = 1 Then DrawImage Kreis, 250 + 10,250 + 10
      If KreisPlay(4) = 1 Then DrawImage Kreis, 350 + 10, 250 + 10
      If KreisPlay(5) = 1 Then DrawImage Kreis, 450 + 10, 250 + 10
      If KreisPlay(6) = 1 Then DrawImage Kreis, 250 + 10, 350 + 10
      If KreisPlay(7) = 1 Then DrawImage Kreis, 350 + 10, 350 + 10
      If KreisPlay(8) = 1 Then DrawImage Kreis, 450 + 10, 350 + 10
      Flip
      Verwendung% = 1
   EndIf    
   
   ; ZeichnenPlayer1 (800x600)       
   If Xkoors% = 800 And X <= 350 And Y <= 250 And X >= 250 And Y >= 150 And MouseDown(1) Then
      If Vorhanden(0) = 1 Then Goto MeldungPlayer1
      
      WarnungFont = LoadFont ("Arial Black", 20)
      DrawImage Warnung, Xkoors/2 - 150, Ykoors/2 - 50
      Locate Xkoors/2 - 20, Ykoors/2 + 20
      SetFont WarnungFont
      Color 127,0,0
      WarnungFrage$ = Input("j/n: ")
      If Warnungfrage$ = "n" Goto Player1
      
      
      If WarnungFrage$ = "j" Then
         DrawImage Kreuz,350 + 10,250 + 10
         KreuzPlay(0) = 1
         Vorhanden(0) = 1
         Spieler% = 2
         Flip
      EndIf
   EndIf
usw......
Until Spieler% = 2



Mfg.
Matthias

BladeRunner

Moderator

BeitragMo, Jun 23, 2008 21:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry, aber dein Code ist recht fehlerhaft.

1. Gewöhn Dir an Code einzurücken, dann ist er wesentlich übersichtlicher.
2. In die Hauptschleife gehört nur ein cls und ein flip, denn sonst flimmert es.
3. setbuffer Backbuffer gehört vor die Schleife
4. all die if kreuzplay()-abfragen könntest Du bequem zusammenfassen indem Du mit for-next durch alle gehst, also for i = 0 to 9: if kreuzplay(i) = 1 then ...
5. GOTO ist böse. versuche darauf zu verzichten. Goto ist in 99% der Fälle leicht zu ersetzen und es macht den Code übersichtlicher wenn man es nicht drin hat.
6. ich nehme mal an das Kreuzplay() und Kreisplay() DIMs sind, wenn ja, kannst Du die ohne Probleme zu einem Array zusammenfassen indem Du einfach die Spielernummer einträgst (also leer=0, spieler1 = 1, spieler2 =2) und die mit if-Then abfragst.

Mein Tip wäre es den Code nochmal neu aufzusetzen, nachdem Du dir vorher ein paar Gedanken zur Struktur gemacht hast.

Grundlage für eine Spielschleife Pseudocode, d.h er zeigt nur das Prinzip und ist so nicht lauffähig):

Code: [AUSKLAPPEN]
graphics
setbuffer backbuffer()
seedrnd millisecs()

;Lade alle Daten
;Dimensioniere alle Arrays
;setzen des/der Timer(s)

repeat ;Mainloop
    ;eingaben des/der Spieler
    ;verarbeitung der Eingabe
    ;Zeichnen aller Ausgaben
    flip: cls
   waittimer()
until keyhit(1)
 ;alle ausgelagerten und benötigten Funktionalitäten. Functions sind wesentlich übersichtlicher als goto und in sich gekapselt und stellen 'selbsterstellte' Befehle dar
function xxx()
 bla blub
end function
function yyy(wert,blub)
  print blubber
 ...
end function
function zzz
...
...
...


EDIT: Vergiuss erstens, das war vor deinem Edit nur nicht so zu sehen.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

BadDeath

BeitragMo, Jun 23, 2008 21:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich sehe da 2x Flip 1 drin, was schon komisch ist, da das 1. kommt, bevor du die Bilder malst... Dann hast du noch eine Timer drin, was an sich auch richtig ist, nur bringt er etwas, wenn du "Flip 0" verwendest. Desweiteren setzt du noch den Backbuffer am Anfang der Schleife, weiß nicht, ob das was aus macht, ich mache das nicht.

Strukturiere am besten deine Schleife um:
Code: [AUSKLAPPEN]

SetBuffer Backbuffer()
Repeat
     ;deine Abfragen und Bilder malen
     Flip 0
     Waittimer (framerate)
Until Spieler% = 2
 

snörkl

BeitragMo, Jun 23, 2008 21:15
Antworten mit Zitat
Benutzer-Profile anzeigen
edit: ok, also gegen bladerunner komm ich nicht an, insofern nehm ich mal den post raus, ausführlicher hhätt ichs net schreiben können
 

Mathe

BeitragDi, Jun 24, 2008 13:51
Antworten mit Zitat
Benutzer-Profile anzeigen
okey vielen Dank für die schnelle und auführliche Hilfe!

mfg.
Matthias
 

Mathe

BeitragDi, Jun 24, 2008 18:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Noch ne Kurze Frage wenn ich so eine Funktion schreib wie unten gezeigt wird ist das richtig? (Achtung ist nur ein Beispiel hat mit meinen Programm nichts zu tun!)

Code: [AUSKLAPPEN]

For I = 1 To 10
   Schreiben(I,"Super",23)
Next
WaitKey


Function Schreiben(I,Texxt$,groesse%)
   SetBuffer BackBuffer()
   Texxxt = LoadFont ("Arial Black", groesse%)
   SetFont Texxxt
   r = Rand(255)
   g = Rand(255)
   b = Rand(255)
   Color r%,g%,b%
   Text I*15,I*15, Texxt$
   Text I*15 + 80,I*15, Texxt$
   Text I*15 + 80 + 80,I*15, Texxt$
   Flip
   Return Schreiben
End Function


Mfg.
Matthias

Thorsten

BeitragDi, Jun 24, 2008 18:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Schau dir nochmal Return an!
Der Rest ist theoretisch richtig, je nachdem was du im speziellen damit erreichen willst.

Diesen Part hier aus der Hilfe :
BB-Hilfe hat Folgendes geschrieben:
2. Return wird in einer Funktion (Function) verwendet
An eine Funktion können Werte übergeben werden. Nach der Berechnung kann (muss aber nicht) ein Wert zurückgeliefert werden.


mfG,

Thorsten

Xeres

Moderator

BeitragDi, Jun 24, 2008 18:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Auf Flip und Setbuffer würde ich innerhalb einer Zeichenfunktion verzichten.
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)
 

Mathe

BeitragMi, Jun 25, 2008 14:12
Antworten mit Zitat
Benutzer-Profile anzeigen
okey danke für die Hilfe aber zwei Fragen hab ich noch

1. Gibt es so etwas wie Functions, Types, etc. wo ich z.B Bilder laden kann und die als Global Variablen erstellt werden? Weil in eine Function geht es ja nicht!!!
2. Warum wird in eine Repeatschleife Waittimer ans Ende gesetzt hat das einen bestimmten Grund?

mfg.
Matthias

Thorsten

BeitragMi, Jun 25, 2008 14:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Zu 1 :
Es funktioniert zum Beispiel folgendes :
Code: [AUSKLAPPEN]
Global x

Function Bilder_Laden()

x=LoadImage(..) [ .. ]


End Function


Zu 2 :
Das ist egal.

mfG,

Thorsten
 

Mathe

BeitragMi, Jun 25, 2008 16:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Okey vielen dank!

Mfg.
Matthias
 

Mathe

BeitragSo, Jun 29, 2008 17:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Leute,

weil ich jetzt kein neues thema anfangen möchte schreib ich jetzt hier einfach weiter!!!
Mein TicTacToe ist jetzt fertig nur meine Schleifen sind ewig Lang hab jetzt schon viele Functions eingebaut und verzichte größtenteils auf Goto aber gibt es eine möglich keit diesen Code (untenzusehen) kleiner zu machen? Es geht mir hauptsächlich um die Mausabfrage der Auflösungen (hab 3) und wenn man jedes mal 9 Kästen zum anklicken hat ist der Code halt ewig viel!!

Code: [AUSKLAPPEN]
.................
; Vorhandene Bilder werden gezeichnet   
      Gosub vorhandene_Bilder_zeichnen
   
         ; Mausabfrage 640x480
         ; Kreuz0
         If Xkoors% = 640
            If X <= 245 + 50 And X >= 245 And Y <= 165 + 50 And Y >= 165 And MouseDown(1) Then
               If Vorhanden(0) = 1 Then
                  Meldung(Xkoors%,Ykoors%,150)
                  Goto Player1
               EndIf

            DrawImage Kreuz, 250,170
            Kreuze(0) = 1
            Player% = 2
            Vorhanden(0) = 1
            Warten()
            EndIf
            
         EndIf
         ; Kreuz1
         If Xkoors% = 640
            If X <= 295 + 50 And X >= 295 And Y <= 165 + 50 And Y >= 165 And MouseDown(1) Then
               If Vorhanden(1) = 1 Then
                  Meldung(Xkoors%,Ykoors%,150)
                  Goto Player1
               EndIf

            DrawImage Kreuz, 300,170
            Kreuze(1) = 1
            Player% = 2
            Vorhanden(1) = 1
            Warten()
            EndIf
         EndIf
; Kreuz2
............
; Kreuz8
If Xkoors% = 800 Then
...............
If Xkoors% = 1024 Then
..............



mfg.
Matthias

BladeRunner

Moderator

BeitragSo, Jun 29, 2008 17:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Schau Dir for mal an.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

Mathe

BeitragSo, Jun 29, 2008 17:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Diesen Befehlt verwende ich schon..... mir fälllt aber keine logische Operation ein wie ich dann alle Sachen einbauen kann...., weil wenn man die schleife so aufbaut...(nur Beispiel)

Schleife1 : For A = 1 to 70
Schleife2 : For M = 0 to 8
...... Befehl!
Next
Next

wenn die Schleife 1 Startet.... gehts weiter zu Schleife 2 und die wird dann erst von 0 bis 8 gezählt und dann kommt wieder die Schleife 1 drann und das ist mein Problem!

Wenn dann müsste die (Schleife 1) anfangen also 1 dann die (Schleife 2) = 0 und dann wieder (Schleife 1) = 2 dann wieder die (Schleife 2) = 1... usw....

Das geht ja nicht!

mfg.
Matthias

BladeRunner

Moderator

BeitragSo, Jun 29, 2008 17:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Und warum müsste das so sein?
Code: [AUSKLAPPEN]
for x = 1 to 3
    for y = 1 to 3
        count = count+1
        text x*10,y*10,count
   next
next

alle Felder werden erreicht, die Reihenfolge ist doch primär mal egal.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

Mathe

BeitragSo, Jun 29, 2008 17:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier ist mein kleines Spiel kannst dir ja mal anschauen vielleicht siehst du ja das Problem und könntest mir eventuel ein kleine Code ausschnitt mit Verbesserung schicken!

Hier Downloaden

BladeRunner

Moderator

BeitragSo, Jun 29, 2008 17:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich zeigte dir den Weg schon. Du kannst deine X und Y Koordinaten in einer for-next durchlaufen lassen und so die Grafiken einzeichnen. Spart dir ne Menge Code.
Desweiteren ist es unsinnig 20 mal hintereinander im Code
If Xkoors% = 640 then ... zu haben, einmal reicht, alle befehle die ausgeführt werden sollen dahinter und mit endif abschliessen.
also statt:
Code: [AUSKLAPPEN]
if x then print blub
if x then print bla
if x then print lala


machst du

Code: [AUSKLAPPEN]
if x then
    print blub
    print bla
    print lala
endif


Das gilt an so einigen Stellen in deinem Code.
Desweiteren benutzt Du weiterhin massiv goto, was vollkommen daneben ist.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

Mathe

BeitragSo, Jun 29, 2008 17:50
Antworten mit Zitat
Benutzer-Profile anzeigen
ah okey Goto verschwindet schon noch! War heute so froh dass ich endlich fertig geworden bin!

Wie findest du das Spiel für einen Anfänger?

Mfg.
Matthias

BladeRunner

Moderator

BeitragSo, Jun 29, 2008 18:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Es ist ineffizient programmiert aber es läuft, und schon allein von daher kannst Du stolz auf dich sein. Die Finessen werden noch kommen.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

Mathe

BeitragMo, Jun 30, 2008 14:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo ich bins mal wieder BladeRunner du hast recht gehabt mir For ... Next funktionierts hab jetzt meine Code gekürzt sieh dir das mal an ist das nicht ne Meisterleistung und das noch in der Schule unterm Geschichtsunterricht!!

Code jetzt:
Code: [AUSKLAPPEN]
; Mausabfrage Allgemein für Kreuz
      For Yko = 0 To 2
         For Xko = 0 To 2
            If x <= StartkoordsX% + KKgroesse% + Xko*KKgroesse% And X >= StartkoordsX% + Xko*KKgroesse% And Y <= StartkoordsY% + KKgroesse% + Yko*KKgroesse% And Y >= StartkoordsY% + Yko*KKgroesse% And MouseDown(1) Then
               
               If Xko = 0 And Yko = 1 Then Xko = 3
               If Xko = 1 And Yko = 1 Then Xko = 4
               If Xko = 2 And Yko = 1 Then Xko = 5
               If Xko = 0 And Yko = 2 Then Xko = 6
               If Xko = 1 And Yko = 2 Then Xko = 7
               If Xko = 2 And Yko = 2 Then Xko = 8
                  
                  If Vorhanden(Xko) = 1 Then
                     Meldung(Xkoors%,Ykoors%,KoordNgroesse%)
                     Gosub Player2
                  EndIf
               
               Kreise(Xko) = 1
               Vorhanden(Xko) = 1
               Player = 1
                  
                  If Xko = 3 Or Xko = 6 Then Xko = 0
                  If Xko = 4 Or Xko = 7 Then Xko = 1
                  If Xko = 5 Or Xko = 8 Then Xko = 2
                     
                     DrawImage Kreis, StartkoordsX% + Abstand% + Xko*KKgroesse%, StartkoordsY% + Abstand% + Yko*KKgroesse%
                     Warten()
            EndIf
         Next
      Next




Code davor:
Code: [AUSKLAPPEN]
; Mausabfrage 640x480
         ; Kreuz0
         If Xkoors% = 640
            If X <= 245 + 50 And X >= 245 And Y <= 165 + 50 And Y >= 165 And MouseDown(1) Then
               
               If Vorhanden(0) = 1 Then
                  Meldung(Xkoors%,Ykoors%,150)
                  Gosub Player1
               EndIf

            DrawImage Kreuz, 250,170
            Kreuze(0) = 1
            Player% = 2
            Vorhanden(0) = 1
            Warten()
            EndIf
            ; Kreuz1
            If X <= 295 + 50 And X >= 295 And Y <= 165 + 50 And Y >= 165 And MouseDown(1) Then
               
               If Vorhanden(1) = 1 Then
                  Meldung(Xkoors%,Ykoors%,150)
                  Gosub Player1
               EndIf

            DrawImage Kreuz, 300,170
            Kreuze(1) = 1
            Player% = 2
            Vorhanden(1) = 1
            Warten()
            EndIf
            ; Kreuz2
            If X <= 345 + 50 And X >= 345 And Y <= 165 + 50 And Y >= 165 And MouseDown(1) Then
               
               If Vorhanden(2) = 1 Then
                  Meldung(Xkoors%,Ykoors%,150)
                  Gosub Player1
               EndIf

            DrawImage Kreuz, 350,170
            Kreuze(2) = 1
            Player% = 2
            Vorhanden(2) = 1
            Warten()
            EndIf
            ; Kreuz3
            If X <= 245 + 50 And X >= 245 And Y <= 215 + 50 And Y >= 215 And MouseDown(1) Then
               
               If Vorhanden(3) = 1 Then
                  Meldung(Xkoors%,Ykoors%,150)
                  Gosub Player1
               EndIf
            
            DrawImage Kreuz, 250,220
            Kreuze(3) = 1
            Player% = 2
            Vorhanden(3) = 1
            Warten()
            EndIf
            ; Kreuz4
            If X <= 295 + 50 And X >= 295 And Y <= 215 + 50 And Y >= 215 And MouseDown(1) Then
               
               If Vorhanden(4) = 1 Then
                  Meldung(Xkoors%,Ykoors%,150)
                  Gosub Player1
               EndIf

            DrawImage Kreuz, 300,220
            Kreuze(4) = 1
            Player% = 2
            Vorhanden(4) = 1
            Warten()
            EndIf
            ; Kreuz5
            If X <= 345 + 50 And X >= 345 And Y <= 215 + 50 And Y >= 215 And MouseDown(1) Then
               
               If Vorhanden(5) = 1 Then
                  Meldung(Xkoors%,Ykoors%,150)
                  Gosub Player1
               EndIf
         
            DrawImage Kreuz, 350,220
            Kreuze(5) = 1
            Player% = 2
            Vorhanden(5) = 1
            Warten()
            EndIf
            ; Kreuz6
            If X <= 245 + 50 And X >= 245 And Y <= 265 + 50 And Y >= 265 And MouseDown(1) Then
               
               If Vorhanden(6) = 1 Then
                  Meldung(Xkoors%,Ykoors%,150)
                  Gosub Player1
               EndIf
            
            DrawImage Kreuz, 250,270
            Kreuze(6) = 1
            Player% = 2
            Vorhanden(6) = 1
            Warten()
            EndIf
            ; Kreuz7
            If X <= 295 + 50 And X >= 295 And Y <= 295 + 50 And Y >= 265 And MouseDown(1) Then
               
               If Vorhanden(7) = 1 Then
                  Meldung(Xkoors%,Ykoors%,150)
                  Gosub Player1
               EndIf
   
            DrawImage Kreuz, 300,270
            Kreuze(7) = 1
            Player% = 2
            Vorhanden(7) = 1
            Warten()
            EndIf
            ; Kreuz8
            If X <= 345 + 50 And X >= 345 And Y <= 265 + 50 And Y >= 265 And MouseDown(1) Then
               
               If Vorhanden(8) = 1 Then
                  Meldung(Xkoors%,Ykoors%,150)
                  Gosub Player1
               EndIf
      
            DrawImage Kreuz, 350,270
            Kreuze(8) = 1
            Player% = 2
            Vorhanden(8) = 1
            Warten()
            EndIf
         EndIf


Mfg.
Matthias

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group