Seite 6 von 14

Verfasst: 05.10.2006 23:48
von Kaeru Gaman
nuja, automatisch geht nur das, was du automatisierst.

also, hier mal der kern fürn ganz billiges beispiel:

Code: Alles auswählen

x = 400 : y = 300
xm = 1 : ym = 1
Repeat
  ExamineKeyboard()
  ClearScreen(4,8,16)
  x + xm
  If x < 0 Or x > 800
    xm = -xm
  EndIf
  y + ym
  If y < 0 Or y > 600
    ym = -ym
  EndIf
  DisplaySprite(0,x,y)
  FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
den rest wie init, screen öffnen und sprite laden musste dir halt mal selber drumrum stricken.

grundsätzlich musst du erstmal ne vorstellung dafür bekommen,
was diese variablen wie machen, bevor du dir ausdenken kannst,
wie du eine selbstgestellte aufgabe löst, sprich,
dir einen algorithmus schreibst, der das tut was du willst.

es gibt noch zig beispiele mit sich bewegenden sprites in den foren,
auf der purearea, und auf deiner festplatte im examples-ordner.

versuch erstmal, ne menge beispiele zu durchschaun, was die variablen da überhaupt machen.

wenn wir dir hier jetzt irgendnen code vorkauen, dann hast du nix davon.

Verfasst: 06.10.2006 00:00
von Machete @PB
stimmt auch wieder, hast Recht. Danke für Hilfe und Verständniss :allright:

Verfasst: 06.10.2006 00:16
von Machete @PB
Ich hab mal vom Beispiel Waponez was rauskopiert und halt statt "Bullet" Blasen_1 (es is nicht das wonach es sich vielleicht anhört;)) genommen. Der Code wird anscheinend auch angenommen. Wenn ich starte sieht man,wenn überhaupt, kurz den Hintergrund und dann kommt ne Windowsfehlermeldung: Programm hat einen Fehler festgestellt und muss beendet werden.

hier der Code:

Code: Alles auswählen

InitSprite()
InitKeyboard()

OpenScreen(1024, 768, 32, "Aquarium")

Gosub DisplayBlasen_1

Structure Blasen_1  
  x.w
  y.w
  Width.w
  Height.w
  Image.w
  SpeedY.w
EndStructure

NewList Blasen_1.Blasen_1()

Procedure AddBlasen_1(Sprite, x, y, SpeedX, SpeedY)
  AddElement(Blasen_1())           
  Blasen_1()\x      = x
  Blasen_1()\y      = y
  Blasen_1()\Width  = SpriteWidth(Sprite)
  Blasen_1()\Height = SpriteHeight(Sprite)
  Blasen_1()\Image  = Sprite  
  Blasen_1()\SpeedY = SpeedY
EndProcedure


Blasen_1SpeedY = 3

LoadSprite(0, "K:\Programme\PureBASIC\Screen\GFX\Aquarium.bmp", 0)
LoadSprite(1, "K:\Programme\PureBASIC\Screen\GFX\Blasen_1.bmp", 0)
LoadSprite(2, "K:\Programme\PureBASIC\Screen\GFX\Blasen_2.bmp", 0)

Repeat



FlipBuffers()

ClearScreen(0, 0, 0)
DisplaySprite(0, 0, 0)
ExamineKeyboard()

If KeyboardReleased(#PB_Key_Space)
    
        Blasen_1Delay = 10
               
        AddBlasen_1(1, 1024 , 768,  0    , -Blasen_1SpeedY)
        AddBlasen_1(2, 1024 , 768,  0    ,  Blasen_1SpeedY)
     
EndIf
Return 
DisplayBlasen_1:
  
  ResetList(Blasen_1())
  While NextElement(Blasen_1())  

    If Blasen_1()\y < 0          
      DeleteElement(Blasen_1())
    Else
      If Blasen_1()\x < 0        
        DeleteElement(Blasen_1())
      Else
        If Blasen_1()\x > 1024-Blasen_1()\Width
          DeleteElement(Blasen_1())
        Else
          If Blasen_1()\y > 768
            DeleteElement(Blasen_1())
          Else
            DisplayTransparentSprite(Blasen_1()\Image, Blasen_1()\x, Blasen_1()\y)   

            Blasen_1()\y + Blasen_1()\SpeedY

          EndIf
        EndIf
      EndIf
    EndIf
    Wend 
  

Until KeyboardReleased(#PB_Key_Escape)
[edit] ich wollte das unbedingt noch probieren und morgen dan begreifen ;)

Verfasst: 06.10.2006 00:33
von Kaeru Gaman
...dann reichts ja, wenn man morgen antwortet... ;)

starte halt mal mit debugger und schau, was der ausgibt.
die win-meldung alleine ist nicht sehr aussagekräftig...
(ich hab jetzt kein bock mein 3.3 anzuwerfen, vielleicht morgen)

Verfasst: 06.10.2006 01:31
von Machete @PB
kann ich verstehn :D
bis morgen.. äh bis gleich :wink:
Ich probier noch ein bisschen rum, ob ich noch nen anderen Fehler hinbekomm :allright:

Verfasst: 19.10.2006 00:33
von Machete @PB
ich weiss nicht ob ihr die Frage versteht aber hier:

gibt es eigentlich ein "Delay()" wo nicht für das ganze Programm zählt?


fals ihr euch gedacht habt, wo bleibt er (ich) denn mit den ganzen dummen, nervigen, doppelt und dreifach gestellten Fragen?, kann ich euch beruhigen. es gab bloss keine, weil ich im Krankenhaus war (ohne PC und I-Net) :freak: :lol: :cry:

vielen Dank im Voraus an die Gedankenleser und Geduldigen (fals sie es irgentwo da draussen noch gibt)

Verfasst: 19.10.2006 00:59
von mknjc
Das mit dem Delay lässt sich nur durch Threads lösen.
Aber ist 3.3 eigentlich Threadsafe? Ich glabe nicht.
Dan blibt dir nichts anderes übrig als die Euronen zu spenden oder den Teil in ein Externes Prog zu bauen.

Mfg mknjc

Verfasst: 19.10.2006 05:07
von Kaeru Gaman
> gibt es eigentlich ein "Delay()" wo nicht für das ganze Programm zählt?

denk andersrum.

mach deine hauptschleife ohne/mit kleinem delay, und bau einen zähler ein,
mit dem du dafür sorgst, dass gewisse dinge seltener passieren.

Code: Alles auswählen

Repeat  ; Hauptschleifenbeginn
;...
Delayer -1
If Delayer <=0
  Delayer = 5
  ; dieses hier wird nur jedes 5te mal ausgeführt
  ; ist also 5mal so langsam wie der Rest
EndIf
;...
Until EXIT  ; Hauptschleifenende

Verfasst: 19.10.2006 10:53
von STARGÅTE
3.3 hat schon Thread , aber sie zu benutzen ist schwer für anfänger.(finde ich)

Du machst die deine Hauptschleife und machst die Schleife die du "langsammer" laufen lassen willst in einer Procedure die dann zu eineme Thread wird was dann parallel läuft.

Verfasst: 19.10.2006 17:25
von Machete @PB
ok ich probiers ma :allright:

Danke