I'm making a really simple snake game, and I have an object called Apple which I want to move to a random position every X seconds. So my question is, what is the easiest way to execute this code every X seconds?
apple.x = rg.nextInt(470);
apple.y = rg.nextInt(470);
Thanks.
Edit:
Well do have a timer already like this:
Timer t = new Timer(10,this);
t.start();
What it does is draw my graphic elements when the game is started, it runs this code:
#Override
public void actionPerformed(ActionEvent arg0) {
Graphics g = this.getGraphics();
Graphics e = this.getGraphics();
g.setColor(Color.black);
g.fillRect(0, 0, this.getWidth(), this.getHeight());
e.fillRect(0, 0, this.getWidth(), this.getHeight());
ep.drawApple(e);
se.drawMe(g);
I would use an executor
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
Runnable toRun = new Runnable() {
public void run() {
System.out.println("your code...");
}
};
ScheduledFuture<?> handle = scheduler.scheduleAtFixedRate(toRun, 1, 1, TimeUnit.SECONDS);
Use a timer:
Timer timer = new Timer();
int begin = 1000; //timer starts after 1 second.
int timeinterval = 10 * 1000; //timer executes every 10 seconds.
timer.scheduleAtFixedRate(new TimerTask() {
#Override
public void run() {
//This code is executed at every interval defined by timeinterval (eg 10 seconds)
//And starts after x milliseconds defined by begin.
}
},begin, timeinterval);
Documentation: Oracle documentation Timer
Simplest thing is to use sleep.
apple.x = rg.nextInt(470);
apple.y = rg.nextInt(470);
Thread.sleep(1000);
Run the above code in loop.
This will give you an approximate(may not be exact) one second delay.
You should have some sort of game loop which is responsible for processing the game. You can trigger code to be executed within this loop every x milliseconds like so:
while(gameLoopRunning) {
if((System.currentTimeMillis() - lastExecution) >= 1000) {
// Code to move apple goes here.
lastExecution = System.currentTimeMillis();
}
}
In this example, the condition in the if statement would evaluate to true every 1000 milliseconds.
Related
I try to create a timer in java and show it on JFrame but when I comper my timer to my phone timer the timer in my phone is faster then my why?
I set the deley to 10 to every hundred of second in my timer.
This is the code only for the timer:
import javax.swing.Timer;
int min = 0, sec = 0, hundredSec = 0;
timer = new Timer(10, new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
hundredSec++;
if(hundredSec >= 99)
{
sec++;
hundredSec = 0;
}
if(sec >= 59)
{
min++;
sec = 0;
}
timerL.setText(String.format("%02d:%02d:%02d", min, sec, millisec));
}
});
Sorry for bad english.
Thanks in advance for answer.
I believe that your problem has to do with the third line of code. As the java API docs says: "The delay parameter is used to set both the initial delay and the delay between event firing, in milliseconds." This means that there is a 10 millisecond delay every time, which might be causing your delay. To fix that you can change the line of code to:
timer = new Timer(0, new ActionListener());
By changing 10 to 0 it would run instantly as opposed to slowly falling behind. I would recommend reading this article to learn more about timers.
The delay you pass into a Timer is just that, a delay before the event is queued, not an exact time that the event will perform. While you can be sure that 10ms have passed since the last time the call was performed, you can't be sure that ONLY 10ms have passed.
You probably want something like this (with as little change to your code as possible; there are certainly different/more optimal ways to do this):
import javax.swing.Timer;
Date dt = new Date();
timer = new Timer(10, new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
int min = 0, sec = 0, hundredSec = 0;
long millisec = (new Date()).getTime() - dt.getTime();
hundredSec = ( millisec / 10 ) % 100;
sec = ( millisec / 1000 ) % 60;
min = ( millisec / 60000 );
timerL.setText(String.format("%02d:%02d:%02d", min, sec, hundredSec));
}
});
There are a couple issues here (missing timerL declaration, and I fixed the millisec reference in the setText call), but they're the same as you had above, so I assume you're just posting a snippet.
I wanted to know how can I add time to my events in libgdx. I have a button and when you press it a sprite will appear. I want the sprite to appear for only a short period of time. How can I do this? I used Scene2D to make the sprites as an actor.
I will show you an example in pseudo code.
wait time = 5 second;
current time = get time;
if (current time > wait time) {
// do the following
}
There's two ways to do this. You can either use something similar to your your pseudo code or you can use a timer.
Manual calculation:
private Long lifeTime;
private Long delay = 2000L; //1000 milliseconds per second, so 2 seconds.
public void create () {
lifeTime = System.currentTimeMillis();
}
public void render () {
lifeTime += Gdx.graphics.getDeltaTime();
if (lifetime > delay) {
//Do something
}
}
Using a timer:
private float delay = 2; //In seconds this time
//At some point you set the timer
Timer.schedule(new Task(){
#Override
public void run() {
// Do something
}
}, delay);
Read more here: https://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/utils/Timer.html
Right now I have a timer that has a delay of 5 seconds, however I need a different delay after it has run once.
I am going through some pictures and during the first round it should show them for 5 seconds. After that it should show them for 10 seonds. How is it possible to change the delay of a Timer during runtime?
What has to happen:
Start Timer
Run for 5 seconds
Change delay
Run for 10 seconds
Try to add some code!
You need to check if the timer has 5 seconds make it 10 and so on.
int delayTime = 5;
//run first delay
if (delayTime == 5){
delayTime = 10;
}
This is some code for the idea, don't know how it looks in your project.
There can be two approach for your use case:
First Approach:
Like say I want to show the picture for 1000 seconds. So I will execute for loop till 1000 seconds; or if you want to run it infinitely then you can change the condition in for loop. Below code will execute the for loop after every 5 seconds delay.
int delayTimeInMiliSec;
for(int delayTime = 5 ; delayTime<=1000; delayTime = delayTime+5){
delayTimeInMiliSec = delayTime * 1000;
// here Call your method that shows pictures
Thread.sleep(delayTimeInMiliSec);
}
Second Approach:
create a class extending TimerTask(available in java.util package). TimerTask is a abstract class.
Write your code in public void run() method that you want to execute periodically.
Code sample:
import java.util.TimerTask;
// Create a class extends with TimerTask
public class ScheduledTask extends TimerTask {
// Add your task here
#Override
public void run() {
//show pictures code
}
}
import java.util.Timer;
public class SchedulerMain {
public static void main(String args[]) throws InterruptedException {
Timer time = new Timer(); // Instantiate Timer Object
ScheduledTask st = new ScheduledTask(); // Instantiate SheduledTask class
time.schedule(st, 0, 5000); // Create Repetitively task for every 5 secs
}
}
I am using timer.schedule(minuteTask, 0, 1000*60) to generate a new color at regular intervals. As you can see by the gif below that I recorded, the interval does not seem to be working.
Timer timer = new Timer ();
TimerTask minuteTask = new TimerTask() {
#Override
public void run () {
java.util.Random random = new java.util.Random();
int r = random.nextInt(255);
int g = random.nextInt(255);
int b = random.nextInt(255);
}
};
timer.schedule(minuteTask, 0, 1000*60);
Any idea on how to fix this?
Use this
new Timer().scheduleAtFixedRate(
new TimerTask() {
#Override
public void run() {
//put UR code herr
}
}, 0, 1000);
Hi I think you should use the scheduleAtFixedRate(..) function of Timer. This will help you to change the color in given time interval.
A simple schedule() method will execute at once while scheduleAtFixedRate() method takes and extra parameter which is for repetition of the task again & again on specific time interval.
Look at below code snippet:
Timer timer = new Timer();
timer.schedule( new performClass(), 30000 );
This is going to perform once after the 30 Second Time Period Interval is over. A kind of timeoput-action.
Timer timer = new Timer();
//timer.scheduleAtFixedRate(task, delay, period);
timer.scheduleAtFixedRate( new performClass(), 1000, 30000 );
This is going to start after 1 second and will repeat on every 30 seconds time interval.
I have a timer set up that should run code every 10th of a second, but instead it seems to run the desired code only once. I cannot figure out what I am doing wrong. :{
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
#Override
public void run() {
System.out.println("it only prints this once");
}
}, 100, 100000);
Thanks in advance for your help.
The last two arguments to scheduleAtFixedRate seem odd. The first one is always 0 (which is not a problem; just means that there's no delay before the first execution). The second is set to 2 minutes, not 0.1 second. The argument is supposed to be the rate in milliseconds. For 0.1 second, you should use 100, not 2*60*1000.
Try this:
timer.scheduleAtFixedRate(new TimerTask() {
#Override
public void run() {
System.out.println("it only prints this once");
}
}, 100, 100);