Kleines Spielchen....

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Beitrag von KeyKon »

Im Prinzip musst du nur alle Variablen auf den Startwert setzen und vor allem den Timer wieder mit der aktuellen Zeit füttern...
(\/) (°,,,°) (\/)
Benutzeravatar
BlueHoschi
Beiträge: 97
Registriert: 02.10.2007 07:19

Beitrag von BlueHoschi »

@Xandy

Naja, wenn Du nach 2 Sekunden den Hauptcode verläßt und die Ergebnisse Anzeigst ohne Stopzeit wieder auf einen Wert zu setzen funktioniert es nicht.
Ich würde Dir raten Dein Spiel immer komplett durchzutesten bevor Du es postest. Dann fallen Dir die meisten Gedankenfehler zunächst selbst auf und Du kommst dann vielleicht auch selbst dahinter was fehlt. Mit "If", "Repeat" und solchen Sachen kommst Du doch eigentlich klar, denke ich. Nur die Logik fehlt, weil Du es kaum selbst versuchst.
Damit will ich Dir nicht an´s Bein pissen oder sowas sondern nur raten Dir Zeit zum überlegen zu nehmen. Das lernt auch viel besser als es Andere machen zu lassen.
Nicht böse gemeint, oder sowas.
Wer Dir Steine in den Weg legt, pflastert den vielleicht.

PB 5.21, Win 7 64 bit
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Beitrag von X360 Andy »

BlueHoschi hat geschrieben:@Xandy

Naja, wenn Du nach 2 Sekunden den Hauptcode verläßt und die Ergebnisse Anzeigst ohne Stopzeit wieder auf einen Wert zu setzen funktioniert es nicht.
Ich würde Dir raten Dein Spiel immer komplett durchzutesten bevor Du es postest. Dann fallen Dir die meisten Gedankenfehler zunächst selbst auf und Du kommst dann vielleicht auch selbst dahinter was fehlt. Mit "If", "Repeat" und solchen Sachen kommst Du doch eigentlich klar, denke ich. Nur die Logik fehlt, weil Du es kaum selbst versuchst.
Damit will ich Dir nicht an´s Bein pissen oder sowas sondern nur raten Dir Zeit zum überlegen zu nehmen. Das lernt auch viel besser als es Andere machen zu lassen.
Nicht böse gemeint, oder sowas.
Ich teste und spiele mit den Codes seit 3 Tagen rumm.
Ich VERSUCHE alles selbst , nur klappt es eben nicht, da ich kleine fehler übersehe oder sonstiges.
Ich bin ein blutiger anfänger in sachen proggen!
Aber jeder hat mal klein angefange.
Aber so lange es mir spass macht....wieso nicht ?

Ich glaub dir schon das der Code geht nur bei mir nicht ( weil ich es vie. falsch verstanden habe ... )

z.b
Hab grad ne Auto schliesung gemacht. ( also das es nach 10 Sek beendet wird )


Hab mal 30 Sekuden spielzeit gemacht , und siehe da , kein neustart.
Benutzeravatar
BlueHoschi
Beiträge: 97
Registriert: 02.10.2007 07:19

Beitrag von BlueHoschi »

Also gut vielleicht hilft Dir folgendes:

Code: Alles auswählen

