Bild flimmert!
Übersicht

MatheBetreff: Bild flimmert! |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
okey vielen Dank für die schnelle und auführliche Hilfe!
mfg. Matthias |
||
Mathe |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Schau dir nochmal Return![]() 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 |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Mathe |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Okey vielen dank!
Mfg. Matthias |
||
Mathe |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Schau Dir for![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group