Hilfe bei Pure Basic"Achtung Kurve"
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
auch keine schlechte idee.....
Plot mit Farbangabe als einziger Drawing-Befehl in einer Schleife ist übrigens
wesentlich schneller als Plot ohne Farbangabe oder andere Drawing-Befehle.
dafür wird nämlich DirectSurfaceAccess verwendet, das ist wesentlich schneller
als Ausgabe auf den DeviceContext, was die anderen DrawingBefehle verwenden.
mir war heut nacht später noch eingefallen,
man könnte auch die Spur und den Kollisionscheck direkt auf einem Sprite ausführen,
und bei der darstellung dieses Sprite einfach in den hintergrund displayn.
das würde vermeiden, spuren von mehreren hundert punkten in jedem frame plotten zu müssen,
stattdessen plottet man immer nur die aktuellen punkte auf das Sprite,
unddas stellt man in einem rutsch da und fertig.
Plot mit Farbangabe als einziger Drawing-Befehl in einer Schleife ist übrigens
wesentlich schneller als Plot ohne Farbangabe oder andere Drawing-Befehle.
dafür wird nämlich DirectSurfaceAccess verwendet, das ist wesentlich schneller
als Ausgabe auf den DeviceContext, was die anderen DrawingBefehle verwenden.
mir war heut nacht später noch eingefallen,
man könnte auch die Spur und den Kollisionscheck direkt auf einem Sprite ausführen,
und bei der darstellung dieses Sprite einfach in den hintergrund displayn.
das würde vermeiden, spuren von mehreren hundert punkten in jedem frame plotten zu müssen,
stattdessen plottet man immer nur die aktuellen punkte auf das Sprite,
unddas stellt man in einem rutsch da und fertig.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
Guten abend,
PMV hat mich grade auf den Thread aufmerksam gemacht, und da muss ich einfach meinen Senf dazu geben
Hab selber mal einen Kurve-Klon in PB programmiert (Schleichwerbung (ohne source): Kurve.byWulf), und kann euch daher bestens zur (technischen) Seite stehn.
Im Prinzip hab ichs so gemacht: ich hab ein Image erstellt, und darauf die (neuen) Spielerkreise jeden Frame hinzugezeichnet. Die Spielerpositionen hab ich wie folgt bewegt: Für jeden Spieler wurde der Winkel gespeichert, in der er sich bewegt, somit konnte man einfach mit cos(winkel) und sin(winkel) berechnen, wo er sich nun neu befindet. Kollision hat er dann einfach nur die Randpixel der einzelnen Spielerkreise genommen, die Farbe auf dem Image überprüft, wenn schwarz dann weg frei, ansonsten kollision und tot. (ganz vereinfacht dargestellt, war leider bissl trickserei dabei)
Meine Version ist extrem umfangreicher (viel langweilige schulpausen machtens möglich *g*), aber ich kann euch auch gerne in icq aufkommende fragen beantworten.
PMV hat mich grade auf den Thread aufmerksam gemacht, und da muss ich einfach meinen Senf dazu geben

Hab selber mal einen Kurve-Klon in PB programmiert (Schleichwerbung (ohne source): Kurve.byWulf), und kann euch daher bestens zur (technischen) Seite stehn.
Im Prinzip hab ichs so gemacht: ich hab ein Image erstellt, und darauf die (neuen) Spielerkreise jeden Frame hinzugezeichnet. Die Spielerpositionen hab ich wie folgt bewegt: Für jeden Spieler wurde der Winkel gespeichert, in der er sich bewegt, somit konnte man einfach mit cos(winkel) und sin(winkel) berechnen, wo er sich nun neu befindet. Kollision hat er dann einfach nur die Randpixel der einzelnen Spielerkreise genommen, die Farbe auf dem Image überprüft, wenn schwarz dann weg frei, ansonsten kollision und tot. (ganz vereinfacht dargestellt, war leider bissl trickserei dabei)
Meine Version ist extrem umfangreicher (viel langweilige schulpausen machtens möglich *g*), aber ich kann euch auch gerne in icq aufkommende fragen beantworten.

ersteinmal wieder danke
morgen werden wir uns wieder zusammen setzten und knobeln
mit dem beispiel von gnasen sind wir nicht weitgekommen aber durch die neuen tipps werden wir hoffentlich einiges hinkriegen morgen abend kommt ein update von dem was wir geschafft haben...
wir verbleiben mit freundlichen grüßen und einem dickemDANKEan alle die geantwortet haben und uns helfen wollen
:)
Lg

morgen werden wir uns wieder zusammen setzten und knobeln
mit dem beispiel von gnasen sind wir nicht weitgekommen aber durch die neuen tipps werden wir hoffentlich einiges hinkriegen morgen abend kommt ein update von dem was wir geschafft haben...
wir verbleiben mit freundlichen grüßen und einem dickemDANKEan alle die geantwortet haben und uns helfen wollen

