Hilfe bei Pure Basic"Achtung Kurve"

Anfängerfragen zum Programmieren mit PureBasic.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
MCWulf
Beiträge: 23
Registriert: 21.03.2005 23:26
Kontaktdaten:

Beitrag von MCWulf »

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. :)
Ulrich
Beiträge: 6
Registriert: 05.03.2009 10:29
Kontaktdaten:

Beitrag von Ulrich »

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
Ulrich
Beiträge: 6
Registriert: 05.03.2009 10:29
Kontaktdaten:

Beitrag von Ulrich »

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 ;)
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Beitrag von Regenduft »

Wo bleiben die Screenshots? :wink:

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

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)
Ulrich
Beiträge: 6
Registriert: 05.03.2009 10:29
Kontaktdaten:

Beitrag von Ulrich »

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

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
Crawler
Beiträge: 110
Registriert: 08.02.2009 19:52
Computerausstattung: PB 4.41
Win7 64bit

Beitrag von Crawler »

Etwas ähnliches hatten wir neulich, als es um das Labyrithspiel ging. Frag doch einfach den Farbwert des Punktes in Bewegungsrichtung ab, ob der der Hintergrundfarbe entspricht. Das macht man über den Befehl Point(x, y). Wenn ja ist die Bewegung möglich, ansonsten ist das Spiel aus.
Benutzeravatar
Bisonte
Beiträge: 2465
Registriert: 01.04.2007 20:18

Beitrag von Bisonte »

Circle(players(0)\x,players(0)\y,5,RGB($FF,$00,$00))
Aber immer den Radius mit zuzählen, sonst sieht es aus, als würde man schon "drinstecken" ...
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​​
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Beitrag von Regenduft »

Hey! Das sieht ja mal super aus! :allright:

Ich geb' Euch auch mal ein paar allgemeine Tipps:
  1. 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
  2. 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()
  3. 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.
So und nun zur Fehlerbeseitigung!
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. (...)
Die Zeilen, auf die Ihr Euch bezieht und in denen der Fehler versteckt liegt sind folgende (ich nehme hier mal nur Spieler 1):

Code: Alles auswählen

players(0)\x = Random (200)
players(0)\y = Random (200)
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:

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
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! :wink:
Zwei kleine Tipps gebe ich noch:
  1. Der Startpunkt liegt entgegen Eurer Vermutung nie ausserhalb des Bildschirms!
  2. Ihr zeichnet erst die beiden Spieler und anschließend den Rahmen
Ich wünsche Euch weiterhin viel Erfolg!
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Antworten