У меня на экране много спрайтов. Если спрайт s1 сталкивается со спрайтом2, оба спрайта должны воспроизводить звук (или аналогичный).
Я создал игровой цикл:
public void run( )
{
long startTime;
long sleepTime;
while (this.running)
{
startTime = System.currentTimeMillis();
this.view.updatePhysics( );
Canvas canvas = null;
try
{
canvas = this.view.getHolder( ).lockCanvas( );
synchronized (this.view.getHolder( ))
{
this.view.onDraw( canvas );
}
}
finally
{
if (canvas != null)
this.view.getHolder( ).unlockCanvasAndPost( canvas );
}
sleepTime = TICS_PRO_SECOND - ( System.currentTimeMillis( ) - startTime );
try
{
if (sleepTime > 0)
GameLoop.sleep( sleepTime );
else
GameLoop.sleep( 500 );
}
catch (Exception exception)
{
}
}
}
updatePhysics () вызывается много раз. Если я использую отладчик, я вижу, что выполнение кода в collideWith (Sprite sprite) возвращается, чтобы вернуть true, но перейти к следующей строке и вернуть false. Я думаю, это проблема синхронизации ...
Где я должен вызывать метод столкновения в моем игровом цикле? Является ли обновление () правильное место? Я думаю, это не так;). Sprite.onCollision () вызывается очень редко ...
protected void updatePhysics( )
{
for (Sprite sprite : sprites)
{
for (Sprite s : sprites)
{
if (sprite.collideWith( s ))
sprite.onCollision( );
}
sprite.update( );
}
}
public boolean collideWith( Sprite sprite )
{
if (this == sprite)
return false;
Rect thisSprite = new Rect( this.xCoordinate, this.yCoordinate, this.width, this.height );
Rect anotherSprite = new Rect( sprite.xCoordinate, sprite.yCoordinate, sprite.width, sprite.height );
if (thisSprite.intersect( anotherSprite ))
return true;
return false;
}
Должен ли я синхронизировать метод collideWith ()? Или мой код
for (Sprite sprite : sprites)
{
for (Sprite s : sprites)
{
if (sprite.collideWith( s ))
sprite.onCollision( );
}
sprite.update( );
}
проблема?
С уважением, Дульсинея