Lg
Hallo nochmal
wir sind schon so gut wie fertig danke noch einmal
Das Einzige, das noch nicht so will, ist dass das spiel beendet wird wenn eine Schlange sich selbst oder die andere Schlange trifft und dass der Startpunkt manchmal außerhalb des Bildschirmes gesetzt wird obwohl dem Befehl "Random" gesagt wurde, wo der Bereich ist, wo der Anfangspunkt liegen darf.
Danke schon einmal
wir sind schon so gut wie fertig danke noch einmal

Danke schon einmal

Wo bleiben die Screenshots? 
(Einfach im Spiel die "Druck"-Taste drücken, dann z.B. Paint öffnen und Strg+V)
Schön, dass es gut läuft und Gratulation!
BTW: Zeigt doch mal die Zeilen mit "Random()" oder die Kollisionsabfrage... ausser ihr wollt erstmal selbst eine Weile knobeln, bevor Ihr um weitere Hilfe bittet.

(Einfach im Spiel die "Druck"-Taste drücken, dann z.B. Paint öffnen und Strg+V)

Schön, dass es gut läuft und Gratulation!
BTW: Zeigt doch mal die Zeilen mit "Random()" oder die Kollisionsabfrage... ausser ihr wollt erstmal selbst eine Weile knobeln, bevor Ihr um weitere Hilfe bittet.
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
wir arbeiten dran hier der aktuelle auszug
leider klappt es auf den pc´s zuhause besser als in der schule in der schule bewegen sich die "schlangen" zu schnell hoffe das ist bei euch nicht so.....
wir kriegen es einfach nicht hin die kollisions abfrage richtig hinzukriegen...
leide haben wir es bis jetzt nur geschafft das das spiel beendet wird wenn sie gegen die wand fahren....
in der schule können wir leider nichts hochladen ich guck ma ob ich es heute mittag hinkriege.....
hier mal unser quellcode....
bitte helft uns den rest noch hinzukriegen müssen unerwartet heute abgeben aus anfänglich 10 stunden zeit sind 6 gerworden o.O
leider klappt es auf den pc´s zuhause besser als in der schule in der schule bewegen sich die "schlangen" zu schnell hoffe das ist bei euch nicht so.....
wir kriegen es einfach nicht hin die kollisions abfrage richtig hinzukriegen...
leide haben wir es bis jetzt nur geschafft das das spiel beendet wird wenn sie gegen die wand fahren....
in der schule können wir leider nichts hochladen ich guck ma ob ich es heute mittag hinkriege.....
hier mal unser quellcode....
bitte helft uns den rest noch hinzukriegen müssen unerwartet heute abgeben aus anfänglich 10 stunden zeit sind 6 gerworden o.O
Code: Alles auswählen
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
MessageRequester("Error", "Can't open DirectX 7 or later", 0)
speed.w = 100
End
EndIf
Structure player
x.f
y.f
degree.f
key_left.l
key_right.l
EndStructure
Dim players.player(2)
players(0)\x = Random (200)
players(0)\y = Random (200)
players(0)\degree = Random (1)
players(0)\key_left = #PB_Key_A
players(0)\key_right = #PB_Key_D
players(1)\x = Random(200)
players(1)\y = Random(200)
players(1)\degree = Random (1)
players(1)\key_left = #PB_Key_Left
players(1)\key_right = #PB_Key_Right
speed = speed + 100
If OpenScreen(1024, 768, 16, "Achtung, die Kurve!")
Repeat
ExamineKeyboard()
For i = 0 To 1
If (KeyboardPushed(players(i)\key_left))
players(i)\degree = players(i)\degree - 0.03
EndIf
If (KeyboardPushed(players(i)\key_right))
players(i)\degree = players(i)\degree + 0.03
EndIf
players(i)\x = players(i)\x + Cos(players(i)\degree)
players(i)\y = players(i)\y + Sin(players(i)\degree)
Next i
StartDrawing(ScreenOutput())
For i = 0 To 1
Circle(players(0)\x,players(0)\y,5,RGB($FF,$00,$00))
Circle(players(1)\x,players(1)\y,5,RGB($00,$00,$FF))
Box ( 0, 0 , 25 , 1024 , $66CCFF )
Box ( 999, 0 , 25 , 1024 , $66CCFF )
Box (20, 0, 1024 ,25 , $66CCFF)
Box (0,743, 1024 ,25 , $66CCFF)
Next
StopDrawing()
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape) Or players(0)\x>999 Or players(1)\x>999 Or players(0)\x<25 Or players(1)\x<25 Or players(0)\y>743 Or players(1)\y>743 Or players(0)\y<25 Or players(1)\y<25 Or players(i)\x
MessageRequester(":-(", "Game Over :-P", #PB_MessageRequester_Ok)
EndIf
Aber immer den Radius mit zuzählen, sonst sieht es aus, als würde man schon "drinstecken" ...Circle(players(0)\x,players(0)\y,5,RGB($FF,$00,$00))
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom
Hey! Das sieht ja mal super aus! 
Ich geb' Euch auch mal ein paar allgemeine Tipps:
Mein Mathelehrer hatte immer gesagt: "Um festzustellen wo ein Denkfehler liegt ist es oft eine gute Vorgehensweise, sich mal zu überlegen, was die Extrem-Werte sind."
Das bedeutet folgendes: Random(200) gibt einen Zufallswert zwischen 0 und 200 rück. Dass heißt, bei 2 Variablen (X- und Y-Position) ergeben sich 4 Extremwert-Paare die da wären:
Jetzt überlegt euch mal, wo der entsprechende Punkt jedes Extrempaars auf dem Screen liegen würde. Vielleicht kommt Ihr dann schon drauf, wo der Fehler liegt und wie er sich beseitigen lässt! 
Zwei kleine Tipps gebe ich noch:

Ich geb' Euch auch mal ein paar allgemeine Tipps:
- Einrücken: Um besser zu erkennen wo z.B. eine Schleife anfängt und wo sie aufhört ist es gut, den Inhalt einzurücken. Das geht bei PureBasic einfach, indem ihr den entsprechenden Teil markiert und danach Tab zum Einrücken drückt. Ihr könnt auch mehrmals Tab drücken. Pro Druck wird der Text um 2 Leerzeichen eingerückt. Mit Shift+Tab erreicht ihr das Gegenteil.
Code: Alles auswählen
For i = 0 To 1 If (KeyboardPushed(players(i)\key_left)) players(i)\degree = players(i)\degree - 0.03 EndIf If (KeyboardPushed(players(i)\key_right)) players(i)\degree = players(i)\degree + 0.03 EndIf players(i)\x = players(i)\x + Cos(players(i)\degree) players(i)\y = players(i)\y + Sin(players(i)\degree) Next i
- Kommentare: Es ist praktisch den Quelltext mit Kommentaren zu versehen, damit man nicht den Überblick verliert, wenn der Text irgendwann sehr lang wird. Wenn man ein Semikolon (";") vor einen Textteil setzt, dann wird er als Kommentar angesehen und PureBasic weiß, dass es sich hier nicht um irgendwelche Funktionen handelt. In Kommentare darf man auch Umlaute verwenden (was man sonst im Quelltext nicht darf). Bei PureBasic werden Kommentare in einer anderen Farbe angezeigt, was die Übersichtlichkeit noch erhöht.
Code: Alles auswählen
; Alle Objekte zeichnen StartDrawing(ScreenOutput()) For i = 0 To 1 ; Spieler zeichnen Circle(players(0)\x,players(0)\y,5,RGB($FF,$00,$00)) ; Spieler 1 Circle(players(1)\x,players(1)\y,5,RGB($00,$00,$FF)) ; Spieler 2 ; Rand zeichnen Box ( 0, 0 , 25 , 1024 , $66CCFF ) ; Rand links Box ( 999, 0 , 25 , 1024 , $66CCFF ) ; Rand rechts Box (20, 0, 1024 ,25 , $66CCFF) ; Rand oben Box (0,743, 1024 ,25 , $66CCFF) ; Rand unten Next StopDrawing()
- Kein Messagerequester bei Screens: Vielleicht ist es Euch aufgefallen, dass der Game-Over-Messagerequester manchmal nicht angezeigt wird (bei mir ist das zumindest so). Das liegt daran, dass der gezeichnete Bildschirm erst angezeicht wird, wenn man die Funktion FlipBuffers() aufruft. Man müsste also theoretisch nach MessageRequester() einmal FlipBuffers() aufrufen. Das geht so aber nicht, weil der Messagerequester das Programm so lange anhält, bis man auf OK geklickt hat. Warum der Requester bei mir manchmal trotzdem angezeigt wird ist mir allerdings auch ein Rätsel.
Als "Messagerequester-Ersatz" könntet Ihr z.B. "Game Over! Weiter mit beliebiger Taste" in die Mitte des Screens schreiben und auf einen Tastendruck warten. Darfür würdet Ihr folgende neue Funktionen benötigen:Code: Alles auswählen
DrawText() ; braucht Ihr unbedingt! TextHeight() ; <- könnte hilfreich sein. TextWidth() ; <- könnte hilfreich sein.
Die Zeilen, auf die Ihr Euch bezieht und in denen der Fehler versteckt liegt sind folgende (ich nehme hier mal nur Spieler 1):Ulrich hat geschrieben:(...) was noch nicht so will, ist (...) dass der Startpunkt manchmal außerhalb des Bildschirmes gesetzt wird obwohl dem Befehl "Random" gesagt wurde, wo der Bereich ist, wo der Anfangspunkt liegen darf. (...)
Code: Alles auswählen
players(0)\x = Random (200)
players(0)\y = Random (200)
Das bedeutet folgendes: Random(200) gibt einen Zufallswert zwischen 0 und 200 rück. Dass heißt, bei 2 Variablen (X- und Y-Position) ergeben sich 4 Extremwert-Paare die da wären:
Code: Alles auswählen
; Extremwert-Paar 1:
x = 0
y = 0
; Extremwert-Paar 2:
x = 200
y = 0
; Extremwert-Paar 3:
x = 0
y = 200
; Extremwert-Paar 4:
x = 200
y = 200

Zwei kleine Tipps gebe ich noch:
- Der Startpunkt liegt entgegen Eurer Vermutung nie ausserhalb des Bildschirms!
- Ihr zeichnet erst die beiden Spieler und anschließend den Rahmen
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)