TransparentSpriteColor(#ZAHL6, 0) 
NewList Noten.NOTEN()

Anfang:
x = ScreenX / 2 
y = ScreenY - SpriteHeight(#MENSCH) + 10 
Speed = 5 
;/ 
Stopzeit = ElapsedMilliseconds()

Repeat 

Code: Alles auswählen

If KeyboardPushed(#PB_Key_F5) 
 MessageRequester("Neues Spiel","Neues Spiel neues Glück!",  #PB_MessageRequester_Ok ) 
    ClearList(Noten()) 
    MeinePunkte = 0 
    Neu = 1
  EndI

Code: Alles auswählen

 Delay(1) 
  FlipBuffers() 
Until  Quit Or Neu
If Neu
Goto Anfang
EndIf
If Quit 
Ich hab´ Dir meine Änderungen immer mit etwas Code von Dir eingerahmt damit Du weißt wohin damit
Wer Dir Steine in den Weg legt, pflastert den vielleicht.

PB 5.21, Win 7 64 bit
Benutzeravatar
tobe
Beiträge: 146
Registriert: 14.09.2006 17:33
Wohnort: Oktoberfest

Beitrag von tobe »

ich hab den stopbildschirm in eine extra procedur verlegt, dann bleibt der code übersichtlicher :)
spielzeit hab ich auf 10 sek eingestellt (#STOPZEIT)
die messagebox hab ich in den screen verlegt und mit einem 5 sek timer ausgerüstet

Code: Alles auswählen

EnableExplicit
Enumeration ; Sprites
  #HINTERGRUND
  #MENSCH
  #Augenlinks
  #Augenrechts
  #ZAHL1
  #ZAHL2
  #ZAHL6
EndEnumeration
#STOPZEIT = 10000
;/
Structure NOTEN
  x.l
  y.l
  Art.l
  Speed.l
EndStructure
;/
Define Quit, Titel$, MeinePunkte
Titel$ = "Schlechte Noten ? <-->made by AndyX<-->"
;/
Procedure Window()
  Protected EventID
  Shared Quit
  EventID = WindowEvent()
  Repeat
    If EventID = #PB_Event_CloseWindow
      Quit = 1
    EndIf
    EventID = WindowEvent()
  Until EventID = 0
EndProcedure
;/
Procedure Ende(Text$)
  Shared Titel$
  MessageRequester (Titel$, Text$)
  End
EndProcedure
;/
Procedure StopScreen()
  Protected Start, x, y, StartTimer, Init, Zeit
  Shared Quit, MeinePunkte
  Repeat
    Zeit = ElapsedMilliseconds()
    Window()
    ClearScreen(0)
    DisplaySprite(#HINTERGRUND, 0, 0)
    DisplayTransparentSprite(#Augenlinks, 530, 200)
    DisplayTransparentSprite(#Augenrechts, 0, 200)
    ExamineKeyboard()
    If KeyboardPushed(#PB_Key_F5)
      StartTimer = Zeit + 5000
      Init = 1
    EndIf
    If Init
      If StartTimer < Zeit
        Start = 1
      EndIf
    EndIf
    If KeyboardPushed(#PB_Key_Escape)
      Quit = 1
    EndIf
    StartDrawing(ScreenOutput())
      DrawingMode(#PB_2DDrawing_Transparent)
      x = 200
      y = 250
      If Init
        DrawText(x, y, "Neues Spiel neues Glück!", $FFFFFF)
        y + 50
        DrawText(x, y, "in " + Str((StartTimer - Zeit)/1000) + " sekunden geht's los !", $FFFFFF)
      Else
        DrawText(x, y, "Wow dein Highscore beträgt "+Str(MeinePunkte)+" Punkte",RGB(250,250,250), RGB(0,0,0))
        y + 20
        DrawText(x, y, "Nochmal spielen mit F5",RGB(250,250,250), RGB(0,0,0))
        y + 20
        DrawText(x, y, "Oder spiel durch ESC beendet werden",RGB(250,250,250), RGB(0,0,0))
      EndIf
    StopDrawing()
    Delay(1)
    FlipBuffers()
  Until Start Or Quit
  If Quit
    End
  EndIf
EndProcedure
;/
Define Zeit, NotenTimer, Stopzeit, ScreenX, ScreenY, x, y, SpielerX, SpielerY
Define testX, testY, Test$, Speed
;/
If Not (InitSprite() And InitKeyboard())
  Ende("Init Error")
EndIf
ScreenX = 650
ScreenY = 550
If OpenWindow(0, 0, 0, ScreenX, ScreenY, Titel$, #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  If OpenWindowedScreen(WindowID(0), 0, 0, ScreenX, ScreenY, 0, 0, 0)
    SetFrameRate(50)
  Else
    Ende("Screen Error")
  EndIf
Else
  Ende("Window Error")
EndIf
;/ Startbildschirm
LoadSprite(#HINTERGRUND, "Images\Panorama.bmp",1)
Repeat
  Window()
  ClearScreen(0)
  DisplaySprite(#HINTERGRUND, 0, 0)
  ExamineKeyboard()
  StartDrawing(ScreenOutput())
    DrawingMode(#PB_2DDrawing_Transparent)
    x = 80
    y = 20
    DrawText(x, y, "Ihr müsst versuchen so viele Punkte zu machen wie nur möglich !")
    y + 40
    DrawText(x, y, "Zur erklärung der Punkte vergabe:")
    x + 250
    y + 20
    DrawText(x, y, "Die 1 gibt 100 Punkte")
    y + 20
    DrawText(x, y, "Die 2 gibt noch 10 Punkte")
    y + 20
    DrawText(x, y, "Und die 6 gibt -50 Punkte")
    x - 250
    y + 50
    DrawText(x, y, "Bei jeder nicht gefangenen >1< und jeder >2< werden 25 Punkte abgezogen")
    x + 130
    y + 300
    DrawText(x, y, "Taste drücken, dann geht's los !",RGB(250,250,250), RGB(0,0,0))
  StopDrawing()
  Delay(1)
  FlipBuffers()
Until KeyboardPushed(#PB_Key_All) Or Quit
If Quit
  End
EndIf
;/ Spiel
UsePNGImageDecoder()
LoadSprite(#MENSCH,"Images\Spieler.PNG",0)
TransparentSpriteColor(#MENSCH,0)
LoadSprite(#Augenlinks,"Images\Spieler augen links.PNG",0)
TransparentSpriteColor(#Augenlinks, 0)
LoadSprite(#Augenrechts,"Images\Spieler augen rechts.PNG",0)
TransparentSpriteColor(#Augenrechts, 0)
LoadSprite(#ZAHL1,"Images\Note1.PNG",0)
TransparentSpriteColor(#ZAHL1, 0)
LoadSprite(#ZAHL2,"Images\Note2.PNG",1)
TransparentSpriteColor(#ZAHL2, 0)
LoadSprite(#ZAHL6,"Images\Note6.PNG",1)
TransparentSpriteColor(#ZAHL6, 0)
SpielerX = ScreenX / 2
SpielerY = ScreenY - SpriteHeight(#MENSCH) + 10
Speed = 5
NewList Noten.NOTEN()
Stopzeit = ElapsedMilliseconds() + #STOPZEIT
Repeat
  Zeit = ElapsedMilliseconds()
  If Stopzeit < Zeit
    StopScreen()
    ClearList(Noten())
    MeinePunkte = 0
    Stopzeit = ElapsedMilliseconds() + #STOPZEIT
  EndIf
  Window()
  ExamineKeyboard()
  If KeyboardPushed(#PB_Key_Escape)
    Quit = 1
  EndIf
  If KeyboardPushed(#PB_Key_Right)
    If SpielerX < ScreenX-120
      SpielerX + Speed
    EndIf
  EndIf
  If KeyboardPushed(#PB_Key_Left)
    If SpielerX > 0
      SpielerX - Speed
    EndIf
  EndIf
  If KeyboardPushed(#PB_Key_A)
    testX + 1
  EndIf
  If KeyboardPushed(#PB_Key_S)
    testX - 1
  EndIf
  ; neue noten (alle 500ms)
  If NotenTimer < Zeit
    NotenTimer = Zeit + 500
    AddElement(Noten())
    Noten()\x = Random(ScreenX-40)
    Noten()\y = - 60
    Noten()\Art = #ZAHL1 + Random(2)
    Select Noten()\Art
      Case #ZAHL1
        Noten()\Speed = 10
      Case #ZAHL2
        Noten()\Speed = 3
      Case #ZAHL6
        Noten()\Speed = 2
    EndSelect
  EndIf
  ClearScreen(0)
  DisplaySprite(#HINTERGRUND, testX, testY)
  DisplayTransparentSprite(#MENSCH, SpielerX, SpielerY)
  ForEach Noten()
    Noten()\y + Noten()\Speed
    DisplayTransparentSprite(Noten()\Art, Noten()\x, Noten()\y)
    If Noten()\y - SpielerY > -60 And Noten()\y - SpielerY < 120
      If Noten()\x - SpielerX > -10 And Noten()\x - SpielerX < 110
        Select Noten()\Art
          Case #ZAHL1
            MeinePunkte + 100
          Case #ZAHL2
            MeinePunkte + 10
          Case #ZAHL6
            MeinePunkte - 50
        EndSelect
        DeleteElement(Noten())
      EndIf
    ElseIf Noten()\y > ScreenY
      Select Noten()\Art
        Case #ZAHL1, #ZAHL2
          MeinePunkte - 25
        Case #ZAHL6
          MeinePunkte - 0
      EndSelect
      DeleteElement(Noten())
    EndIf
  Next

  StartDrawing(ScreenOutput())
    DrawingMode(#PB_2DDrawing_Transparent)
    FrontColor(0)
    DrawText(170,0,"Dein Score beträtgt sagenhafte "+Str(MeinePunkte)+" Punkte")
  StopDrawing()
  Delay(1)
  FlipBuffers()
Until Quit
End
PureBasic 4.40 (Windows - x86)
whitelion
Beiträge: 46
Registriert: 05.05.2008 18:16
Wohnort: Celle
Kontaktdaten:

Beitrag von whitelion »

interessantes beispiel. ich stelle mir gerade die frage, wie man in die exe alles einbinden kann (also die grafiken). - am besten ohne das selbige auf der festplatte ausgelagert werden müssen!?
...das leben ist wie ein schlechtes adventure-game, aber die grafik ist verdammt geil!
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Beitrag von KeyKon »

Einfach so:

Code: Alles auswählen

DataSection
  bild:
  IncludeBinary "test.bmp"
EndDataSection


Debug CatchImage(0,?bild)
(\/) (°,,,°) (\/)
whitelion
Beiträge: 46
Registriert: 05.05.2008 18:16
Wohnort: Celle
Kontaktdaten:

Beitrag von whitelion »

danke! werden dabei die dateien noch ausgelagert oder liegt die datei im resource der exe und der compiler verlinkt direkt auf selbige!?
...das leben ist wie ein schlechtes adventure-game, aber die grafik ist verdammt geil!
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Beitrag von X360 Andy »

Erst mal danke an Tobe....
:allright:

Wie kann ich die größe des Textes verändern ?
In der "Hilfe" steht
Hoehe = TextHeight(Text$)

Aber egal wie ich das bei mir einsetzte kommt immer eine Fehlermeldung

Zu der Frage Grafiken einbinden.

Is das eine bessere Methode oder Schlechter ?
Also vor oder nachteile :yin-yang:
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Beitrag von KeyKon »

@whitelion: Mittels IncludeBinary werden die Dateien direkt in die EXE gepackt...

@X360 Andy: Bevor du was fragst gugg immer erst mal in die PB-Hilfe, da steht beim Befehl TextHeight():
PB-Hilfe hat geschrieben:Ermittelt die Höhe (in Pixel) des angegebenen String, der auf dem aktuellen Ausgabekanal mittels des aktuellen Zeichensatzes dargestellt wird.
Der Befehl gibt dir also nur zurück wie hoch die Schrift ist mit der du gerade schreibst...
Um die Schriftgröße (Und auch Art/Style) zu ändern musst du dir erst eine Schrift (Font) laden:

Code: Alles auswählen

LoadFont(1,"Arial",50,#PB_Font_Bold)
In diesem Fall wird die Schriftart Arial in der größe 50 und in Fettdruck geladen, und zwar hat sie die ID 1...

Um sie dann anzuwenden musst du bevor du etwas mit DrawText() schreibst einfach

Code: Alles auswählen

DrawingFont(FontID(1))
aufrufen wobei die 1 hier wieder für die entsprechende Font steht...

Du kannst also beliebig viele Fonts am Anfang laden und dann während dem Spiel wie Bilder aufrufen und verwenden...

Bei weitern Frag schau doch mal ob du dir vll nich doch mit der PB-Hilfe selber Helfen kannst... Aber wenn du nich weiterkommst wird deine Frage hier natürlich gern beantwortet...

Zur Sache Grafiken einbinden:
Ich finde bei kleinen Programmen hat es Vorteile weil man einfach bloss die EXE hat und nich noch Dateien mit rumgeben muss, aber sobald das Projekt etwas größer wird wird es finde ich umständlicher und auch langsamer (als großes Projekt würde ich was mit mehr als 20 oder 30 Dateien bezeichnen)

Aber das ist wie immer Geschmackssache...
(\/) (°,,,°) (\/)
Antworten