• Anmelden

1

Sonntag, 26. April 2009, 19:29

Per RGSS die Zeit runter zählen.

Hi,

ich hab eine Variable die Ich abfrage, nun möchte ich nach der Abfrage den Wert der Variable um 1 senken.
Jedoch soll sich der Wert nicht sofort senken sondern erst nach 3 Minuten.

Nun häng ich schon die ganze Zeit an dem Problem, ich hoffe jemand kann mir erklären wie ich die Zeit per Script runterzählen kann.
Spoiler: Hier nochmal die Abfrage!

Ruby Quellcode

1
2
3
if $game_variables[1] >= 0
$game_variables[1] -= 1 
end
zum Lesen den Text mit der Maus markieren

Gruß

site

2

Sonntag, 26. April 2009, 20:03

Das hier sollte dir helfen... Die Zeit, Bewegungen und Wait

3

Montag, 27. April 2009, 18:43

Mhm ich hab das jetzt mal ausprobiert aber i-wie funzt das nicht.
Der Wert der Variable ist höher als 0 und trotzdem wird die Variable nicht gesenkt oO

Spoiler: Die Abfrage

Ruby Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Fahndung_Senken
 
  def main
    @wait = 3
    update
  end
 
  def update
    if $game_variables[1] >= 0
      if @wait == 0
        $game_variables[1] -= 1 
        @wait = 3
      else
        @wait -= 1
      end
    end
  end
end
zum Lesen den Text mit der Maus markieren
kann mir wer sagen wo mein Fehler liegt?

Gruß

site

4

Montag, 27. April 2009, 19:22

Wo und wie rufst du denn die update Methode auf?

5

Montag, 27. April 2009, 19:51

Wo und wie rufst du denn die update Methode auf?
In Scene Map in der Update Methode, oder wie kann ich das sonst noch machen?
Spoiler

Ruby Quellcode

1
2
3
      if $fahndung_senken  != nil and $fahndung_senken.disposed? == false
         $fahndung_senken.update
       end
zum Lesen den Text mit der Maus markieren

Sry bin noch ein ziemlicher Anfänger^^

Edit
Edit hier nochmal ne Demo und der ganze Code^^
Project2.exe

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »siteplayer« (28. April 2009, 17:36)


Reborn

hat beim Stromkonzern schon Rabatt

Motto: Wer noch was vom Wochenende weis, hat es nie erlebt!

  • Nachricht senden

6

Mittwoch, 29. April 2009, 12:32

Ich machs immer gerne so

Ruby Quellcode

1
2
3
4
5
6
@frame = 0 if @frame == nil
@frame += 1
if @frame == 40
  p"es ist eine Sekunde vergangen"
  @frame = 0
end


Das ganze funktioniert so:
Wenn ein Script 40 mal Durchgelaufen ist, dann ist eine Sekunde vergangen... Geht aba nur im Maker, so weit wie ich weis^^
Mehr als a Allgäuer ka a Mensch it wera.


Wie soll ich wissen was ich denke, bevor ich nicht höre was ich sage?


Spoiler: OpenSource-Projects
NES-Emulator - a simple NES-Emulator
ERDL - a embedded Ruby Interpreter with the abilltiy to render images with DirectX ERDL shall be 100% compatible to RPGXP-Ruby Scripts
zum Lesen den Text mit der Maus markieren

Neo-Bahamut

Himmelsgleicher

Motto: Wer anderen eine Bratwurst brät, der hat ein Bratwurstbratgerät.

  • Nachricht senden

7

Mittwoch, 29. April 2009, 16:33

Gilt aber nur bei FPS = 40
Dafür ist Time.now besser geeignet ;D
Spoiler: Wurstinator
zum Lesen den Text mit der Maus markieren

Spoiler: Lazer-Wurst
zum Lesen den Text mit der Maus markieren

Spoiler: Hallowurst
zum Lesen den Text mit der Maus markieren

8

Mittwoch, 29. April 2009, 20:27

Ich hab das ganze jetzt nochmal umgeschrieben und dabei das Script von Kai mal ausprobiert.
Spoiler: Kai's Script

