Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Multikey und Sleep oder ähnliches

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 28.08.2011, 16:52    Titel: Multikey und Sleep oder ähnliches Antworten mit Zitat

Hallo ihr lieben Programmierer lächeln

Ich habe ein wenig programmiert und bin zu folgendem Problem gelangt: Ich möchte per S-Taste einen Punkt auf der X-Achse bewegen. Wenn ich nun S drücke bewegt sich der Punkt dermaßen schnell aus dem sichtbaren Bereich weg, dass man ihn nur für 1 Sekunde sieht. Man könnte das ja nun per Sleep kontrollieren, sodass er sich ein wenig langsamer bewegt, allerdings werden auch einige andere Aktionen ausgeführt, während der Punkt bewegt wird. Wenn ich nun Sleep benutze, werden ja auch alle andere Aktionen während der Punktbewegung langsamer ausgeführt. Versteht ihr mein Dilemma? verwundert
Brauche also eine Multikey ähnliche Abfrage, die allerdings viel langsamer abläuft.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
schildron



Anmeldungsdatum: 25.08.2008
Beiträge: 86

BeitragVerfasst am: 28.08.2011, 17:15    Titel: Antworten mit Zitat

Hi Westbeam!

Im folgenden Beitrag sind Teile meines Movement-Codes meines 2D-Spiels:

Zeitnahme:
Code:

   '----------------------
   'Zeitnahme
   '----------------------
   G_ActualTime = Timer
   G_VergangeneZeit = ( G_ActualTime - G_LastTime )
   G_LastTime = G_ActualTime
   '----------------------
   'FPS messen
   '----------------------=
   If (G_ActualTime - G_LastSecond) >= 1 Then
      G_LastSecond = G_ActualTime
      G_FPS = G_Frames
      G_Frames = 0
   EndIf
   G_Frames += 1

Steuerungscode:
Code:

'-------------------------------
'Steuerungscode by Schildron
'-------------------------------
With Player(ActivePlayer)

   '------------------------
   'Spielfigur bewegen
   '------------------------
   If MultiKey(FB.SC_A) Then
      .VelX = .VelX - G_VergangeneZeit*150
      .ViewPos = -1
   EndIf
   If MultiKey(FB.SC_D) Then
      .VelX = .VelX + G_VergangeneZeit*150
      .ViewPos = 1
   EndIf
   If MultiKey(FB.SC_SPACE) Then
      If .Contact_Ground = 1 And (G_ActualTime-.TimeLastJump) > 0.7 Then
         .TimeLastJump = G_ActualTime
         .VelY = .VelY + 350
      EndIf
   EndIf

End With


Die als Velocity abgespeicherte Bewegung wird jetzt in einem Teil der Physik-Engine angewendet:

Code:

For PlayerCounter As Integer = 1 To PlayerCount

   If Player(PlayerCounter).PlayerActiv = 1 And Player(PlayerCounter).CalculatedByPlayer = ActivePlayer Then      'Nur Aktive Spieler berechnen

      With Player(PlayerCounter)

         'Kollisionsabfrage  [Bei Kollision Bewegung stoppen]
         If .Contact_Ground = 1 And .VelY <= 0 Then
            .VelY = 0
            G_Gravitation = 0         'Gravitation bei Bodenkontakt ausschalten,...
         Else
            G_Gravitation = G_Gravitation_Backup      '... sonst wieder einschalten
         EndIf
         If .Contact_Top = 1 And .VelY >= 0 Then .VelY = 0

         If .Contact_Right = 1 And .VelX >= 0 Then .VelX = 0
         If .Contact_Left = 1 And .VelX <= 0 Then .VelX = 0

         .PosX = .PosX + .VelX
         .VelX = 0 'für nächsten Frame zurücksetzen

         .VelY = G_Gravitation * G_VergangeneZeit + .VelY
         .PosY = G_Gravitation/2 * (G_VergangeneZeit^2) + .VelY * G_VergangeneZeit + .PosY

      End With

   EndIf

Next PlayerCounter

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 28.08.2011, 17:50    Titel: Antworten mit Zitat

Hm, danke. zwinkern

Habe aber dennoch ein Problem dabei:
Code:
Screen 12
Var x=100
Declare Function SuperKey(taste As Integer)As Integer
Dim Shared As Integer zeit,tastezeit

Do
   Screenlock
      Cls
      Line (x,50)-(x+5,55),15,BF
      If Superkey(&h1F) Then x+=16
   Screenunlock
   zeit+=1
   Sleep 1
Loop Until Inkey=Chr(27)
End

Function SuperKey(taste As Integer)As Integer
   If Multikey(taste) And tastezeit<=zeit-250 Then
      Return Multikey(taste)
      tastezeit=zeit
   Else
      Return 0
   End If
End Function

Nur ein Testcode, aber er funktioniert dennoch nicht. Normalerweise müsste die Funktion "SuperKey" nur alle 250 Millisekunden einen Wert zurückgeben. Allerdings wird offenbar nur 250 Millisekunden gewartet um danach den Punkt wieder in Lichtgeschwindigkeit zu bewegen. neutral
(Ja, ich habe einen guten Grund, die Variable "zeit" zu nutzen, anstatt einem Timer).
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4703
Wohnort: ~/

BeitragVerfasst am: 28.08.2011, 17:54    Titel: Antworten mit Zitat

Code:
Return Multikey(taste)
tastezeit=zeit

ist seltsam - nach einem RETURN wird nichts weiter mehr ausgeführt.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 28.08.2011, 17:57    Titel: Antworten mit Zitat

Ich habs auch grad gemerkt. mit dem Kopf durch die Mauer wollen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 28.08.2011, 20:47    Titel: Antworten mit Zitat

Ich hatte mal ein ähnliches problem mit der ESC...

Edit: (mit timer)
Code:
Function MyKey_ESC as Integer
    Static K_Timer         as Single
    Static K_Old           as Integer
    Dim    If_Key          as Integer
   
    If_Key=ABS(Multikey(&h01))
   
    If K_Old<>If_Key orelse (Timer-K_Timer)>.25 Then
            K_Timer=Timer
            K_Old=If_Key
            Return If_Key
    End If
   
    Return 0
End Function

_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Muttonhead



Anmeldungsdatum: 26.08.2008
Beiträge: 565
Wohnort: Jüterbog

BeitragVerfasst am: 29.08.2011, 12:20    Titel: Antworten mit Zitat

Eternal_Pains "static" hatte mir gefallen lächeln
absolut ungetestet, müßte aber zusätzlich auf Tastenwechsel
reagieren.

Code:

Screen 12
Var x=100
Declare Function SuperKey(taste As Integer)As Integer
Dim Shared As Integer zeit,tastezeit
zeit=0
tastezeit=250

Do
   Screenlock
      Cls
      Line (x,50)-(x+5,55),15,BF
      If Superkey(&h1F) Then x+=16
   Screenunlock
   zeit+=1
   Sleep 1
Loop Until Inkey=Chr(27)
End

Function SuperKey(taste As Integer)As Integer
  static altetaste as integer   
  function=0
 
  if multikey(taste) then
    'reagiert sofort auf Tastenwechsel
    if taste<>altetaste then
      altetaste=taste   
      zeit=0
      function=-1
    end if 
    'Delay
    if zeit>tastezeit then
      zeit=0
      function=-1
    end if
  end if
End Function


ps: jetzt erst getestet...... uhhh ist das gruselig verlegen
also mit ner Tastenzeit=10 gehts so einigermaßen...
grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz