Sprite, Mouse und Absturz

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
irobot
Beiträge: 162
Registriert: 16.10.2005 09:22
Kontaktdaten:

Beitrag von irobot »

Danke erstmal für eure Hilfe !

Hab die Inits, Sprite Laden usw. an den Anfang gesetzt. Zwar bleibt das
Programm nicht mehr mit einer Fehlermeldung hängen, jedoch das
Sprite ist beim zweiten klicken auf die Armatur nicht mehr am Mauszeiger, beim dritten mal ist die schwarze Fläche wieder komplett leer. Kein
(Armaturen-)Sprite ist mehr sichtbar. Die eigentliche Schleife sieht jetzt
nur noch so aus:

Code: Alles auswählen

                  Repeat
                
                     FlipBuffers()
                     DisplaySprite(0, x, y)
                     ExamineMouse()
                     DisplaySprite(1, WindowMouseX(), WindowMouseY())
                     ExamineKeyboard()
                     If MouseButton(1) Or MouseButton(2) Or KeyboardPushed(#PB_Key_Escape)
                        ReleaseMouse(1)
                        Break
                     EndIf
            
                  ForEver 

Was ich will:
1. Rechts auf eine Taste klicken (zB eine "Ventiltaste")
2. Dann mit einem Ventil am Mauszeiger dran mich über eine schwarze Fläche bewegen
3. Nach einem Klick dieses Ventil auf der schwarzen Fläche "hinsetzen",
wobei das Ventil auch weiterhin am Mauszeiger dran bleiben soll
4. Wenn man eine andere Armatur haben will, schiebt man den Mauszeiger
wieder über das Tastenfeld mit den Armaturentasten, klickt auf die
gewünschte Armatur (zB eine Pumpe) und kann dann eine Pumpe
auf die grosse schwarze Fläche setzen. Ganz so wie auf
www.der-prozess.de

Es geht also darum, ein verfahrenstechnisches Fliessbild puzzleartig
zusammenzusetzen. Das hat bisher mit AMOS (für AMIGA, 1990)
geklappt, ein damaliger Versuch mit BlitzBasic auf dem AMIGA hatte
auch funktioniert (1995, mit Befehlen wie Blit, GetaShape, Boxf, UnBuffer
usw.), mit VisualBasic (siehe www.der-prozess.de)

Daher das eine Sprite als schwarzen Hintergrund, das andere Sprite
als Bauteil was ich da hin- und herschiebe. Beim draufklicken, also
beim gewollten draufsetzen auf die schwarze fläche, wollte ich dies
zeichnen (mittels line und circle usw. wegen stufenlosen Zoom später,
ähnlich wie AutoCad)

All die unzähligen verfahrenstechnischen Berechnungen und Simulationen
sind zwar viel viel Arbeit, jedoch komme ich damit bestens klar. Mein
Problem ist momentan diese (eigentlich recht simple) grafische Sache.

Irgendwelche Tips ? Danke im voraus nochmal für eure Hilfe.

Grüsse
irobot
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

nunja...

es ist ehrlich ziemlich schwer zu sagen, wo ein fehler liegt, wenn man
nur ein minimalstes bruchstück von nem program zu sehen bekommt...

wozu dient das DisplaySprite(0,x,y) ?

ich würd das ganze ein wenig anders organisieren, die verwendung von Break ist IMHO "kein guter Stil"

Code: Alles auswählen

Repeat
    ExamineMouse()
    ExamineKeyboard()

    ClearScreen(0,0,0)   ; oder welche farbe halt..

    DisplaySprite(0,x,y)   ; wo bekommst du hier x und y her? sind beide Null...?
    DisplaySprite(1, MouseX(), MouseY())

    FlipBuffers()

Until MouseButton(1) Or MouseButton(2) Or KeyboardPushed(#PB_Key_Escape)
ReleaseMouse()
...wobei ich mir über die verwendung der Screen Mouse-Befehle im Window nicht ganz sicher bin...

...grundsätzlich seh ich in der proc nicht unbedingt ein problem,
allerdings müsste man schon den rest zu sehen bekommen...
...wie lang ist denn das ganze?

ein mögliches problem könnte darin liegen:
was stellst du denn in dem WindowedScreen dar?

eigentlich stellt man entweder die ganze spielegrafik im WindowedScreen dar, oder man verwendet garkeinen.

und bitte deaktivier mal das häkchen bei "BBCode in diesem beitrag deaktivieren"
kannst du soweit ich mich erinner auch in deinem profil voreinstellen...
Zuletzt geändert von Kaeru Gaman am 20.10.2005 03:02, insgesamt 1-mal geändert.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
redacid
Beiträge: 581
Registriert: 29.08.2004 17:06

Beitrag von redacid »

Kaeru Gaman hat geschrieben: und bitte deaktivier mal das häkchen bei "BBCode in diesem beitrag deaktivieren"
kannst du soweit ich mich erinner auch in deinem profil voreinstellen...
das kannst du auch ruhig größer schreiben.

Ich habe mal soweit die Beiträge editiert, so dass die Codes auch als solche zu erkennen sind.
Benutzeravatar
irobot
Beiträge: 162
Registriert: 16.10.2005 09:22
Kontaktdaten:

Beitrag von irobot »

im prinzip möchte ich "lediglich" ein "Bauteil" am Mauszeiger dran haben
und dieses über den schwarzen Bildschirm verschieben. Dieses Bauteil soll
eine 32 x 32 pixel grosse Grafik sein (schwarz-weiss).

Da es sich um eine Anwendung handelt (siehe www.der-prozess.de das
klärt einiges) sollte das alles in einem Fenster ablaufen.

Gerne verschicke ich auf Wunsch den gesamten Code (momentan
bloss 15 kB) per E-Mail.

Vielen Dank nochmal für eure Hilfe.

Ich habe mir das jetzt in den Kopf gesetzt. Ich werde DER_PROZESS
komplett umschreiben. Ich muss diese Anfangsschwierigkeit mit der
Grafik endlich hinkriegen.

Grüsse
irobot
____________________________________
die echten Profis erkennt man daran, daß sie
einem Laien etwas begreiflich machen können
Benutzeravatar
Pelagio
Beiträge: 424
Registriert: 11.11.2004 17:52
Computerausstattung: AMD Ryzen 5 7600 6-Core Prozessor 3.80 GHz
16,0 GB Arbeitsspeicher
Windows 11 Pro Betriebssystem
Wohnort: Bremen

3D Spirit

Beitrag von Pelagio »

:lamer:
Hallo Leidensgenossen,

ich habe ein Problem mit der Anzeige eines 3DSpirits, gestern funktionierte es noch, heute nicht mehr. Ich habe eine Figur (Dreieck) welche von der oberen linken Ecke in die gegengesetzte Ecke wandern soll. Dies funktionierte gestern auch noch und heute wid das Spirit nicht mehr angezeigt
Warum ?
Wo liegt mein Fehler?

Code: Alles auswählen

{- Konstante
   #Spirits =   0
   #xyLine  = 100
   #wWidth  = 800
   #wHeight = 400
;} Konstante   

;{- Variablen

   Structure xyPoint
      x.l
      y.l
      r.l
   EndStructure
   
   Global xyD.xyPoint
   
;} Variablen

Procedure Figur_Create() 
   CreateSprite(#Spirits, #xyLine, #xyLine, #PB_Sprite_Texture) 
   If StartDrawing(SpriteOutput(#Spirits)) 
      BackColor(0,0,0): FrontColor(0,255,0)
      LineXY(00     , 00, 00      , #xyLine, #Blue)
      LineXY(00     , 00, #xyLine , 00     , #Blue)
      LineXY(#xyLine, 00, 00      , #xyLine, #Blue)
      FillArea(10   , 10, #Blue   , #Red)
      StopDrawing() 
   EndIf
   CreateSprite3D(#Spirits, #Spirits)

EndProcedure 

Procedure Figur_Activate()
   xyD\x = 0: xyD\y = 0: xyD\r = 180
   If Start3D()
      RotateSprite3D (#Spirits, xyD\r, 0)
      DisplaySprite3D(#Spirits, xyD\x, xyD\y)
      Stop3D()
   Else
      MessageRequester("Error", "Can't open 3D", 0)   
   EndIf  
EndProcedure

Procedure Figur_Draw()
   If Start3D()
      DisplaySprite3D(#Spirits, xyD\x, xyD\y, 255)
      Stop3D()
   Else
      MessageRequester("Error", "Can't open 3D", 0)
   EndIf   
EndProcedure

Procedure SetFigur()
   If (xyD\x<(#wWidth -#xyLine)): xyD\x+2: EndIf
   If (xyD\y<(#wHeight-#xyLine)): xyD\y+1: EndIf
   ClearScreen(0 , 0, 0)
EndProcedure

;{- Program

   If (InitSprite()=0) Or (InitKeyboard()=0)
      MessageRequester("Error", "Can't open DirectX 7 Or later", 0)
      End
   EndIf
   If (InitSprite3D()=0)
      MessageRequester("Error", "Direct3D system can't be initialized correctly", 0)
      End
   EndIf

   OpenWindow(0, 100, 100, #wWidth, #wHeight, #PB_Window_TitleBar|#PB_Window_ScreenCentered, "Übungssource 4")
   OpenWindowedScreen(WindowID(), 0, 0, #wWidth, #wHeight, 1, 0, 0)
   Figur_Create  ()
   Figur_Activate()
   Repeat
      ExamineKeyboard()
      SetFigur()
      Figur_Draw()
      FlipBuffers() 
      WindowEvent()
   Until KeyboardPushed(#PB_Key_Escape)
   
;} Program
   
End
Benutzeravatar
Pelagio
Beiträge: 424
Registriert: 11.11.2004 17:52
Computerausstattung: AMD Ryzen 5 7600 6-Core Prozessor 3.80 GHz
16,0 GB Arbeitsspeicher
Windows 11 Pro Betriebssystem
Wohnort: Bremen

Beitrag von Pelagio »

:oops:
Tut mir Leid,

ich hatte den falschen Button gedrückt.
Meine vorheriger Beitrag ist eigendlich ein eigenständiger.
Antworten