Ruby Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
module FrameTime
  def frames
    self
  end
  alias frame frames
  def seconds
    Integer(self * Graphics.frame_rate)
  end
  alias second seconds
  def minutes
    seconds * 60
  end
  alias minute minutes
  def hours
    minutes * 60
  end
  alias hour hours
end
 
class Numeric
  include FrameTime
end
 
module Kernel
  private
  def every(time)
    if Graphics.frame_count % time == 0 then
      yield
    end
  end
end
 
class Timer
 
  def initialize
    reset
  end
 
  def if_reached time
    yield if ticks >= time
  end
 
  def once_reached time
    yield if ticks == time
  end
 
  def reset
    @creation_time = Graphics.frame_count
  end
 
  def ticks
    Graphics.frame_count - @creation_time
  end
 
end
zum Lesen den Text mit der Maus markieren
Spoiler: site's Script

Ruby Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Fahndung_Senken
 
  def initialize
    @timer = Timer.new
    refresh
  end
 
  def refresh
    if $game_variables[1] <= 0
      $game_variables[1] = 0
    end
    if $game_variables[1] >= 4
      $game_variables[1] = 4
    end
    if $game_variables[1] >= 0
      @timer.once_reached 1.minute do
        $game_variables[1] -= 1 
      end
    end
  end
end
zum Lesen den Text mit der Maus markieren
Das ganze rufe ich per Call Script auf

Ruby Quellcode

1
$fahndung_senken
.

Aber es funzt immer noch nicht :/ kann mir wer sagen wo mein Fehler liegt?

9

Mittwoch, 29. April 2009, 21:47

Das ganze rufe ich per Call Script auf

Ruby Quellcode

1
$fahndung_senken
.

Aber es funzt immer noch nicht :/ kann mir wer sagen wo mein Fehler liegt?


Der Aufruf:

Ruby Quellcode

1
$fahndung_senken = Fahndung_Senken.new

10

Donnerstag, 30. April 2009, 15:43

$fahndung_senken = Fahndung_Senken.new

Habs geändert aber nach einer Minute verändert sich trotzdem nichts =(
Der Wert der Variable bleit trotzdem noch der gleiche.

11

Freitag, 1. Mai 2009, 01:04

Du musst dann natürlich noch jedes update die refresh-methode aufrufen (also jeden Frame).
mit $fahndung_senken.refresh .
Wenn du das ganze per Eventcode machst, wird das wohl ein parallel Process Event übernehmen müssen...
Edit:
Und ändere am besten:

Ruby Quellcode

1
2
3
4
5
    if $game_variables[1] >= 0
      @timer.once_reached 1.minute do
        $game_variables[1] -= 1 
      end
    end
in:

Ruby Quellcode

1
2
3
4
5
6
    if $game_variables[1] >= 0
      @timer.once_reached 1.minute do
        $game_variables[1] -= 1 
        @timer = Timer.new
      end
    end

12

Freitag, 1. Mai 2009, 01:54

Wie bereits gesagt einfach in einem parallelen Prozess die update Methode aufrufen. Und wenn der Timer regelmäßig sein soll, würde ich eher zu

Ruby Quellcode

1
2
3
every 1.minute do
  #...
end

greifen. Oder aber eben @timer.reset in den Block schreiben.

Außerdem solltest du aufpassen, dass im besagten Parallelen Prozess kein Wait-Befehl steckt. Sonst werden Frames übersprungen. Du fragst mit once_reached einen genauen Zeitpunkt ab. Wird dieser übersprungen, tritt das Ereignis nie ein. Eine sicherere Alternative ist if_reached, die auch dann noch eintritt, wenn der Zeitpunkt abgelaufen ist.
Bild
RMXP Grundkurs
1 2 3
Ruby/RGSS-Kurs

13

Freitag, 1. Mai 2009, 19:05

Vielen Dank für die Zahlreiche Hilfe =)

Habs jetzt endlich^^ hinbekommen =)

Dankö :)

Ähnliche Themen

Social Bookmarks