Was soll man als Neuling lernen bzw. wo ??
Übersicht

![]() |
TimBo |
![]() Antworten mit Zitat ![]() |
---|---|---|
du kannst als Vergleichsoperator auch < und > benutzen bzw. <= und >= | ||
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31 hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht. |
Stani |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ok die einzigsten Problemm sind im Moment:
-Die Ball Grenze -Die Ballbewegung hier ist nochmal der auktuele Code:Code: [AUSKLAPPEN] Graphics 1024,768,32,1
SetBuffer BackBuffer() Local timer = CreateTimer(200) Global brett1 = LoadImage("brett.bmp") MidHandle brett1 Global brett2 = LoadImage("brett.bmp") MidHandle brett2 Global ball = LoadImage("ball.bmp") MidHandle ball Global x1%,y1%,x2%,y2%,xpos%,ypos% Type Spieler Field name$ Field leben% Field Punkte% End Type Global Spieler1.Spieler Global Spieler2.Spieler Spieler1 = New Spieler Spieler2 = New Spieler xpos = 512 ypos = 384 x1=10 y1=350 x2=1000 y2=350 Spieler1\name$ = Input("Spieler1 Name : ") Spieler2\name$ = Input("Spieler2 Name : ") Spieler1\leben% = 3 Spieler1\Punkte% = 0 Spieler2\leben% = 3 Spieler2\Punkte% = 0 Repeat Cls Text 380,0 ,"Spieler1 Name: " + Spieler1\name$ Text 380,10, "Leben : " + Spieler1\leben% Text 380,20, "Punkte: " + Spieler1\Punkte% Text 380,728,"Spieler2 Name: "+ Spieler2\name$ Text 380,748,"Leben : "+ Spieler2\leben% Text 380,738,"Punkte: " + Spieler2\Punkte% Steuerung() ;Steuerfunktion für Bretter Grenze() ;Grenze für Grafiken Ballmove() DrawImage brett1,x1,y1 DrawImage brett2,x2,y2 DrawImage ball,xpos,ypos Flip Until KeyDown(1) End ;Functionen Function Steuerung() If KeyDown(17) = 1 Then y1 = y1-3 End If If KeyDown(31) = 1 Then y1 = y1+3 End If If KeyDown(200) = 1 Then y2 = y2 -3 End If If KeyDown(208) = 1 Then y2 = y2 +3 End If End Function Function Grenze() If y1 > 726 Then y1 = 726 End If If y1 < 42 Then y1 = 42 End If If y2 > 726 Then y2 = 726 End If If y2 < 42 Then y2 = 42 End If End Function |
||
![]() |
TimBo |
![]() Antworten mit Zitat ![]() |
---|---|---|
in wiefern ist die Ballgrenze noch ein Problem ? | ||
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31 hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht. |
Stani |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich weiß ja nicht.Bei den Brettern gab es ja keine x Achse(die war immer gleich) d.h man musste nur sagen wenn das beim 42Pixel ist(Beispiel) so das 42 sein aber bei dem Ball müste ich ja für den einzelnen Pixel ein if clause machen oder ich mach sone line und mach das mit collide aber ich weiß ja nicht wie das mit dem abpralwinkel ist. | ||
![]() |
Jo0oker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Für so eine Grenze würde ich trotzdem IMMER eine Variable empfehle.
Weil was machst du, wenn du die "Grenze" verschieben willst? Genau, du musst alle 42 in deinem Quellcode suchen, und was ist, wenn du auf einmal eine falsche Zahl verändert hast? Also, trotzdem eine Variable nehmen. Von mir aus auch eine Konstante! lg Jo0oker |
||
Tehadon, das kostenlose 3D RPG
www.tehadon.de http://www.blitzforum.de/worklogs/14/ Das Abenteuer wird beginnen! |
Stani |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Wie soll ich die den machen???
Ich weiß nicht wie ich das zusammenfassen soll.ich kann ja nicht 1024x768 If befehle machen. |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du musst nicht einzelne Pixel auf Kollision mit irgendwas prüfen - nur die Koordinaten auf die du den Ball zeichnest. Sieht in deinem letzten Code doch gut aus. Du könntest halt nur eben Konstanten für Grafikbreite, -höhe und die 42 Einsetzen um das ganze Les- und änderbarer zu machen. | ||
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) |
![]() |
Jo0oker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mach doch einfach:
Code: [AUSKLAPPEN] Global iGrenze% = 42 Und überall wo du die Grenze brauchst, nimmst du jetzt nicht mehr 42 sondern iGrenze. Und wenn du jetzt die Grenze nämlich änderst willst, zum Beispiel auf Grund einer neuen/anderen Auflösung, musst du die 42 nur einmal ändern, und das ist bei der zuweisung von iGrenze% = 42! Verstehste? lg Jo0oker |
||
Tehadon, das kostenlose 3D RPG
www.tehadon.de http://www.blitzforum.de/worklogs/14/ Das Abenteuer wird beginnen! |
![]() |
Hubsi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mit den anderen Vergleichsoperatoren wie z.B. < und > sind das nur ein paar wenige Zeilen. Beispiel ungetestet:
BlitzBasic: [AUSKLAPPEN] If xpos>irgendwas Then bewegungsrichtung umkehren So kann der Ball/das Brett schonmal nicht weiter als die von Dir definierte Grenze und dreht um. Edit: Etwas langsam heute ![]() |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
Stani |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
joa jetzt hab ichs langsam verstanden:D
Ah ja das mit den 42 ist nur bei den Brettern,weil ich den bezugspunkt in die mitte gelegt habe und ich die halbieren muss um zu wissen wo die Grenze ist. Ich hab ja schon xpos und ypos für den Ball und x1,x2.,... für die "Schläger" Könnt ihr ein Beispiel machen??Währe nett. Das Problemm ist ,dass ich auch garnicht weiß wie ich den Ball bewegen soll.Er muss ja immer neu gezeichnet werden und wenn ich eine Schleife machen geht das ja nicht wenn ich immer xpos =xpos +1 mach.Bitte gehbt mir ein Beispiel oder ein kleines Programm wo ein ball rumflliegt. Danke |
||
Stani |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
So hab das mal jetzt fertig gemacht.Aber irgendwie geht das mit der Collision nicht.
Code: [AUSKLAPPEN] Global xmax=1024,ymax=768 Graphics xmax,ymax,32,1 SetBuffer BackBuffer() AppTitle "Ping Pong Stani" Local timer = CreateTimer(200) Global brett1 = LoadImage("brett.bmp") ;Spieler1brett MidHandle brett1 Global brett2 = LoadImage("brett.bmp") ;Spieler2brett MidHandle brett2 Global ball = LoadImage("ball.bmp") ;ball MidHandle ball Global x1%,y1%,x2%,y2% ;Die ganzen x,y Koordinaten Global bg=LoadImage("bg.bmp") Type Spieler ;Erzeuge Spieler Field name$ Field leben% Field Punkte% End Type Global Spieler1.Spieler ;Erzeuge Spieler1,Spieler2 Global Spieler2.Spieler Global treffer1 =25 Global treffer2 =999 Spieler1 = New Spieler Spieler2 = New Spieler x1=10 ;Position der Bretter y1=350 x2=1014 y2=350 Spieler1\name$ = Input("Spieler1 Name : ") ;Namensabfrage Spieler2\name$ = Input("Spieler2 Name : ") Spieler1\leben% = 3 ;Leben und punkte Spieler1\Punkte% = 0 Spieler2\leben% = 3 Spieler2\Punkte% = 0 Type Balldaten Field xpos# Field ypos# Field movex# Field movey# Field speed# End Type For a=1 To 1 balls.Balldaten=New Balldaten balls\xpos#=Rand(600)+12 balls\ypos#=Rand(400)+12 balls\movex#=Rnd(2)-1 balls\movey#=Rnd(2)-1 balls\speed#=Rnd(2)+4 Next Repeat ;Mainloop Cls For balls.Balldaten =Each Balldaten balls\xpos#=balls\xpos#+(balls\movex#*balls\speed#) balls\ypos#=balls\ypos#+(balls\movey#*balls\speed#) ; check for screen limits If balls\ypos#<0 Then balls\movey#=1 If balls\ypos#>768-25 Then balls\movey#=-1 If balls\xpos#<25 Then balls\movex#=1 If balls\xpos#>1024-25 Then balls\movex#=-1 ; check for colisions with other balls DrawImage ball,balls\xpos#,balls\ypos#,0 Next Text 10,0 ,"Spieler1 Name: " + Spieler1\name$ ;Abfrage Text 10,10, "Leben : " + Spieler1\leben% Text 10,20, "Punkte: " + Spieler1\Punkte% Text 750,728,"Spieler2 Name: "+ Spieler2\name$ Text 750,748,"Leben : "+ Spieler2\leben% Text 750,738,"Punkte: " + Spieler2\Punkte% Steuerung() ;Steuerfunktion für Bretter Grenzebretter() ;Grenze für Bretter Daneben1() Daneben2() DrawImage brett1,x1,y1 ;Bilder zeichen DrawImage brett2,x2,y2 If Spieler1\leben% = 0 Gameover() If Spieler2\leben% = 0 Gameover() End If End If Flip Until KeyDown(1) End ;Functionen Function Steuerung() ;Steuerfunction If KeyDown(17) = 1 Then y1 = y1-7 End If If KeyDown(31) = 1 Then y1 = y1+7 End If If KeyDown(200) = 1 Then y2 = y2 -7 End If If KeyDown(208) = 1 Then y2 = y2 +7 End If End Function Function Grenzebretter() ;Grenze der bretter If y1 > 726 Then y1 = 726 End If If y1 < 42 Then y1 = 42 End If If y2 > 726 Then y2 = 726 End If If y2 < 42 Then y2 = 42 End If End Function Function Daneben2() If Not ImagesOverlap(brett1,x2,y2,ball,xpos#,ypos#) And xpos# = treffer2 =1 Then ;Wenn Spieler2 den ball durchlässt Spieler1 \Punkte% = Spieler1\Punkte% +2 Spieler2\leben% = Spieler2\leben% -1 End If End Function Function Daneben1() If Not ImagesOverlap(ball,xpos#,ypos#,brett1,x1,y1) And xpos# =treffer1 =1 Then ;Wenn Spieler1 den ball durchlässt Spieler1\leben% = Spieler1\leben% -1 Spieler2\Punkte% = Spieler2\Punkte% + 2 End If End Function Function Gameover() Text xmax/2,ymax/2, " Das Spiel ist vorbei" End End Function Edit:Man ich kann viel besser denken wenn ich was geschreiben hab:D Also ich hab das mal mit Overlap versucht.Nur ich brauch noch diesen befehl(bei C++ ist das &&),der wenn beidens geschieht irgendwas macht. |
||
![]() |
count-doku |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi,
-erstmal ein Tipp zu LoadImage, du musst das Bild nicht 2mal laden! Du kannst es viel Speicherschonender mit CopyImage ![]() -Wenn du schon Types machst, dann mach auch die Koordinaten mit rein. -Das mit Overlap müsste eigentlich funzen. Probiers mal so:BlitzBasic: [AUSKLAPPEN] Global xmax=1024,ymax=768 Dein Problem war, dass die Bedingung in Daneben1 und Daneben2 nur wahr wird, wenn der Ball genau auf pos. 20 / 1005 ist. mfg, count-doku |
||
Stani |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Das geht nicht.Er zählt einfach.Irgendwas mit dem And xpos# = 25.....stimmt nicht.Den da steht ja wenn er nicht collidirt und ... also muss das der Fehler sein... | ||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn an dem Bild keine Veränderungen vorgenommen werden, muss man das Bild nicht mal kopieren... einfach zwei mal das gleiche Bild an verschiedenen Positionen zeichnen. | ||
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) |
![]() |
TimBo |
![]() Antworten mit Zitat ![]() |
---|---|---|
CopyImage ist speicherschonender als LoadImage ? eh ned . ![]() |
||
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31 hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht. |
![]() |
Hubsi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Sowie ich den Code jetzt überflogen habe werden die Brettbilder nicht verändert, von daher reicht schon ein übergeben des Handles. brett2 = brett1 oder ähnlich. So wird kein Grakaspeicher sinnlos verbraten. | ||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
Stani |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Aber was ist den jetzt mit der Collisions abfrage.Die geht nicht und ich verzweifle irgendwie ,weil das eigendlich ales richtig aussieht. | ||
Stani |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Also hallo erstmal.Ich war im Urlaub und konnte nichts schreiben bzw. machen.
Ich hab noch eine Frage aber jetzt zu was anderem.Ich versuch jetzt die ersten 3D Sachen.Dabei hab ich mir ein Terain gemacht mit einer Textur(Grass),einem Würfel der da wie ein Lawastein steht und ein Baum.Jetzt hab ich das mal mit einer Hightmap gemacht.Ich ja die Y Achse begrenzen ,damit man nicht irgendwie unter den Boden geht. So jetzt will ich aber auf diesen "Bergen" laufen können.Wie geht das?? Und noch was.In allen spielen kann man die Maus zur Umsiht benutzen.Aber bei mir ist es so,dass ich entweder mit den Pfeiltasten mich drehen,nach vor und nach hinten gehen kan oder wieder mit der maus,aber man kann wie der überall hin(oben,unten........).Wie mach ich das,dass ich mit der Maus gleichzeitig umschauen und "gehen" kann(ein bischen unverstädnlich) Ah ja ich wünsche allen frohe Ostertage:D Danke |
||
![]() |
das wurgel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Falls es dich noch interessiert, ich habe den Pong mal zum laufen gebracht und kommentiert.
Code: [AUSKLAPPEN] Const xmax=1024,ymax=768 ; Können Konstant sein, werden im weiteren Programmverlauf nicht mehr verändert
Graphics xmax,ymax,32,2 ; 1 SetBuffer BackBuffer() AppTitle "Ping Pong Stani" Local timer = CreateTimer(60);(200) 60 reicht aus, da der Bildschirm im Normalfall eh nur 60 Bilder/sec anzeigt Global brett1 = LoadImage("brett.bmp") ;Spieler1brett MidHandle brett1 Global brett2 = brett1 ;Spieler2brett ist das selbe bild, wie Spieler1brett. ;Beide variablen verweisen nun auf das selbe bild im Speicher Global ball = LoadImage("ball.bmp") ;ball MidHandle ball Global bg=LoadImage("bg.bmp") Global spielerbreite=ImageWidth(brett1) ; Spielerbreite ermitteln für späteren Gebrauch ;Erzeuge Spieler Global Spieler1.Spieler = New Spieler ;Erzeuge Spieler1 Global Spieler2.Spieler = New Spieler ;Erzeuge Spieler2 Spieler1\x=spielerbreite/2 ;Die Positionen kann man mit in den Type nehmen Spieler1\y=ymax/2 Spieler2\x=ymax-spielerbreite/2 Spieler2\y=ymax/2 Spieler1\name$ = Input("Spieler1 Name : ") ;Namensabfrage Spieler2\name$ = Input("Spieler2 Name : ") Spieler1\leben% = 3 ;Leben und punkte Spieler1\Punkte% = 0 Spieler2\leben% = 3 Spieler2\Punkte% = 0 For a=1 To 1 balls.Balldaten=New Balldaten balls\xpos#=Rand(600)+12 balls\ypos#=Rand(400)+12 balls\movex=Rand(1)*2-1 ; So ist es entweder 1 oder -1 balls\movey=Rand(1)*2-1 balls\speed#=Rand(2)+4 Next Repeat ;Mainloop Cls DrawBlock bg, 0,0 ; Ich nehme an, dass bg der Hintergrund sein soll For balls.Balldaten =Each Balldaten balls\xpos#=balls\xpos#+(balls\movex*balls\speed#) balls\ypos#=balls\ypos#+(balls\movey*balls\speed#) ; check for screen limits If balls\ypos#<25 Then balls\movey=1 If balls\ypos#>768-25 Then balls\movey=-1 If balls\ypos#>Spieler1\y-42 And balls\ypos#<Spieler1\y+42 ; Prüfen ob der Ball auf der Höhe des Spieler 1 ist If balls\xpos#<25+spielerbreite Then balls\movex=1 ; Wenn ja prallt wer ab EndIf If balls\ypos#>Spieler2\y-42 And balls\ypos#<Spieler2\y+42 ; Das gleiche nochmal mit der anderen Seite If balls\xpos#>1024-25-spielerbreite Then balls\movex=-1 EndIf ; check for colisions with other balls DrawImage ball,balls\xpos#,balls\ypos#,0 Next Text 10,0 ,"Spieler1 Name: " + Spieler1\name$ ;Abfrage Text 10,10, "Leben : " + Spieler1\leben% Text 10,20, "Punkte: " + Spieler1\Punkte% Text 750,728,"Spieler2 Name: "+ Spieler2\name$ Text 750,748,"Leben : "+ Spieler2\leben% Text 750,738,"Punkte: " + Spieler2\Punkte% Steuerung() ;Steuerfunktion für Bretter Grenzebretter() ;Grenze für Bretter Daneben() ;Prüffunktion ob Ball aus dem Bildschirm geflogen ist DrawImage brett1,Spieler1\x,Spieler1\y ;Bilder zeichen DrawImage brett2,Spieler2\x,Spieler2\y ; So wird Spieler2\leben nur abgefragt, wenn Spieler1\leben auch 0 ist. ; If Spieler1\leben = 0 ; Gameover() ; If Spieler2\leben% = 0 ; Gameover() ; ; End If ; End If ; Spieler Leben abfragen If Spieler1\leben = 0 Gameover() End If If Spieler2\leben = 0 Gameover() End If WaitTimer timer ; Ohne Waittimer bringt dir der timer nichts Flip 0 ; 0, damit Flip nicht das warten übernimmt. Until KeyDown(1) End ; Die Types kannst du überall hinschreiben. Ich hab sie mal hierhin getan. Type Spieler Field name$ Field leben% Field Punkte% Field x, y End Type Type Balldaten Field xpos# Field ypos# Field movex;# Da hier nur +1 und -1 reinkommt, braucht man keine Floats Field movey;# Field speed# End Type ;Functionen Function Steuerung() ;Steuerfunction If KeyDown(17) = 1 Then Spieler1\y = Spieler1\y-7 End If If KeyDown(31) = 1 Then Spieler1\y = Spieler1\y+7 End If If KeyDown(200) = 1 Then Spieler2\y = Spieler2\y -7 End If If KeyDown(208) = 1 Then Spieler2\y = Spieler2\y +7 End If End Function Function Grenzebretter() ;Grenze der bretter If Spieler1\y > ymax-42 Then Spieler1\y = ymax-42 End If If Spieler1\y < 42 Then Spieler1\y = 42 End If If Spieler2\y > ymax-42 Then Spieler2\y = ymax-42 End If If Spieler2\y < 42 Then Spieler2\y = 42 End If End Function Function Daneben() For balls.Balldaten =Each Balldaten If balls\xpos < -25 ; Ball ist links aus dem Bild geflogen Spieler1\leben=Spieler1\leben-1 ; Leben abziehen ; Ball reinitialisieren balls\xpos#=Rand(600)+12 balls\ypos#=Rand(400)+12 balls\movex=Rand(1)*2-1 balls\movey=Rand(1)*2-1 balls\speed#=Rand(2)+4 EndIf If balls\xpos > 1024+25 ; Ball ist rechts aus dem Bild geflogen Spieler2\leben=Spieler2\leben-1 ; Leben abziehen ; Ball reinitialisieren balls\xpos#=Rand(600)+12 balls\ypos#=Rand(400)+12 balls\movex=Rand(1)*2-1 balls\movey=Rand(1)*2-1 balls\speed#=Rand(2)+4 EndIf Next End Function Function Gameover() Cls FlushKeys() ; Damit vorherige Tastendrücke nicht mehr von Waitkey() registriert werden Text xmax/2,ymax/2, " Das Spiel ist vorbei", 1, 1 ; 1,1 um den text zu zentrieren Flip ; Damit man den text auch sieht WaitKey() ; Auf Tastendruck warten; Wenn das Programm direkt dannach zuende ist, sieht man ihn nicht mehr. End End Function Lies dir das ganze nochmal durch und versuche es zu verstehen. Für die zweite Frage mach lieber nen neuen Thread auf, denn sie hat mit diesem hier nichts mehr zu tun. Gib dem neuen Thread diesmal einen Sinvollen Namen, damit man schonmal weis worum es geht. |
||
1 ist ungefähr 3 |
Stani |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ok danke sehr ich habs mir mal durchgelesen und weiß jetzt wo der fehler lag. | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group