Optimized Ticking and Rendering #5
							
								
								
									
										40
									
								
								src/main/dev/lh/Food.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								src/main/dev/lh/Food.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | |||||||
|   
				
					
						
						delvh
					
					
						commented  
						Review
						 ```suggestion
 * @since Snake 1.2
```   
				
					
						
						delvh
					
					
						commented  
						Review
						 ```suggestion
 * @since Snake 1.2
```   
				
					
						
						delvh
					
					
						commented  
						Review
						 ```suggestion
	 * @since Snake 1.2
```   
				
					
						
						delvh
					
					
						commented  
						Review
						 ```suggestion
	 * @since Snake 1.2
```   
				
					
						
						delvh
					
					
						commented  
						Review
						 ```suggestion
	 * @since Snake 1.2
```   
				
					
						
						delvh
					
					
						commented  
						Review
						 ```suggestion
	 * @since Snake 1.2
```   
				
					
						
						delvh
					
					
						commented  
						Review
						 ```suggestion
	 * @since Snake 1.2
```   
				
					
						
						delvh
					
					
						commented  
						Review
						 ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | package dev.lh; | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | import java.awt.Color; | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | import java.awt.Graphics2D; | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | import java.awt.Rectangle; | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | /** | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  * Project: <strong>Snake</strong><br> | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  * File: <strong>Food.java</strong><br> | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  * Created: <strong>01.07.2020</strong><br> | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  *  | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  * @author Kai S. K. Engelbart | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  * @since Snake 1.1 | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  */ | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | public final class Food implements Updateable { | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	private final Color color; | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	private final int lengthBonus; | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	private final Rectangle bounds; | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	public Food(Color color, int lengthBonus, Rectangle bounds) { | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 		this.color = color; | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 		this.lengthBonus = lengthBonus; | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 		this.bounds = bounds; | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	} | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	public void checkCollision(Snake snake) { | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 		if (bounds.intersects(snake.getHead())) {} | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	} | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	@Override | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	public void render(Graphics2D g) { | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 		g.setColor(color); | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 		g.fill(bounds); | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	} | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	public int getLengthBonus() { return lengthBonus; } | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	public Rectangle getBounds() { return bounds; } | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | } | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| @@ -2,202 +2,68 @@ package dev.lh; | |||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
