"Schneefall"

Anfängerfragen zum Programmieren mit PureBasic.
frogsoup
Beiträge: 13
Registriert: 26.04.2008 11:22

"Schneefall"

Beitrag von frogsoup »

Hallo community,
also ich muss für die Schule ein Spiel erstellen:

Ich habe vor, ein Spiel zu erstellen, bei dem Burger von oben herabfallen und unten Homer Simpson mit den Cursor-Tasten zu bewegen ist um diese aufzufangen. Ich habe bereits oben ein McDonalds-Logo eingefügt und unten meinen Homer, dieser ist bereits beweglich und kann an den Rändern das Feld nicht verlassen.

Ich komme zu meiner Frage: Wie kann ich es einstellen, dass Burger an zufälligen Positionen aus dem Logo fallen, diese nach unten fallen und ich die aufsammeln kann?
Wäre natürlich schön, wenn ich auch ne Punkteanzeige oder etwas ähnliches hinbekommen würde, aber bin noch ein ziemlicher Anfänger, also bitte ich um Hilfe.

Vielen Dank im Vorraus.

mfg

frogsoup :cry:
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

da du sicher mehrere Burger gleichzeitig fallen sehen willst, brauchst du Listen:

Code: Alles auswählen

Structure Burger
 x.l
 y.l
EndStructure
NewList Burger.Burger()
dann solltest du in bestimmten Intervallen einen Burger erzeugen (an deinem Logo :

Code: Alles auswählen

Pause + 1
If Pause > 100
 Pause = 0
 AddElement(Burger())
 Burger()\x = LogoX
 Burger()\y = LogoY
EndIf
nun noch die Bewegung und abfrage auf Homer:

Code: Alles auswählen

ForEach Burger()
 Burger()\y + 1
 If Abs(Burger()\x-HomerX) < HomerRadius+BurgerRadius And Abs(Burger()\y-HomerY) < HomerRadius+BurgerRadius
  ; Aktion beim Fressen
 EndIf
 If Burger()\y > WindowHeight ; Aus dem Bildschirm
  DeletElement(Burger())
 EndIf
Next
Du musst natürlich jetzt die Datei bei dir einbauen/ändern


EDIT:
@gnasen: haha ^^ ih war schneller, zwei dumme ein gedanke wa :D
Zuletzt geändert von STARGÅTE am 26.04.2008 11:46, insgesamt 1-mal geändert.
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
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag von gnasen »

Am besten arbeitest du mit LinkedLists. Diese sind ein mächtiges Werkzeug für solche Dinge.

Zuerst erstellst du eine Struktur, in der alle Daten jedes Burgers stehen. Dies wären zB.:

Code: Alles auswählen

Structure myBurger

  X_coor.l
  Y_coor.l
  Punkte.l

EndStructure
Nun erstellst du eine Liste, in der alle Burger gespeichert werden. Diese ist dynamisch, das heisst du kannst jederzeit einen Burger hinzufügen, ändern oder entfernen:

Code: Alles auswählen

Define NewList Burger.myBurger()
Wichtig daran: Du übergibst der Liste die myBurger Struktur!

Jetzt wollen wir einen Burger hinzufügen:

Code: Alles auswählen

AddElement(Burger())
Burger()\X_coor = Random(800)
Burger()\Y_coor = 0
Burger()\Punkte = 10
Der erstellte Burger erscheint in dem Koordinatenbereich von 0 bis 800 auf der X-Achse und ganz oben am Bildschirm.

In deinem Schleifendurchlauf lässt du in jedem Durchgang alle Burger um einen nach unten fallen, wenn einer den Boden berührt löscht du diesen:

Code: Alles auswählen

ForEach Burger()
  Burger()\Y_coor + 1
  If Burger()\Y_coor > 600
    DeleteElement(Burger())
  EndIf

Next
Das Grundgerüst steht.

Nun musst du nur noch die Position deines Homers mit den Burgern abgleichen (ebenfalls in einer ForEach Schleife) und fügst die Punkte dem Konto zu (in Burger()\Punkte gespeichert).

So das sollte erstmal reichen ;)


Edit: Hmm da war einer schneller....
frogsoup
Beiträge: 13
Registriert: 26.04.2008 11:22

Beitrag von frogsoup »

hey.. .das sieht gut aus... danke schonmal.

ich probiers gleich mal aus.



EDIT: also hab jetzt deine sachen eingefügt Stargate!

hab die Burger X/Y geändert und nen Global Burger.w gemacht sowie ein bild in meinen ordner gepackt. wie bekomm ich das jetzt hin, dass die dinger runter fallen und der die aufsammeln kann?
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

kannst du mal dein Code posten, damit ich ihn erweitern kann, macht sich sonst blöd wenn ich dir nur schnipsel an den Kopf klatsche
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
frogsoup
Beiträge: 13
Registriert: 26.04.2008 11:22

Beitrag von frogsoup »

Code: Alles auswählen

InitSprite()
InitKeyboard()
OpenScreen(640,480,16,"Beispiel 7_1")

