Springender Ball

Spiele, Demos, Grafikzeug und anderes unterhaltendes.
Benutzeravatar
onny
Beiträge: 400
Registriert: 27.04.2005 17:50
Kontaktdaten:

Springender Ball

Beitrag von onny »

Hi, will hier mein ersten Versuch in Sachen 2D-Programmierung posten :) Programmiert habe ich ein Ball der immer abprallt wenn er auf den Rand des Bildschirms trifft. Anfangs dachte ich, ich müsste mit Winkel-Berechnung den Ball zum abprallen bringen, doch es ging fiel einfacher als ich dachte. Hier mal der Code:

Code: Alles auswählen

speed = 7

If InitMouse() = 0 Or InitSound() = 0 Or InitSprite() = 0 Or InitKeyboard() = 0 Or InitMovie() = 0 Or OpenScreen(640, 480, 32, "DER SPRINGENDE BALL") = 0
MessageRequester("Error", "Please check your computer settings and update your software", 0) : End : EndIf

LoadSprite(1, "plot.bmp", 0) : LoadSprite(2, "cursor.bmp", 0) 
  
Repeat

If y > 430 : back = 1 : Else
If y < 10 : back = 0 : EndIf : EndIf
If back = 0 : y+speed : Else : y-speed : EndIf
If x > 590 : colision = 1 : EndIf
If x = 0 : colision = 0 : EndIf
If colision = 1 : x-speed : Else : x+speed : EndIf

StartDrawing(ScreenOutput())
Locate (5,5)
DrawText("ALPHA 0.1  -  MouseX: "+Str(MouseX())+" - MouseY: "+Str(MouseY())+"  -  BallX:  "+Str(x)+" -  BallY:  "+Str(y))
StopDrawing()

ExamineKeyboard() : ExamineMouse() : FlipBuffers() : ClearScreen(253, 253, 253)

DisplaySprite(1,x,y)
TransparentSpriteColor(2,255, 255, 255)
DisplayTransparentSprite(2, MouseX(), MouseY())

Until KeyboardPushed(#PB_Key_Escape) > 0 : End
Kann sicherlich noch optimiert werden, vllt. habt ihr ein paar Tipps.

Weitere Pläne: Ball soll an Mouse-Cursor abprallen, leider ist dafür der Code mit den Variablen "back" und "colision" unpassend....

Hier noch die GFX-Files Cursor.bmp und Plot.bmp, Sourcecode und compilierte EXE zum download: http://allfiles.ru/storage/7057165210ee ... 20Ball.rar

Ich weiss, ist nichts besonderes, für mich aber ein großer Erfolg :allright:
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Wie geil!

@ onny: Locate? Benutzt du noch PB 3.94 oder was? Ab PB 4.00 gibts das gar nicht mehr...


Schaut euch mal meinen Ball an! Ich habe außerdem eingebaut, dass man genau sehen kann, wo der Ball schon war (Spur):

Code: Alles auswählen

#breite=800
#hoehe=600
#speed=3 ; From 1 (slow) to 10 (fast)
InitSprite()
InitKeyboard()
OpenScreen(#breite, #hoehe, 32, "Der springende Ball")
Define posX=#breite/2, posY=#hoehe/2, dirX=#speed, dirY=#speed
NewList spur.Point()
CreateSprite(0, 30, 30)
StartDrawing(SpriteOutput(0))
	Circle(15, 15, 15, #Yellow)
StopDrawing()
Repeat
	ClearScreen(#Black)
	If posX >= #breite-30 Or posX <= 0
		dirX*-1
	EndIf
	If posY >= #hoehe-30 Or posY <= 0
		dirY*-1
	EndIf
	AddElement(spur())
		spur()\x=posX+7
		spur()\y=posY+7
	posX+dirX
	posY+dirY
	StartDrawing(ScreenOutput())
		DrawText(posX+30, posY+30, "Ball("+Str(posX)+"|"+Str(posY)+")", #White, #Black)
		ForEach spur()
			Plot(spur()\x, spur()\y, #Red)
		Next
	StopDrawing()
	DisplayTransparentSprite(0, posX, posY)
	FlipBuffers(2)
	Delay(10-#speed)
	ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)
Hey Kaeru Gaman! Lass dich mal hier Blicken, 2D-Drawing Experte! Dass die Spur des Balls einer Gesetzmäßigkeit folgt weiß ich auch schon. Aber welcher Gesetzmäßigkeit folgt er? Das finde ich grad interessant!
Zuletzt geändert von AND51 am 20.04.2007 21:48, insgesamt 1-mal geändert.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Herzlichen Glückwunsch!

Jetzt haste das Grundgerüst von Breakout! Bild
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

Dass die Spur des Balls einer Gesetzmäßigkeit folgt weiß ich auch schon. Aber welcher Gesetzmäßigkeit folgt er? Das finde ich grad interessant!
Ämm : Einfallswinkel = Ausfallswinkel, bzw. Vektoren Gesetzte

PS: Das "Spiel" sollte vllt noch etwas waren bis es in den Bereich Spiele kommt, klar ist es dein erstens Ergebnis, aber ein Spiel ist das nicht ;-)
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
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

> Einfallswinkel = Ausfallswinke
Dat kenn ich schon. Stimmt. Hätt ich auch drauf kommen müssen. :lol:

> Das "Spiel" sollte vllt noch etwas waren bis es in den Bereich Spiele kommt, klar ist es dein erstens Ergebnis
Nein ist es nicht. Ich habe bereits dieses Ballding programmiert und zwar mit anderen WInkeln als nur 45°. AUßerdem wollte ich kein Spiel draus machen, habe es nur zum zeitvertreib programmiert (und, um ein bisschen anzugeben :wink: ).
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

ich meine doch nicht dich , lol, ich meine den Autor (onny)
und, um ein bisschen anzugeben
Kicher ^^, na warte, jetzt Zeige ich dir mal was man aus dem Code machen kann, muhaha


EDIT:

Ein bischen Gravitation, Reibung, und die Spur verplast ^^, du bist wieder dran ^^

Code: Alles auswählen

1:

#breite=1024 
#hoehe=768 
#speed=3 ; From 1 (slow) to 10 (fast) 
InitSprite() 
InitKeyboard() 
OpenScreen(#breite, #hoehe, 32, "Der springende Ball") 
posX.f=#breite/2 : posY.f=#hoehe/4 : dirX.f=#speed : dirY.f=#speed 

Structure spur
 x.f
 y.f
 h.l
EndStructure
NewList spur.spur() 

CreateSprite(0, 30, 30) 
 StartDrawing(SpriteOutput(0)) 
  Circle(15, 15, 15, #Yellow) 
 StopDrawing() 
 
Repeat 

 ClearScreen(0,0,0) 
 
 If posX >= #breite-30 Or posX <= 0 
  dirX*-1 
 EndIf 
 If posY >= #hoehe-30 
  dirY*-0.80 
  posY = #hoehe-30
 EndIf 
 
 AddElement(spur()) 
 spur()\x=posX+15 
 spur()\y=posY+15 
 spur()\h=255 
 
 posX+dirX 
 posY+dirY 
 
 dirY+0.1
 
 StartDrawing(ScreenOutput()) 
  Locate(posX+30, posY+30)
  DrawText("Ball("+Str(posX)+"|"+Str(posY)+")")  
  ResetList(spur())
  While NextElement(spur())
   spur()\h-1
   Circle(spur()\x, spur()\y, 2, RGB(spur()\h,0,0)) 
   If spur()\h <= 0 : DeleteElement(spur()) : EndIf
  Wend 
 StopDrawing() 
 
 DisplayTransparentSprite(0, posX, posY) 
 
 FlipBuffers() 
 Delay(10-#speed) 
 ExamineKeyboard() 
Until KeyboardPushed(#PB_Key_Escape)
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
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Beeindruckend, ehrlich!

> ich meine doch nicht dich , lol, ich meine den Autor (onny)
achsoooooo!


Bitte bedenke: Ich bin dir zwar um PB Versionen voraus^^
Aber ich habe im 2D bereich noch nicht so viel Erfahrung, wie du oder Kaeru, weil ich eher der GUI Typ bin^^
Ich versuch trotzdem mein Bestes! Warte nen bisschen...

//Edit: DU hast 2 Fehler:
Der Ball hoppst immer weiter, er fängt nie an zu Rollen oder liegenzubleiben. 2. Wenn er ganz am Boden ist, dann kann man die Koordinaten nicht mehr lesen^^
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

ist der Ball auf Kummi ?, dann könnte man noch die verformung berechnen :-)
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
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag von Andreas_S »

Vielleicht wird heute noch etwas von mir auftauchen :wink: .
Benutzeravatar
onny
Beiträge: 400
Registriert: 27.04.2005 17:50
Kontaktdaten:

Beitrag von onny »

Code: Alles auswählen

speed = 7

If InitMouse() = 0 Or InitSound() = 0 Or InitSprite() = 0 Or InitKeyboard() = 0 Or InitMovie() = 0 Or OpenScreen(640, 480, 32, "DER SPRINGENDE BALL") = 0
MessageRequester("Error", "Please check your computer settings and update your software", 0) : End : EndIf

CreateSprite(1, 60, 60)
StartDrawing(SpriteOutput(1)) : Circle(20, 20, 20, #Blue)
StopDrawing()

CreateSprite(2, 20, 20)
StartDrawing(SpriteOutput(2))
Circle(10, 10, 10, #Green)
StopDrawing()
  
Repeat

If MouseButton(1) : speed+1 : EndIf
If MouseButton(2) And speed > 0 : speed-1 : EndIf

If y > 430 : back = 1 : EndIf
If y < 30 : back = 0 : EndIf

If x > 590 : colision = 1 : EndIf
If x <= 1 : colision = 0 : EndIf

If back = 0 : y+speed : Else : y-speed : EndIf
If colision = 1 : x-speed : Else : x+speed : EndIf

StartDrawing(ScreenOutput()) : Locate (5,5)
DrawText("ALPHA 0.1  -  MouseX: "+Str(MouseX())+" - MouseY: "+Str(MouseY())+"  -  BallX:  "+Str(x)+" -  BallY:  "+Str(y))
StopDrawing()

DisplaySprite(1,x,y)
TransparentSpriteColor(2,255, 255, 255)
DisplayTransparentSprite(2, MouseX(), MouseY())

ExamineKeyboard() : ExamineMouse() : FlipBuffers() : ClearScreen(0, 0, 0)

Until KeyboardPushed(#PB_Key_Escape) > 0 : End
schneller = linker mausbutton
langsamer/stillstand = rechter mausbutton

nun werden keine grafiken mehr benötigt :)
Antworten