| import static java.awt.Color.*; | import static java.awt.Color.*; | ||||||
|  |  | ||||||
| import java.awt.*; | import java.awt.Color; | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | import java.awt.Rectangle; | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| import java.util.Random; | import java.util.Random; | ||||||
|  |  | ||||||
| import dev.lh.ui.GameWindow; |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| /** | /** | ||||||
|  |  * Generates food items with predefined properties at random positions and calculates the next | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  * spawning time. | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  * <p> | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  * Project: <strong>Snake</strong><br> |  * Project: <strong>Snake</strong><br> | ||||||
|  * File: <strong>FoodFactory.java</strong><br> |  * File: <strong>FoodFactory.java</strong><br> | ||||||
|  * Created: <strong>11 Mar 2020</strong><br> |  * Created: <strong>11 Mar 2020</strong><br> | ||||||
|  * |  * | ||||||
|  * @author Leon Hofmeister |  * @author Leon Hofmeister | ||||||
|  |  * @author Kai S. K. Engelbart | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  * @since Snake 1.0 |  * @since Snake 1.0 | ||||||
|  */ |  */ | ||||||
| public class FoodFactory { | public final class FoodFactory { | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	private int width, height; | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	private long nextSpawnTime; | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	private Random random = new Random(); | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	private static final Color[] FOOD_COLORS = { | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 		WHITE, YELLOW, ORANGE, RED, BLUE | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	}; | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	private static final int[] FOOD_LENGTH_BONUSES = { | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 		40, 15, 6, 2, 1 | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	}; | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
| 	/** | 	/** | ||||||
| 	 * This enum contains all possible variations of foods. The higher the ordinal | 	 * Initializes a food factory. | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 * of an element, the less it is worth.<br> |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 * <br> |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 * Project: <strong>Snake</strong><br> |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 * File: <strong>FoodFactory.java</strong><br> |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 * Created: <strong>11 Mar 2020</strong><br> |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 *  | 	 *  | ||||||
| 	 * @author Leon Hofmeister | 	 * @param width  the width of the viewport | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 * @since Snake 1.0 | 	 * @param height the height of the viewport | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	 * @since Snake 1.1 | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 */ | 	 */ | ||||||
| 	public enum Food { | 	public FoodFactory(int width, int height) { | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 		this.width = width; | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 		this.height = height; | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	} | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
| 	/** | 	/** | ||||||
| 		 * Use if white food is wanted. | 	 * @return a new food item | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	 * @since Snake 1.1 | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 */ | 	 */ | ||||||
| 		white( | 	public synchronized Food spawn() { | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 			WHITE, 40 | 		nextSpawnTime = System.currentTimeMillis() + random.nextInt(15000) + 1000; | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 		), | 		int seed = random.nextInt(5); | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 		return new Food( | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 		/** | 			FOOD_COLORS[seed], | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 		 * Use if yellow food is wanted. | 			FOOD_LENGTH_BONUSES[seed], | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 		 */ | 			new Rectangle(random.nextInt(width - 100) + 50, | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 		yellow( | 				random.nextInt(height - 100) + 50, | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 			YELLOW, 15 | 				seed * 10, | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 		), | 				seed * 10 | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 			) | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 		/** |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 		 * Use if orange food is wanted. |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 		 */ |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 		orange( |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 			ORANGE, 6 |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 		), |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 		/** |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 		 * Use if red food is wanted. |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 		 */ |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 		red( |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 			RED, 2 |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 		), |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 		/** |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 		 * Use if blue food is wanted. |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 		 */ |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 		blue( |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 			BLUE, 1 |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 		); | 		); | ||||||
|  |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 		/** |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 		 * The color of the food item. |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 		 */ |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 		public final Color color; |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 		/** |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 		 * The length bonus of the food item. |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 		 */ |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 		public final int lengthBonus; |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 		private Food(Color color, int lengthBonus) { |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 			this.color = color; |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 			this.lengthBonus = lengthBonus; |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 		} |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	} |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	private static FoodFactory foodFactory = new FoodFactory(); |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	private long timeOfNextFood; |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	private Point pFood; |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	private Food nextFood = Food.white; |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	private int rectangleSize = 6; |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	private FoodFactory() {} |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	/** |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 * @return the (singleton) instance of FoodFactory |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 * @since Snake 1.0 |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 */ |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	public static FoodFactory getInstance() { return foodFactory; } |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	/** |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 * @return a new {@link Food} object without its position |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 * @since Snake 1.0 |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 */ |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	public Food generateFood() { |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 		nextFood = Food.values()[new Random().nextInt(Food.values().length)]; |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 		rectangleSize = nextFood.ordinal() + 2; |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 		setTimeToNextFoodMillis(); |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 		return nextFood; |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	/** | 	/** | ||||||
| 	 * Generates the amount of time that needs to pass before the next food object | 	 * @return the time after which a new food item should be spawned | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 * will be constructed. | 	 * @since Snake 1.1 | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 * |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 * @since Snake 1.0 |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 */ | 	 */ | ||||||
| 	public void setTimeToNextFoodMillis() { | 	public long getNextSpawnTime() { return nextSpawnTime; } | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 		timeOfNextFood = System.currentTimeMillis() + new Random().nextInt(15000) + 1000; |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	} |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	/** |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 * @return the type of the next food |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 * @since Snake 1.0 |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 */ |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	public Food getNextFood() { return nextFood; } |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	/** |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 * @param nextFood the type the next food should have |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 * @since Snake 1.0 |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 */ |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	public void setNext(Food nextFood) { this.nextFood = nextFood; } |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	/** |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 * @return the time at which a new food object will be automatically created |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 * @since Snake 1.0 |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 */ |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	public long getTimeOfNextFood() { return timeOfNextFood; } |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	/** |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 * @param width  the width of the currently used {@link GameWindow} |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 * @param height the height of the currently used {@link GameWindow} |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 * @return the position of the new {@link Food} object |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 * @since Snake 1.0 |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 */ |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	public Point generateFoodLocation(int width, int height) { |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 		assert (width > 100 && height > 100); |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 		Random r = new Random(); |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 		return pFood = new Point(r.nextInt(width - 100) + 50, r.nextInt(height - 100) + 50); |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	} |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	/** |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 * @return the size of the corresponding food (length = width) |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 * @since Snake 1.0 |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 */ |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	public int getRectangleSize() { return rectangleSize; } |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	/** |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 * @return the location of the currently displayed food |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 * @since Snake 1.0 |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 */ |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	public Point getFoodLocation() { return pFood; } |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	/** |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 * Sets the color of the given {@link Graphics} object according to the type of |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 * food. |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 * |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 * @param g the graphics object to paint |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 * @since Snake 1.0 |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 */ |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	public void colorOfFood(Graphics g) { |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 		g.setColor(nextFood.color); |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	} |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	/** |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 * @param g the {@link Graphics} object used to paint the current food object |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 * @since Snake 1.0 |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 */ |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	public void paintFood(Graphics g) { |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 		colorOfFood(g); |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 		g.fillRect(pFood.x, pFood.y, 5 * rectangleSize, 5 * rectangleSize); |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	} |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	/** |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 * @param snakeHead the the head of a {@link Snake} object |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 * @return true if the current food intersects with the snake head |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 * @since Snake 1.0 |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 */ |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	public boolean checkCollision(Rectangle snakeHead) { |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 		int s = rectangleSize * 5; |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 		Rectangle food = new Rectangle(pFood, new Dimension(s, s)); |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 		return food.intersects(snakeHead); |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	} |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	/** |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 * @return the length that will be added to the snake |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 * @since Snake 1.0 |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	 */ |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	public int getAdditionalLength() { |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 		return nextFood.lengthBonus; |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| 	} |  | ||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| } | } | ||||||
|   | |||||||
|   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
							
								
								
									
										46
									
								
								src/main/dev/lh/Handler.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								src/main/dev/lh/Handler.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,46 @@ | |||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | package dev.lh; | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | import java.awt.Graphics2D; | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | /** | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  * Manages the state of game objects. | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  * <p> | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  * Project: <strong>Snake</strong><br> | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  * File: <strong>Handler.java</strong><br> | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  * Created: <strong>01.07.2020</strong><br> | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  *  | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  * @author Kai S. K. Engelbart | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  * @since Snake 1.1 | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  */ | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | public final class Handler implements Updateable { | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	private Snake snake = new Snake(7); | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	private FoodFactory foodFactory; | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	private volatile Food food; | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	public Handler(Snake snake, FoodFactory foodFactory) { | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 		this.snake = snake; | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 		this.foodFactory = foodFactory; | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 		food = foodFactory.spawn(); | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	} | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	@Override | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	public void tick() { | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 		snake.tick(); | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 		food.tick(); | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 		// Check for food collision | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 		if (snake.getHead().intersects(food.getBounds())) { | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 			snake.addLength(food.getLengthBonus()); | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 			food = foodFactory.spawn(); | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 		} | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 		if (System.currentTimeMillis() > foodFactory.getNextSpawnTime()) | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 			food = foodFactory.spawn(); | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	} | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	@Override | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	public void render(Graphics2D g) { | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 		snake.render(g); | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 		food.render(g); | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	} | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | } | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| @@ -7,7 +7,6 @@ import java.util.ArrayList; | |||||||
| import java.util.List; | import java.util.List; | ||||||
|  |  | ||||||
| import dev.lh.ui.Endscreen; | import dev.lh.ui.Endscreen; | ||||||
| import dev.lh.ui.GameWindow; |  | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Project: <strong>Snake</strong><br> |  * Project: <strong>Snake</strong><br> | ||||||
| @@ -51,7 +50,6 @@ public class Snake implements Updateable { | |||||||
| 		DOWN; | 		DOWN; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	private static FoodFactory foodFactory = FoodFactory.getInstance(); |  | ||||||
| 	private static Endscreen endscreen; | 	private static Endscreen endscreen; | ||||||
| 	private Direction direction = Direction.RIGHT; | 	private Direction direction = Direction.RIGHT; | ||||||
| 	private int length; | 	private int length; | ||||||
| @@ -103,14 +101,8 @@ public class Snake implements Updateable { | |||||||
| 		Main.getGame().close(); | 		Main.getGame().close(); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * @return the current {@link Direction} of the snake |  | ||||||
| 	 * @since Snake 1.0 |  | ||||||
| 	 */ |  | ||||||
| 	public Direction getRichtung() { return direction; } |  | ||||||
|  |  | ||||||
| 	@Override | 	@Override | ||||||
| 	public void nextFrame() { | 	public void tick() { | ||||||
| 		int velX = 0, velY = 0; | 		int velX = 0, velY = 0; | ||||||
| 		switch (direction) { | 		switch (direction) { | ||||||
| 			case UP: | 			case UP: | ||||||
| @@ -140,18 +132,11 @@ public class Snake implements Updateable { | |||||||
| 			return; | 			return; | ||||||
| 		} | 		} | ||||||
| 		// TODO: Test on Linux | 		// TODO: Test on Linux | ||||||
| 		if (!Main.getGame().getBounds().contains(tiles.get(0))) { | 		if (!Main.getGame().getBounds().contains(getHead())) { | ||||||
| 			gameOver(); | 			gameOver(); | ||||||
| 			System.out.println("Snake went out of bounds."); | 			System.out.println("Snake went out of bounds."); | ||||||
| 			return; | 			return; | ||||||
| 		} | 		} | ||||||
| 		// TODO: Move to Food class |  | ||||||
| 		// Case if snake eats food |  | ||||||
| 		if (foodFactory.checkCollision(tiles.get(0))) { |  | ||||||
| 			addLength(foodFactory.getAdditionalLength()); |  | ||||||
| 			GameWindow game = Main.getGame(); |  | ||||||
| 			game.newFood(); |  | ||||||
| 		} |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	@Override | 	@Override | ||||||
| @@ -160,9 +145,21 @@ public class Snake implements Updateable { | |||||||
| 		tiles.forEach(g::fill); | 		tiles.forEach(g::fill); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	/** | ||||||
|  | 	 * @return the current {@link Direction} of the snake | ||||||
|  | 	 * @since Snake 1.0 | ||||||
|  | 	 */ | ||||||
|  | 	public Direction getDirection() { return direction; } | ||||||
|  |  | ||||||
| 	/** | 	/** | ||||||
| 	 * @param direction the new {@link Direction} of the snake | 	 * @param direction the new {@link Direction} of the snake | ||||||
| 	 * @since Snake 1.0 | 	 * @since Snake 1.0 | ||||||
| 	 */ | 	 */ | ||||||
| 	public void setDirection(Direction direction) { this.direction = direction; } | 	public void setDirection(Direction direction) { this.direction = direction; } | ||||||
|  |  | ||||||
|  | 	/** | ||||||
|  | 	 * @return a rectangle representing the head of the snake | ||||||
|  | 	 * @since Snake 1.1 | ||||||
|  | 	 */ | ||||||
|  | 	public Rectangle getHead() { return tiles.get(0); } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -20,7 +20,7 @@ public interface Updateable { | |||||||
| 	 * | 	 * | ||||||
| 	 * @since Snake 1.0 | 	 * @since Snake 1.0 | ||||||
| 	 */ | 	 */ | ||||||
| 	void nextFrame(); | 	default void tick() {} | ||||||
|  |  | ||||||
| 	/** | 	/** | ||||||
| 	 * Renders the object. | 	 * Renders the object. | ||||||
| @@ -28,5 +28,5 @@ public interface Updateable { | |||||||
| 	 * @param g the graphics object that is used to render this object | 	 * @param g the graphics object that is used to render this object | ||||||
| 	 * @since Snake 1.0 | 	 * @since Snake 1.0 | ||||||
| 	 */ | 	 */ | ||||||
| 	void render(Graphics2D g); | 	default void render(Graphics2D g) {} | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										98
									
								
								src/main/dev/lh/Viewport.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								src/main/dev/lh/Viewport.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,98 @@ | |||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | package dev.lh; | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | import java.awt.Canvas; | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | import java.awt.Color; | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | import java.awt.Graphics2D; | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | import java.util.Timer; | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | import java.util.TimerTask; | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | /** | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  * Implements a hardware-accelerated rendering loop. | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  * <p> | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  * Project: <strong>Snake</strong><br> | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  * File: <strong>Viewport.java</strong><br> | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  * Created: <strong>01.07.2020</strong><br> | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  *  | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  * @author Kai S. K. Engelbart | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  * @since Snake 1.0 | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  */ | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | public class Viewport extends Canvas { | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	private static final long serialVersionUID = 1L; | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	// Enable OpenGL hardware acceleration | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	static { | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 		System.setProperty("sun.java2d.trace", "timestamp,log,count"); | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 		System.setProperty("sun.java2d.transaccel", "True"); | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 		System.setProperty("sun.java2d.opengl", "True"); | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	} | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	private Updateable gameRoot; | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	private Timer timer = new Timer(); | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	private TimerTask renderTask; | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	/** | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	 * @param gameRoot the game object responsible for updating the rest | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	 * @since Snake 1.0 | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	 */ | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	public Viewport(Updateable gameRoot) { | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 		this.gameRoot = gameRoot; | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 		setIgnoreRepaint(true); | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	} | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	/** | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	 * Starts the render task. | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	 *  | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	 * @since Snake 1.1 | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	 */ | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	public void start() { | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 		if (renderTask != null) | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 			renderTask.cancel(); | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 		else | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 			createBufferStrategy(2); | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 		renderTask = new TimerTask() { | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 			private long lastTime = System.currentTimeMillis(); | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 			@Override | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 			public void run() { | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 				long time = System.currentTimeMillis(); | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 				double dt = (time - lastTime) * 1E-3; | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 				lastTime = time; | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 				gameRoot.tick(); | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 				render(); | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 			} | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 		}; | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 		timer.schedule(renderTask, 0, 100); | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	} | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	/** | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	 * Stops the render task. | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	 *  | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	 * @since Snake 1.1 | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	 */ | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	public void stop() { | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 		renderTask.cancel(); | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	} | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	private void render() { | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 		Graphics2D g = (Graphics2D) getBufferStrategy().getDrawGraphics(); | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 		// Clear the screen | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 		g.setColor(Color.BLACK); | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 		g.fillRect(0, 0, getWidth(), getHeight()); | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 		// Perform the actual rendering | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 		gameRoot.render(g); | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 		// Flip buffers | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 		g.dispose(); | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 		getBufferStrategy().show(); | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  |  | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 		// Synchronize with display refresh rate | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 		getToolkit().sync(); | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | 	} | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
|  | } | ||||||
|   ```suggestion
 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
```   ```suggestion
	 * @since Snake 1.2
``` | |||||||
| @@ -1,15 +1,14 @@ | |||||||
| package dev.lh.ui; | package dev.lh.ui; | ||||||
|  |  | ||||||
| import java.awt.*; | import java.awt.Dimension; | ||||||
|  | import java.awt.Rectangle; | ||||||
|  | import java.awt.Toolkit; | ||||||
| import java.awt.event.KeyAdapter; | import java.awt.event.KeyAdapter; | ||||||
| import java.awt.event.KeyEvent; | import java.awt.event.KeyEvent; | ||||||
|  |  | ||||||
| import javax.swing.JFrame; | import javax.swing.JFrame; | ||||||
| import javax.swing.JPanel; |  | ||||||
| import javax.swing.Timer; |  | ||||||
|  |  | ||||||
| import dev.lh.FoodFactory; | import dev.lh.*; | ||||||
| import dev.lh.Snake; |  | ||||||
| import dev.lh.Snake.Direction; | import dev.lh.Snake.Direction; | ||||||
|  |  | ||||||
| /** | /** | ||||||
| @@ -23,20 +22,19 @@ import dev.lh.Snake.Direction; | |||||||
| public class GameWindow extends JFrame { | public class GameWindow extends JFrame { | ||||||
|  |  | ||||||
| 	private static final long serialVersionUID = 1L; | 	private static final long serialVersionUID = 1L; | ||||||
| 	private Snake				s					= new Snake(7); |  | ||||||
| 	private FoodFactory			foodFactory			= FoodFactory.getInstance(); | 	private Viewport viewport; | ||||||
| 	private Timer timer; |  | ||||||
|  |  | ||||||
| 	/** | 	/** | ||||||
| 	 * @param title the title of the frame | 	 * @param title the title of the frame | ||||||
| 	 * @since Snake 1.0 | 	 * @since Snake 1.0 | ||||||
| 	 */ | 	 */ | ||||||
| 	public GameWindow(String title) { | 	public GameWindow(String title) { | ||||||
|  | 		// Initialize window | ||||||
| 		super(title); | 		super(title); | ||||||
| 		Dimension size = Toolkit.getDefaultToolkit().getScreenSize(); | 		Dimension size = Toolkit.getDefaultToolkit().getScreenSize(); | ||||||
| 		setBounds(new Rectangle(size)); | 		setBounds(new Rectangle(size)); | ||||||
| 		setLocation(0, 0); | 		setLocation(0, 0); | ||||||
| 		setLocationRelativeTo(null); |  | ||||||
| 		setMinimumSize(size); | 		setMinimumSize(size); | ||||||
| 		setPreferredSize(size); | 		setPreferredSize(size); | ||||||
| 		setMaximumSize(size); | 		setMaximumSize(size); | ||||||
| @@ -44,19 +42,14 @@ public class GameWindow extends JFrame { | |||||||
| 		setResizable(false); | 		setResizable(false); | ||||||
| 		setDefaultCloseOperation(EXIT_ON_CLOSE); | 		setDefaultCloseOperation(EXIT_ON_CLOSE); | ||||||
|  |  | ||||||
| 		add(new JPanel() { | 		// Initialize game objects | ||||||
|  | 		Snake snake = new Snake(7); | ||||||
|  | 		FoodFactory foodFactory = new FoodFactory(getWidth(), getHeight()); | ||||||
|  | 		Handler handler = new Handler(snake, foodFactory); | ||||||
|  |  | ||||||
| 			private static final long serialVersionUID = 1L; | 		// Initialize viewport | ||||||
|  | 		viewport = new Viewport(handler); | ||||||
| 			@Override | 		add(viewport); | ||||||
| 			protected void paintComponent(Graphics g) { |  | ||||||
| 				super.paintComponent(g); |  | ||||||
| 				g.setColor(Color.black); |  | ||||||
| 				g.fillRect(0, 0, getWidth(), getHeight()); |  | ||||||
| 				s.render((Graphics2D) g); |  | ||||||
| 				foodFactory.paintFood(g); |  | ||||||
| 			} |  | ||||||
| 		}); |  | ||||||
|  |  | ||||||
| 		addKeyListener(new KeyAdapter() { | 		addKeyListener(new KeyAdapter() { | ||||||
|  |  | ||||||
| @@ -66,56 +59,40 @@ public class GameWindow extends JFrame { | |||||||
| 				switch (e.getKeyCode()) { | 				switch (e.getKeyCode()) { | ||||||
| 					case KeyEvent.VK_W: | 					case KeyEvent.VK_W: | ||||||
| 					case KeyEvent.VK_UP: | 					case KeyEvent.VK_UP: | ||||||
| 						if (!s.getRichtung().equals(Direction.DOWN)) s.setDirection(Direction.UP); | 						if (!snake.getDirection().equals(Direction.DOWN)) | ||||||
|  | 							snake.setDirection(Direction.UP); | ||||||
| 						break; | 						break; | ||||||
| 					case KeyEvent.VK_A: | 					case KeyEvent.VK_A: | ||||||
| 					case KeyEvent.VK_LEFT: | 					case KeyEvent.VK_LEFT: | ||||||
| 						if (!s.getRichtung().equals(Direction.RIGHT)) s.setDirection(Direction.LEFT); | 						if (!snake.getDirection().equals(Direction.RIGHT)) | ||||||
|  | 							snake.setDirection(Direction.LEFT); | ||||||
| 						break; | 						break; | ||||||
| 					case KeyEvent.VK_S: | 					case KeyEvent.VK_S: | ||||||
| 					case KeyEvent.VK_DOWN: | 					case KeyEvent.VK_DOWN: | ||||||
| 						if (!s.getRichtung().equals(Direction.UP)) s.setDirection(Direction.DOWN); | 						if (!snake.getDirection().equals(Direction.UP)) | ||||||
|  | 							snake.setDirection(Direction.DOWN); | ||||||
| 						break; | 						break; | ||||||
| 					case KeyEvent.VK_D: | 					case KeyEvent.VK_D: | ||||||
| 					case KeyEvent.VK_RIGHT: | 					case KeyEvent.VK_RIGHT: | ||||||
| 						if (!s.getRichtung().equals(Direction.LEFT)) s.setDirection(Direction.RIGHT); | 						if (!snake.getDirection().equals(Direction.LEFT)) | ||||||
|  | 							snake.setDirection(Direction.RIGHT); | ||||||
| 						break; | 						break; | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 		}); | 		}); | ||||||
|  |  | ||||||
| 		newFood(); |  | ||||||
| 		timer = new Timer( |  | ||||||
| 			50, |  | ||||||
| 			evt -> { |  | ||||||
| 				s.nextFrame(); |  | ||||||
| 					if (System.currentTimeMillis() >= foodFactory.getTimeOfNextFood()) |  | ||||||
| 					newFood(); |  | ||||||
| 				repaint(); |  | ||||||
| 			} |  | ||||||
| 		); |  | ||||||
| 		timer.start(); |  | ||||||
|  |  | ||||||
| 		setVisible(true); | 		setVisible(true); | ||||||
|  | 		viewport.start(); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	/** | 	/** | ||||||
| 	 * Generates new food. | 	 * Disposes this frame. | ||||||
| 	 * |  | ||||||
| 	 * @since Snake 1.1 |  | ||||||
| 	 */ |  | ||||||
| 	public void newFood() { |  | ||||||
| 		foodFactory.generateFood(); |  | ||||||
| 		foodFactory.generateFoodLocation(getWidth(), getHeight()); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * Disposes this frame |  | ||||||
| 	 * | 	 * | ||||||
| 	 * @since Snake 1.1 | 	 * @since Snake 1.1 | ||||||
| 	 */ | 	 */ | ||||||
| 	public void close() { | 	public void close() { | ||||||
| 		timer.stop(); | 		viewport.stop(); | ||||||
|  | 		setVisible(false); | ||||||
| 		dispose(); | 		dispose(); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user