私はこれを機能させるためにグーグルで非常に多くのサイトを検索しましたが、誰もこれをどこにも持っていないようです、そしてそれらがそうするならそれは私のプログラムでうまくいかないだけです...プレイヤーがヒットしたとき、最初にヒットしてから2回目にヒットするまでの時間は「x」であると反動します。
だから私はBoolean "hit" = false
そして彼が殴られると、それはtrue
に変わります。つまり、再びfalseに変更されるまで、彼は再び攻撃を受けることはできません。
だから私は私のプログラムで「タイマー」を「x」秒の量に設定する関数を設定しようとしていますIF hit = true
そして、そのタイマーが「x」秒に達すると、ヒットはfalseに戻ります。
誰かアイデアはありますか?
ありがとう!
簡単なオプションは、 millis() を使用して手動で時間を追跡することです。
2つの変数を使用します。
Draw()メソッドでは、現在の時間(ミリ単位)と以前に保存された時間の差が遅延よりも大きい(または等しい)かどうかを確認します。
もしそうなら、これはあなたが与えられた遅延のために何でもし、保存された時間を更新するための手がかりになるでしょう:
_int time;
int wait = 1000;
void setup(){
time = millis();//store the current time
}
void draw(){
//check the difference between now and the previously stored time is greater than the wait interval
if(millis() - time >= wait){
println("tick");//if it is, do something
time = millis();//also update the stored time
}
}
_
画面上の「針」を更新するわずかなバリエーションは次のとおりです。
_int time;
int wait = 1000;
boolean tick;
void setup(){
time = millis();//store the current time
smooth();
strokeWeight(3);
}
void draw(){
//check the difference between now and the previously stored time is greater than the wait interval
if(millis() - time >= wait){
tick = !tick;//if it is, do something
time = millis();//also update the stored time
}
//draw a visual cue
background(255);
line(50,10,tick ? 10 : 90,90);
}
_
セットアップ/ニーズに応じて、このようなものを再利用可能なクラスにラップすることを選択できます。これは基本的なアプローチであり、AndroidおよびJavaScriptバージョンでも機能するはずです(ただし、javascriptではsetInterval()があります)。
FrankieTheKneeManが提案したように、Javaのユーティリティの使用に興味がある場合は、 TimerTask クラスが利用可能であり、そこにはたくさんのリソース/例があると確信しています。
以下のデモを実行できます。
_var time;
var wait = 1000;
var tick = false;
function setup(){
time = millis();//store the current time
smooth();
strokeWeight(3);
}
function draw(){
//check the difference between now and the previously stored time is greater than the wait interval
if(millis() - time >= wait){
tick = !tick;//if it is, do something
time = millis();//also update the stored time
}
//draw a visual cue
background(255);
line(50,10,tick ? 10 : 90,90);
}
_
_<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.4.4/p5.min.js"></script>
_
更新タイマーを作成する方法はたくさんあります。これは、スレッドを使用し、スケッチで定義されている関数を名前で呼び出すバージョンです。これは単純なカウントダウンではありません。上で説明したように、まっすぐにmillis()
は十分に単純ですが、あまり柔軟ではありません。
_Timer timer;
void setup(){
noStroke();
//textSize(12);
timer = new Timer(this,"onTimerTick","onTimerComplete");
// start a timer for 10 seconds (10 * 1000 ms) with a tick every second (1000 ms)
timer.reset(10 * 1000,1000);
}
void draw(){
background(0);
drawTimer();
//rect(0,0,timer.progress * width,height);
//blendMode(DIFFERENCE);
text("'1' = reset"+
"\n'2' = cancel"+
"\n'3' = pause"+
"\n'4' = resume"+
"\n"+(int)(timer.progress * 100)+"%",10,15);
}
void drawTimer(){
pushStyle();
noFill();
stroke(255);
strokeWeight(3);
ellipse(450, 54,90,90);
fill(192,0,0);
noStroke();
pushMatrix();
translate(50,50);
rotate(radians(-90));
arc(0, 0, 90, 90, 0, timer.progress * TWO_PI, PIE);
popMatrix();
popStyle();
}
void keyPressed(){
if(key == '1'){
timer.reset(3000,10);
}
if(key == '2'){
timer.cancel();
}
if(key == '3'){
timer.pause();
}
if(key == '4'){
timer.resume();
}
}
public void onTimerTick(){
println("tick",(int)(timer.progress * 100),"%");
}
public void onTimerComplete(){
println("complete");
}
import Java.lang.reflect.Method;
// utility timer class
class Timer implements Runnable{
// is the timer still ticking or on hold ?
boolean isPaused = false;
// is the thread still running ?
boolean isRunning = true;
// how close are we to completion (0.0 = 0 %, 1.0 = 100%)
float progress = 0.0;
// a reference to the time in ms since the start of the timer or reset
long now;
// default duration
long duration = 10000;
// default tick interval
long tickInterval = 1000;
// time at pause
long pauseTime;
// reference to the main sketch
PApplet parent;
// function to call on each tick
Method onTick;
// function to call when timer has completed
Method onComplete;
Timer(PApplet parent,String onTickFunctionName,String onCompleteFunctionName){
this.parent = parent;
// try to store a reference to the tick function based on its name
try{
onTick = parent.getClass().getMethod(onTickFunctionName);
}catch(Exception e){
e.printStackTrace();
}
// try to store a reference to the complete function based on its name
try{
onComplete = parent.getClass().getMethod(onCompleteFunctionName);
}catch(Exception e){
e.printStackTrace();
}
// auto-pause
isPaused = true;
// get millis since the start of the program
now = System.currentTimeMillis();
// start the thread (processes run())
new Thread(this).start();
}
// start a new stop watch with new settings
void reset(long newDuration,long newInterval){
duration = newDuration;
tickInterval = newInterval;
now = System.currentTimeMillis();
progress = 0;
isPaused = false;
println("resetting for ",newDuration,"ticking every",newInterval);
}
// cancel an existing timer
void cancel(){
isPaused = true;
progress = 0.0;
}
// stop this thread
void stop(){
isRunning = false;
}
void pause(){
isPaused = true;
pauseTime = (System.currentTimeMillis() - now);
}
void resume(){
now = System.currentTimeMillis() - pauseTime;
isPaused = false;
}
public void run(){
while(isRunning){
try{
//sleep per tick interval
Thread.sleep(tickInterval);
// if we're still going
if(!isPaused){
// get the current millis
final long millis = System.currentTimeMillis();
// update how far we're into this duration
progress = ((millis - now) / (float)duration);
// call the tick function
if(onTick != null){
try{
onTick.invoke(parent);
}catch(Exception e){
e.printStackTrace();
}
}
// if we've made, pause the timer and call on complete
if(progress >= 1.0){
isPaused = true;
// call on complete
if(onComplete != null){
try{
onComplete.invoke(parent);
}catch(Exception e){
e.printStackTrace();
}
}
}
}
}catch(InterruptedException e){
println(e.getMessage());
}
}
}
}
_