So I'm making a game and I need a timer to regend/deregen stamina from the player.
Here's my current code:
Timer staminaTimer = new Timer(); //Java.util timer
public void update() {
staminaTimer.schedule(new TimerTask(){
public void run() {
//regen/Deregen stamina
}
}, 0L, 10L * 1000L);
}
So this timer is in an method that is getting called every game tick. I don't know why but if I put a print in the run() its starts normally then becomes really fasts and crashes everything. I would really like to know another way of making a repeating timer or the fix of this... Thanks for help in advance.
Related
I'm creating 2 timers in my code. One is the logic timer that updates the logic every 0.017 seconds:
logicTimer = new Timer();
logicTimer.scheduleTask(new Timer.Task() {
#Override
public void run() {
updateLogic();
}
}, 0f, timePerProcessing);
And the other one is for generating obstacles every 3 seconds:
meteoroidTimer = new Timer();
meteoroidTimer.scheduleTask(new Timer.Task() {
#Override
public void run() {
generateMeteoroids();
}
},1f,3f);
When I pause my game and resume afterwards, my logic timer still works but my obstacle timer doesn't. I thought it was because I use a Random object in my method that I call in the timer, but I tried with a simple:
System.out.println("It is showing");
and it still doesn't resume.
My code for pause and resume:
#Override
public void pause(){
meteoroidTimer.stop();
logicTimer.stop();
}
#Override
public void resume(){
meteoroidTimer.start();
logicTimer.start();
}
You dont need to use the timer.stop and star on resume because when you leave the app libgdx stops rendering/updating anyway so your timers wont be updated anyway.
I am writing a script that will cause the players HP to decrease at an interval as long as they are within a range of the item/monster/lava whatever it is. I have the detection just fine, but I cant seem to get the interval to run. I know this is probably because I am creating a new TimerTask as I render, but I cant seem to figure it out.
for(Monster monster : monsters) {
renderer.processEntity(monster);
if(player.withinDistance(10, monster.getPosition()))
timer.scheduleAtFixedRate(new TimerTask() {
#Override
public void run() {
System.out.println("tick");
Player.PLAYER_HEALTH -= 10;
}
}, 2000, 2000);
}
So for all monsters, it checks the positions, if you are near it opens a timer task that should tick every 2 seconds while that condition is true. How can I make this work properly? Is a timer task optimal for this situation?
The problem here is that you are updating the PLAYER_HEALTH static property of the Player class. You should update the Player instance!
for(Monster monster : monsters) {
renderer.processEntity(monster);
if(player.withinDistance(10, monster.getPosition()))
timer.scheduleAtFixedRate(new TimerTask() {
#Override
public void run() {
System.out.println("tick");
player.decreaseHealth(10); // Use the instance
}
}, 2000, 2000);
}
Also, if your program ends, the TimerTask will end too. Make sure your program is still running.
My Goal: Make one script wait .5 seconds, run, make another script wait .5 seconds, run.
The problem I am running into is that Timer.instance().clear(); makes the run() method only run once, on it's own it runs more than once. But, it also deletes Timer2 because it does not wait .5 seconds to run the code after the timer you scheduled (clear() removes all Timers/scheduled tasks). So, it ends up deleting the the Timer2 after .5 seconds.
Edit: Made a dumb error, I was not recognizing how the method was being called. I got it fixed :)
//Timer1
Timer.schedule(new Task(){
#Override
public void run() {
// \/ removes both Timer1 and Timer2
Timer.instance().clear();
}
}, .5f);
//Timer2
Timer.schedule(new Task(){
#Override
public void run() {
Timer.instance().clear();
}
}, 1f);
This works: "Make instance of timers: Timer timer1 = new Timer(); and Timer timer2 = new Timer(); then assign your schedules and code will run only once automatically. Like that: timer1.scheduleTask(....)" – aloupas
i wan't a timer do a job every 2.5 seconds (at the start of the program),
that is working with the following code.
Timer timer = new Timer();
timer.schedule(new TimerTask() {
// #Override
#Override
public void run() {
here is the code, and i do Speed = Speed-500
}, Speed,Speed);
Speed is a int:
public int Speed=2500;
buth the problem is that the speed of the timer stays on the 2500, while the variable speed lowers each time with 500, so that part is working. Only the timer doesn't check if Speed has changed.
Can somebody help me with this?
you cant do that because it will fix that with Timer once you done the schedule.
Schedules the specified task for repeated fixed-delay execution, beginning after the specified delay. Subsequent executions take place at approximately regular intervals separated by the specified period.
In this case you can cancel the previous one and schedule new TimerTask.
Timer timer = new Timer();
initialize the speed here
loop based on time
timer.schedule(new TimerTask() {
// #Override
#Override
public void run() {
here is the code, and i do Speed = Speed-500
}, Speed,Speed);
I want to create a countdown clock in GWT but I cannot find the right function that waits for one second. I tried with Thread.Sleep() but I think it is for another purpose.
Can you help me? This is my code.
int count=45;
RootPanel.get("countdownLabelContainer").add(countdown);
for(int i=count; i>=0; i--)
{
countdown.setText(Integer.toString(i));
// Place here the wait-for-one-second function
}
Give Timer a try (See Here).
Changing the example code real quick to something close to what you want, you'll want to buff this up for your purposes though:
public class TimerExample implements EntryPoint, ClickListener {
int count = 45;
public void onModuleLoad() {
Button b = new Button("Click to start Clock Updating");
b.addClickListener(this);
RootPanel.get().add(b);
}
public void onClick(Widget sender) {
// Create a new timer that updates the countdown every second.
Timer t = new Timer() {
public void run() {
countdown.setText(Integer.toString(count));
count--;
}
};
// Schedule the timer to run once every second, 1000 ms.
t.schedule(1000);
}
}
This sounds like something in the general area of what your looking for. Note that you can use timer.cancel() to stop the timer. You'll want to tie this in with your count (when 45 hits 0).
The following snippet showing the use of the timer works too. It shows how to schedule the timer properly and how to cancel it.
// Create a new timer that updates the countdown every second.
Timer t = new Timer() {
int count = 60; //60 seconds
public void run() {
countdown.setText("Time remaining: " + Integer.toString(count) + "s.");
count--;
if(count==0) {
countdown.setText("Time is up!");
this.cancel(); //cancel the timer -- important!
}
}
};
// Schedule the timer to run once every second, 1000 ms.
t.scheduleRepeating(1000); //scheduleRepeating(), not just schedule().