ÐrawMania • (2D-Drawing-Spiele-Serie)

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Macros
Beiträge: 1314
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Beitrag von Macros »

Ich erlaube mir mal, deine Codes immer nach PB 4 zu konvertieren, für die Faulen :D

Code: Alles auswählen

InitSprite()

#b = 0.01745329
Procedure.f Abstand(x1, y1, x2, y2)
 r.f = Sqr(Pow(x1-x2,2)+Pow(y1-y2,2))
 ProcedureReturn r
EndProcedure
Procedure.f Diagonale(x.f,y.f)
 r.f = Sqr(x*x+y*y)
 ProcedureReturn r
EndProcedure
Procedure.f Winkel(x.f,y.f)
 Winkel.f
 If x = 0
  If y <  0 : Winkel = -90 : EndIf
  If y >= 0 : Winkel =  90 : EndIf
 Else
  Winkel = ATan(y/x)/#b
  If x < 0 : Winkel + 180 : EndIf
 EndIf
 If Winkel < 0 : Winkel + 360 : EndIf
 ProcedureReturn Winkel
EndProcedure



Structure P
 Farbe.l ; Farbe
 l.l     ; Teilchenlänge
 x.f     ; x-Position
 y.f     ; y-Position
 dx.f    ; Flugrichtung (in X)
 dy.f    ; Flugrichtung (in Y)
 rw.l    ; Eigenrotationswinkel
 rdw.l   ; Eigenrotationswinkeländerung
EndStructure

Global NewList P.P() ; Partikelliste

