Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 28.08.2011, 16:52 Titel: Multikey und Sleep oder ähnliches |
|
|
Hallo ihr lieben Programmierer
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?
Brauche also eine Multikey ähnliche Abfrage, die allerdings viel langsamer abläuft. |
|
Nach oben |
|
 |
schildron
Anmeldungsdatum: 25.08.2008 Beiträge: 86
|
Verfasst am: 28.08.2011, 17:15 Titel: |
|
|
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 |
|
 |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 28.08.2011, 17:50 Titel: |
|
|
Hm, danke.
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.
(Ja, ich habe einen guten Grund, die Variable "zeit" zu nutzen, anstatt einem Timer). |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4702 Wohnort: ~/
|
Verfasst am: 28.08.2011, 17:54 Titel: |
|
|
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 |
|
 |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 28.08.2011, 17:57 Titel: |
|
|
Ich habs auch grad gemerkt.  |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 28.08.2011, 20:47 Titel: |
|
|
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 |
|
 |
Muttonhead

Anmeldungsdatum: 26.08.2008 Beiträge: 565 Wohnort: Jüterbog
|
Verfasst am: 29.08.2011, 12:20 Titel: |
|
|
Eternal_Pains "static" hatte mir gefallen
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
also mit ner Tastenzeit=10 gehts so einigermaßen...
 |
|
Nach oben |
|
 |
|