Global SchlaegerX.w
Global SchlaegerY.w
Global BewegX.w
Global BewegY.w
Global Bild1X.w
Global Bild1Y.w
Global Bild2X.w
Global Bild2Y.w
Global Burger.w


Structure Burger
 x.l
 y.l
EndStructure
NewList Burger.Burger() 


Pause + 1
If Pause > 100
 Pause = 0
 AddElement(Burger())
 Burger()\x = testX
 Burger()\y = testY
EndIf 


ForEach Burger()
 Burger()\y + 1
 If Abs(Burger()\x-HomerX) < HomerRadius+BurgerRadius And Abs(Burger()\y-HomerY) < HomerRadius+BurgerRadius
  ; Aktion beim Fressen
 EndIf
 If Burger()\y > WindowHeight ; Aus dem Bildschirm
  DeleteElement(Burger())
 EndIf
Next 




















BewegX = - 1
BewegY = - 1
SchlaegerX = 639 - 500
SchlaegerY = 330
Bild1Y = 0
Bild1X = 0
Bild2X = 0
Bild2Y = 0



LoadSprite(1,"Maces2.bmp",1)
TransparentSpriteColor(1,RGB(255,0,0))
Repeat 
DisplaySprite(1,testX,testY)
StartDrawing(ScreenOutput())
FrontColor(255+256*255+256*256*255)
StopDrawing()
FlipBuffers()


LoadSprite(0,"homer_sabber2.bmp",0)
TransparentSpriteColor(0,RGB(255,255,255))
Repeat
DisplaySprite(0,SchlaegerX,SchlaegerY)
StartDrawing(ScreenOutput())
FrontColor(255+256*255+256*256*255)
StopDrawing()
FlipBuffers()