; Fügt ein Partikel hinzu mit (Farbe, Posion(x,y), Flugrichtung, Geschwindigkeit, Rotationsgeschwindigkeit)
Procedure AddParticle(Farbe, l, x, y, w.f, v.f, rdw.f)
 AddElement(P())
 P()\Farbe = Farbe
 P()\l = l
 P()\x = x
 P()\y = y
 P()\dx = Cos(w*#b)*v
 P()\dy = Sin(w*#b)*v
 P()\rw = w
 P()\rdw = rdw
EndProcedure
Procedure AddExplosion(Farbe, l, x.f, y.f, Dichte.f, v.f, rdw.f)
 nn = 360*Dichte
 For n = 1 To nn
  AddParticle(Farbe, l, x, y, n/Dichte, Random(v*100)/100+v/2, rdw)
 Next n
EndProcedure

#Gravitation = 0.01 ; bei 0 keine


OpenWindow(1, 300, 0, 600, 600, "2D-Drawing",#PB_Window_MinimizeGadget )
 OpenWindowedScreen(WindowID(1), 0, 0, 600, 600, 0, 0, 0)

Repeat

 Event = WindowEvent()
 Select Event
  Case #PB_Event_CloseWindow
   End
 EndSelect

 ClearScreen(0)
 
 StartDrawing(ScreenOutput())
 
  ResetList(P())
  While NextElement(P())
   ; Gravitation
   P()\dy + #Gravitation
   ; Bewegung
   P()\x + P()\dx
   P()\y + P()\dy
   ; Eigenrotation
   P()\rw + P()\rdw
   ;Anzeige
   Winkel = Winkel(P()\dx,P()\dy)+P()\rw
   x2 = Cos(Winkel*#b)*P()\l
   y2 = Sin(Winkel*#b)*P()\l
   Line(P()\x, P()\y, x2, y2, P()\Farbe)
   ; Deletakontrolle
   If P()\y > 620 : DeleteElement(P()) : EndIf
  Wend
 
 StopDrawing()
 
 FlipBuffers()

 WMx = WindowMouseX(1)
 WMy = WindowMouseY(1)
 
 If GetAsyncKeyState_(#VK_LBUTTON) <> 0
  Druck = 1
 ElseIf Druck = 1
  Druck = 0
  Rot = Random(127)+128
  Gruen = Random(127)+128
  Blau = Random(127)+128
  Laenge = Random(10)+5 ; Wie groß soll eines Teilchens durchschnittlich sein
  Dichte.f = (Random(15)+5)/10 ; Wie viele Teilchen soll es pro 1° geben
  v.f = (Random(20)+5)/10 ; wie schnell sollen die Teilchen Durchschnittlich fliegen
  rdw.f = Random(4) ; wie schnell soll die Eigenrotation der Teilchen sein
  AddExplosion(RGB(Rot,Gruen,Blau), Laenge, WMx, WMy, Dichte, v, rdw)
 EndIf
 
ForEver
Bild
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Ich selber tue mich immer schwer meine CODE so zu programmieren das ich feste Proceduren habe

Eben deswegen wär's doch eine feine Sache ;) somit würde es nicht nur denen nützen, die ein ähnliches Spiel machen wollen, sondern Du selbst würdest auch eine Menge dabei lernen. Das würde auch Deinen zukünftigen Spielen was bringen, und wenn Du es geschickt anstellst, würdest Du auch selbst nicht immer wieder von vorn beginnen müssen.

Ich habe eigentlich mal ein Tutorial angefangen, zum Thema "wie schreibe ich vernünftigen Code", aber irgendwie hatte ich nie Zeit, das weiterzuschreiben... wenn Interesse besteht, werde ich aber auf jeden Fall mal versuchen, mir dafür ein bißchen Zeit einzurichten :)
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
DataMiner
Beiträge: 220
Registriert: 10.10.2004 18:56

Beitrag von DataMiner »

INTERESSE!
__________________________________________
Weniger glauben - mehr wissen!
------------------------------------------------------
Proud beneficial owner of SpiderBasic, PureBasic 3.x, 4.x, 5.x and PureVisionXP
Benutzeravatar
Dostej
Beiträge: 529
Registriert: 01.10.2004 10:02
Kontaktdaten:

Beitrag von Dostej »

Ein kleines Spiel was aus aktuellem Anlass übers Wochenende entstanden ist.

Popp-It

http://purebasic.stdojedmahr.de/projekte/Poppit.zip

Ein kleiner Shooter, mit dem man Kreise platzen lassen kann

Bild

Kommentar willkommen
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

:allright:

Genau so habe ich mir das Vorgestellt, n bisschen schade das du kein BEEP benutzt hats aber ok.

Verbesserungsvorschlag :
- Dauerfeuer sollt verhindert werden, weil ich kann dauerhaft die Maus gedrückt halten und durch die Nachladepakete geht mich nie die muni aus.
- vllt kannst du meine Explosionseffekte nutzen um das zerspringen eines Balls besser zu simulieren.

Was ch gut finde ist das man seine Waffer verbessern kann :-)
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Dostej
Beiträge: 529
Registriert: 01.10.2004 10:02
Kontaktdaten:

Beitrag von Dostej »

Vielen Dank für das Feedback.
Das mit dem Beep kann ich nciht so leiden. Ein paar kleine nette Sounds finde ich schon gut. Aber gehen die Geschmäcker praktisch auseinander.
Das mit dem Dauerfeuer stimmt irgendwie. Allerdings Jedesmal die Maus zu drücken - da bricht mir der Finger ab :-)

Ich werds evtl. so ändern, das man seine Energie aufläd, wenn man nicht feuert. Das könnte ein Anreiz sein, nciht dauernd zu feuern.

Die Explo-Effekte werd ich mal probieren. (Hatte am WE keinen Internetzugang, hab die heute erste entdeckt. Find ich übrigends cool. :-) )

Man gespannt ob und was noch in der Richtung kommt.
THEEX
Beiträge: 804
Registriert: 07.09.2004 03:13

Beitrag von THEEX »

@Dostej
Hättest besser die Zeit für PointOmega genutzt... *fg*
Benutzeravatar
Then
Beiträge: 247
Registriert: 06.09.2004 13:26
Wohnort: Siegen

Beitrag von Then »

hab da auch noch ein JUX Spiel... ist noch von 3.92 Version, aber 2D <)

Code: Alles auswählen

fo1=LoadFont(2,"Arial",10)
fo2=LoadFont(1,"Arial",80)

If InitSprite()
 InitKeyboard()
 main:
 OpenWindow(1,0,0,1024,768,#PB_Window_BorderLess|#PB_Window_ScreenCentered,"Huaa")
  OpenWindowedScreen(WindowID(),0,0,1024,768,1,0,0)
  
 neu:
  ende=0
  leben=3
  level=0
  start=10000
  pause=10
  kreise=1000
  gesamt=0
  
  weiter:
  If leben<0
   leben=0
   ende=1
  EndIf
  richtung=4
  
  StartDrawing(ScreenOutput())
   Box(0,0,1024,768,RGB(255,255,255))
   For t=1 To kreise
    x=Random(1023)
    y=Random(400)
    Circle(x,300+y,3,RGB(100,100,100))
   Next
   Circle(512,720,1,RGB(200,0,0))
   LineXY(0,50,1023,50,RGB(0,200,0))
    DrawingFont(fo1)
    Locate(10,10)
    FrontColor(100,100,200)
    DrawText("Punkte : "+Str(start-level))
     Locate(400,10)
    FrontColor(100,200,200) 
    DrawText("Leben : "+Str(leben))
    Locate(800,10)
    FrontColor(200,200,200) 
    DrawText("Gesamt : "+Str(gesamt))
  StopDrawing()
  
  If ende=1
   Gosub enden
   ClearScreen(255,255,255)
   Goto neu
  EndIf
  
  sx=512
  sy=720
  ax=512
  ay=720
  
  Repeat
   Delay(pause)
   ExamineKeyboard()
   If KeyboardPushed(#PB_Key_Up)
    richtung=0
   EndIf
   If KeyboardPushed(#PB_Key_Down)
    richtung=2
   EndIf
   If KeyboardPushed(#PB_Key_Left)
    richtung=3
   EndIf
   If KeyboardPushed(#PB_Key_Right)
    richtung=1
   EndIf
   If KeyboardPushed(#PB_Key_Escape)
    CloseWindow(1)
    End
   EndIf
   
   Select richtung
    Case 0
     sy-1
    Case 1
     sx+1
    Case 2
     sy+1
    Case 3
     sx-1
   EndSelect
   
   If sx>1023 Or sx<0 Or sy>767 Or sy<0
    Goto levelende
   EndIf
    
   If richtung<4
    StartDrawing(ScreenOutput())
     
     If Point(sx,sy)=51200
      level+500
      pause-1
      kreise+100
      gesamt+(start-level)
      ClearScreen(255,255,255)
      StopDrawing()
      Goto weiter
     EndIf
     
     If Point(sx,sy)=6579300
      levelende:
      StopDrawing()
      For t=1 To 100 Step 4
       StartDrawing(ScreenOutput())
        DrawingMode(4)
        Circle(sx,sy,t,RGB(255,0,0))
       StopDrawing()
       FlipBuffers()
       beep_(400-(t*2),1)
      Next
      
      For t=1 To 100 Step 4
       StartDrawing(ScreenOutput())
        DrawingMode(4)
        Circle(sx,sy,t,RGB(255,255,255))
       StopDrawing()
       FlipBuffers() 
      Next
      
      Delay(500)
      ClearScreen(255,255,255)
      leben-1 
      Goto weiter
     EndIf
    
     Circle(ax,ay,1,RGB(255,255,255))
     Circle(sx,sy,1,RGB(200,0,0))
     ax=sx
     ay=sy
     start-1
     DrawingFont(fo1)
     Locate(10,10)
     Box(0,0,300,38,RGB(255,255,255))
     FrontColor(100,100,200) 
     DrawText("Punkte : "+Str(start-level))
     
    StopDrawing()
   EndIf
   
   FlipBuffers() 
  ForEver
 
enden:
StartDrawing(ScreenOutput())
 DrawingMode(0)
 DrawingFont(fo2)
 FrontColor(0,0,0)
 Locate(200,200)
 DrawText("GAME OVER !!")
 StopDrawing()
 FlipBuffers()
 Delay(3000)
Return
 
EndIf
Ist aus meinen Anfängen damals...
PB 5.62 / Windows 11 64Bit (i5/32GB/240GB-SSD+3TB-HDD/1050GTX4GB) / 27" Multitouch Monitor

... ich mache dazu keine Aussage, weil ich mich damit selbst belasten könnte !
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

das mit dem "Draw only" find ich ne gute idee.
zu der gelegenheit verweise ich mal an mein rudimentäres autorennen:
http://www.purebasic.fr/german/viewtopi ... 539#136539

zum sound:
generell hätte ich interessa an MIDI-ansteuerung über API,
also, sound on-the-fly, aber eben nicht als erstellte WAVs,
sondern direkt ausm SYNTH.

dafür ne Include, dass man also explosionen, schüsse, etc.
ebenso wie nen song on-the-fly über MIDI produzieren kann,
so wie beim alten PLAY-befehl von QuickBasic....
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Dostej
Beiträge: 529
Registriert: 01.10.2004 10:02
Kontaktdaten:

Beitrag von Dostej »

@Stargate
Habe noch explos und ein AUfladen bei Feuerpause eingebaut. Der Links ist der gleiche

@CSprengel
Brauchte mal ne kleine Pause vom grossen Projekt und n schnelles Erfolgserlebnis :-) -> Bin nun wier dran -> mach grad die Kolonie-KI (Ächz, was es da alles zu bedenken gibt)
Antworten