ExamineKeyboard()
If KeyboardPushed(#PB_Key_Right)
If SchlaegerX < 640-120 
 SchlaegerX + 1
EndIf
EndIf
If KeyboardPushed(#PB_Key_Left)

If SchlaegerX > 0
SchlaegerX - 1
EndIf
EndIf

If SchlaegerY < 60
 SchlaegerY = 20
ElseIf SchlaegerY > 460 - 30
 SchlaegerY = 460 - 30
EndIf

If KeyboardPushed(#PB_Key_A)
 testX + 1
EndIf
If KeyboardPushed(#PB_Key_S)
 testX - 1
EndIf

If testY < 60
 testY = 20
ElseIf testY > 460 - 30
 testY = 460 - 30
EndIf



BallX + BewegX
BallY + BewegY


If BallX < 20
 BewegX = 1
EndIf
If BallY < 20 
 BewegY = 1
EndIf
If BallY > 460
 BewegY = -1
EndIf

If BallX > SchlaegerX And BallX < SchlaegerX + 10 And BallY > SchlaegerY And BallY < SchlaegerY + 30
 BewegX = -1
EndIf



ExamineKeyboard()

Until KeyboardPushed(1)
Until KeyboardPushed(1)
das ist das, was ich bis jetz habe... bin mir nicht ganzsicher mit dem burger.... danke
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

erst mal ist es schlecht eine Doppelschleife zu machen, in der die Bilder angezeigt werden.

Bitte teste mal diesen Code, ob er läuft:


Bitte den Bildnamen des Burgers verbessern!

Code: Alles auswählen

InitSprite() 
InitKeyboard() 
OpenScreen(640,480,16,"Beispiel 7_1") 

Global SchlaegerX.w 
Global SchlaegerY.w 
Global BewegX.w 
Global BewegY.w 
Global Bild1X.w 
Global Bild1Y.w 
Global Bild2X.w 
Global Bild2Y.w 
Global Burger.w 


Structure Burger 
 x.l 
 y.l 
EndStructure 
Global NewList Burger.Burger() 


BewegX = - 1 
BewegY = - 1 
SchlaegerX = 639 - 500 
SchlaegerY = 330 
Bild1Y = 0 
Bild1X = 0 
Bild2X = 0 
Bild2Y = 0 

LoadSprite(2,"Burger.bmp",1) 
TransparentSpriteColor(2,RGB(255,0,0)) 


LoadSprite(1,"Maces2.bmp",1) 
TransparentSpriteColor(1,RGB(255,0,0)) 

LoadSprite(0,"homer_sabber2.bmp",0) 
TransparentSpriteColor(0,RGB(255,255,255)) 


Repeat 

ClearScreen(0)

DisplaySprite(1,testX,testY) 
DisplaySprite(0,SchlaegerX,SchlaegerY) 


ExamineKeyboard() 
If KeyboardPushed(#PB_Key_Right) 
If SchlaegerX < 640-120 
 SchlaegerX + 1 
EndIf 
EndIf 
If KeyboardPushed(#PB_Key_Left) 

If SchlaegerX > 0 
SchlaegerX - 1 
EndIf 
EndIf 

If SchlaegerY < 60 
 SchlaegerY = 20 
ElseIf SchlaegerY > 460 - 30 
 SchlaegerY = 460 - 30 
EndIf 

If KeyboardPushed(#PB_Key_A) 
 testX + 1 
EndIf 
If KeyboardPushed(#PB_Key_S) 
 testX - 1 
EndIf 

If testY < 60 
 testY = 20 
ElseIf testY > 460 - 30 
 testY = 460 - 30 
EndIf 



Pause + 1 
If Pause > 100 
 Pause = 0 
 AddElement(Burger()) 
 Burger()\x = testX 
 Burger()\y = testY 
EndIf 


ForEach Burger() 
 Burger()\y + 1 
 If Abs(Burger()\x-SchlaegerX) < 60 And Abs(Burger()\y-SchlaegerY) < 60
  DeleteElement(Burger())  
 EndIf 
 If Burger()\y > 480 ; Aus dem Bildschirm 
  DeleteElement(Burger()) 
 EndIf 
 DisplayTransparentSprite(2,Burger()\x,Burger()\y) 
Next 

FlipBuffers() 

ExamineKeyboard() 

Until KeyboardPushed(1)
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
frogsoup
Beiträge: 13
Registriert: 26.04.2008 11:22

Beitrag von frogsoup »

okay.. danke vielmals....

also burger fallen jetzt ganz links runter, aber alle links und direkt hintereinander.

wenn homer die aufsammelt crashed das prog. i-welche hilfen ?? =)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

ja ^^^der Code:

Code: Alles auswählen

InitSprite() 
InitKeyboard() 
OpenScreen(640,480,16,"Beispiel 7_1") 

Global SchlaegerX.w 
Global SchlaegerY.w 
Global BewegX.w 
Global BewegY.w 
Global Bild1X.w 
Global Bild1Y.w 
Global Bild2X.w 
Global Bild2Y.w 
Global Burger.w 


Structure Burger 
 x.l 
 y.l 
EndStructure 
Global NewList Burger.Burger() 


BewegX = - 1 
BewegY = - 1 
SchlaegerX = 639 - 500 
SchlaegerY = 330 
Bild1Y = 0 
Bild1X = 0 
Bild2X = 0 
Bild2Y = 0 

LoadSprite(2,"Burger.bmp",1) 
TransparentSpriteColor(2,RGB(255,0,0)) 


LoadSprite(1,"Maces2.bmp",1) 
TransparentSpriteColor(1,RGB(255,0,0)) 

LoadSprite(0,"homer_sabber2.bmp",0) 
TransparentSpriteColor(0,RGB(255,255,255)) 


Repeat 

ClearScreen(0) 

DisplaySprite(1,testX,testY) 
DisplaySprite(0,SchlaegerX,SchlaegerY) 


ExamineKeyboard() 
If KeyboardPushed(#PB_Key_Right) 
If SchlaegerX < 640-120 
 SchlaegerX + 1 
EndIf 
EndIf 
If KeyboardPushed(#PB_Key_Left) 

If SchlaegerX > 0 
SchlaegerX - 1 
EndIf 
EndIf 

If SchlaegerY < 60 
 SchlaegerY = 20 
ElseIf SchlaegerY > 460 - 30 
 SchlaegerY = 460 - 30 
EndIf 

If KeyboardPushed(#PB_Key_A) 
 testX + 1 
EndIf 
If KeyboardPushed(#PB_Key_S) 
 testX - 1 
EndIf 

If testY < 60 
 testY = 20 
ElseIf testY > 460 - 30 
 testY = 460 - 30 
EndIf 



Pause + 1 
If Pause > 400 
 Pause = 0 
 AddElement(Burger()) 
 Burger()\x = testX+Random(600) 
 Burger()\y = testY 
EndIf 


ForEach Burger() 
 Burger()\y + 1 
 If Abs(Burger()\x-SchlaegerX) < 60 And Abs(Burger()\y-SchlaegerY) < 60 
  DeleteElement(Burger()) 
  Continue
 EndIf 
 If Burger()\y > 480 ; Aus dem Bildschirm 
  DeleteElement(Burger()) 
 EndIf 
 DisplayTransparentSprite(2,Burger()\x,Burger()\y) 
Next 

FlipBuffers() 

ExamineKeyboard() 

Until KeyboardPushed(1)
Den Zeitabstand kannst du hier verändern: Pause > 400
machst du es größer fallen weniger pro Minute

die stelle der Burger stellst du da ein:
AddElement(Burger())
Burger()\x = testX+Random(600)
Burger()\y = testY
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
frogsoup
Beiträge: 13
Registriert: 26.04.2008 11:22

Beitrag von frogsoup »

okay, das scheint zu funktionieren.
hehe vielen dank dafür,
wäre nett, wenn du mir noch bei folgendem hilfst.... :)

wie kann ich die geschwindigkeit von homer ändern?
wie mach ich nen punkte-zähler?
wie kann ich in den 32-Farben modus wechseln?
warum crashed der, wenn ein burger zur hälfte aus dem bild auf den boden kommt?

mfg
frogsoup
Gesperrt