Java-Gaming.org Hi !
Featured games (83)
games approved by the League of Dukes
Games in Showcase (511)
Games in Android Showcase (119)
games submitted by our members
Games in WIP (577)
games currently in development
News: Read the Java Gaming Resources, or peek at the official Java tutorials
 
    Home     Help   Search   Login   Register   
Pages: [1]
  ignore  |  Print  
  How to draw to a gameloop  (Read 372 times)
0 Members and 1 Guest are viewing this topic.
Offline Mr.CodeIt

Junior Duke





« Posted 2014-04-21 19:45:30 »

I am reading killer game programming in java and reffering to foriegnguymike on youtube. I think my game loop is ok but someone said not to use thread.sleep() and i'll work on it. For now based on that youtuber I'm trying to draw the player using its' methods. Anything unprofessional please point out because I'm new to advanced game programming with loops. I'll show you my classes and PLEASE criticize by explaining what I did wrong, what I can correct and how I can draw an image from a resource folder. I really need to understand how to draw images in this gameloop


**Main CLass**

1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
    import javax.swing.JFrame;

     public class Game {
 
     public static void main(String[] args) {
        JFrame f = new JFrame();
        f.setTitle("OMG I MADE A GAME");
        f.setResizable(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setContentPane(new Panel());
        f.pack();
         
        f.setVisible(true);
     }
 
          }
 
 

  **JPanel Class**
 
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  
31  
32  
33  
34  
35  
36  
37  
38  
39  
40  
41  
42  
43  
44  
45  
46  
47  
48  
49  
50  
51  
52  
53  
54  
55  
56  
57  
58  
59  
60  
61  
62  
63  
64  
65  
66  
67  
68  
69  
70  
71  
72  
73  
74  
75  
76  
77  
78  
79  
80  
81  
82  
83  
84  
85  
86  
87  
88  
89  
90  
91  
92  
93  
94  
95  
96  
97  
98  
99  
100  
101  
102  
103  
104  
105  
106  
107  
108  
109  
110  
      import java.awt.*;
      import java.awt.image.BufferedImage;
      import java.awt.event.*;
   
      import javax.swing.JPanel;
   
      import com.game.entity.Player;
   
   
   
   
     public class Panel extends JPanel
      implements Runnable, KeyListener{
     
      //game objects
     private Player p;///////////new Player
     
     // dimensions
     public static final int WIDTH = 320;
     public static final int HEIGHT = 240;
     public static final int SCALE = 2;
   
     // game thread
     private Thread thread;
     private boolean running;
   
     // image
     private BufferedImage image;
     private Graphics2D g;
     
     public Panel() {
        super();
        setPreferredSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));
        setFocusable(true);
        requestFocus();
     }
     // DRAWS PANEL TO FRAME
     public void addNotify() {
        super.addNotify();
        if(thread == null) {
           thread = new Thread(this);
           addKeyListener(this);
           thread.start();
        }
     }
     
     private void init() {
       
        image = new BufferedImage(
                 WIDTH, HEIGHT,
                 BufferedImage.TYPE_INT_RGB
              );
        g = (Graphics2D) image.getGraphics();
       
        running = true;
        p.init();
        p = new Player(100, 100);
     }
     
     public void run() {
       
        init();
       
        // game loop
        while(running) {
           
           update();
           draw();
           p.draw(g);
           drawToScreen();        
           
           try  {
              Thread.sleep(10);
           }
           catch(Exception e) {
              e.printStackTrace();
           }
           
        }
       
      }
     
      private void update() {
        p.update();
     }
     private void draw() {
        p.draw(g);
     }
     private void drawToScreen() {
        Graphics g2 = getGraphics();
        g2.drawImage(image, 0, 0,
              WIDTH * SCALE, HEIGHT * SCALE,null);
       
        g.drawString("2014 Jay H.", 10, 230);
        g2.dispose();
     }
     
     public void keyTyped(KeyEvent key) {}
   
     // PUBLIC KEYRELEASES
     public void keyPressed(KeyEvent key) {
       
     }
     // PUBLIC KEYRELEASES
     public void keyReleased(KeyEvent key) {
 
     }
 
      }
 


 
  **Player Class**
 
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  
31  
32  
33  
34  
35  
36  
37  
38  
39  
40  
41  
42  
      import java.awt.Graphics2D;
       import java.awt.Image;
 
     import javax.swing.ImageIcon;
 
     public class Player {
     
       // PLAYER CORDINATES AND VELOCITY
       int x,y,dx,dy;
     
     
       //   PLAYER IMAGE
     private Image PImg;
     
     public Player(int x, int y) {
             
     }
     
     public void init() {//////////////////////////// How to get image from resource folder
        //GET IMAGE OF PLAYER IN THE SAME PACKAGE
        ImageIcon i = new ImageIcon(this.getClass().getResource("playersprites.gif"));
        PImg = i.getImage();
     }
   
     public void update() {
        this.x += dx;
        this.y += dy;
     }
     
     // DRAW TO PANEL CLASS
     public void draw(Graphics2D g) {
        g.drawImage(PImg, x, y, null);
      }
     
      //GET METHODS FOR CORDINATES AND VELOCITY  (Unused for now... i think)
     public void getX() {}
     public void getY() {}
     public void getDX() {}
      public void getDY() {}
 
         }  
 


   Also point me out to some good game loop tutorials that explains how to add graphics

I'm not drunk, I've just been up late coding.
Offline Longarmx
« Reply #1 - Posted 2014-04-22 02:38:40 »

You asked for criticism, so I'll give it to you.  Wink

1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
 public void run() {
       
        init();
       
        // game loop
        while(running) {
           
           update();
           draw();
           p.draw(g);
           drawToScreen();        
           
           try  {
              Thread.sleep(10);
           }
           catch(Exception e) {
              e.printStackTrace();
           }
           
        }
       
      }
     private void draw() {
        p.draw(g);
     }


Here, you're drawing the player twice: once in the draw method, then in the game loop. Remove the one in the loop. Drawing should be done in the draw method. Same thing with drawToScreen(). Don't call that directly from the game loop; instead, call it from the draw method.

Who told you not to use Thread.sleep()? That is the only way that I have ever seen it done. I think you're only other option would be to run intensive calculations on the cpu until enough time has passed, but that would be HORRIBLE. Using Thread.sleep() is fine.

The rest of the code looks good, nothing else worth noting. My advice is to just keep learning  Cheesy

Edit: You don't have to keep creating new topics. There's an edit button in the top right of your post.

Offline philfrei
« Reply #2 - Posted 2014-04-22 04:14:36 »


Who told you not to use Thread.sleep()? That is the only way that I have ever seen it done. I think you're only other option would be to run intensive calculations on the cpu until enough time has passed, but that would be HORRIBLE. Using Thread.sleep() is fine.


There is also the possibility of using a util Timer for game loops. In Killer Game Programming, the author demonstrates both short-comings of the Swing Timer and the excellent accuracy of the util Timer. However, the author has a strong preference for methods that make use of a variable amount of Sleep rather than using a Timer, and most Java game programmers (at least around here) follow this practice.

"It's after the end of the world! Don't you know that yet?"
Games published by our own members! Check 'em out!
Legends of Yore - The Casual Retro Roguelike
Offline Longarmx
« Reply #3 - Posted 2014-04-22 04:36:48 »

Oh yes, I completely forgot about timer (probably because I never use it  Cheesy)

Offline Grunnt

JGO Wizard


Medals: 84
Projects: 8
Exp: 5 years


Complex != complicated


« Reply #4 - Posted 2014-04-22 12:46:03 »

Some tips:
- your code formatting makes my brain hurt. Use a consitent code formatting style so others can read your code.
Eclipse has an autoformat function (alt+shift+f I think) that can help with this.
- for a good game loop see this article to get a clear grasp.

Pages: [1]
  ignore  |  Print  
 
 
You cannot reply to this message, because it is very, very old.

 

Add your game by posting it in the WIP section,
or publish it in Showcase.

The first screenshot will be displayed as a thumbnail.

Longarmx (50 views)
2014-10-17 03:59:02

Norakomi (39 views)
2014-10-16 15:22:06

Norakomi (31 views)
2014-10-16 15:20:20

lcass (36 views)
2014-10-15 16:18:58

TehJavaDev (66 views)
2014-10-14 00:39:48

TehJavaDev (65 views)
2014-10-14 00:35:47

TehJavaDev (56 views)
2014-10-14 00:32:37

BurntPizza (72 views)
2014-10-11 23:24:42

BurntPizza (44 views)
2014-10-11 23:10:45

BurntPizza (84 views)
2014-10-11 22:30:10
Understanding relations between setOrigin, setScale and setPosition in libGdx
by mbabuskov
2014-10-09 22:35:00

Definite guide to supporting multiple device resolutions on Android (2014)
by mbabuskov
2014-10-02 22:36:02

List of Learning Resources
by Longor1996
2014-08-16 10:40:00

List of Learning Resources
by SilverTiger
2014-08-05 19:33:27

Resources for WIP games
by CogWheelz
2014-08-01 16:20:17

Resources for WIP games
by CogWheelz
2014-08-01 16:19:50

List of Learning Resources
by SilverTiger
2014-07-31 16:29:50

List of Learning Resources
by SilverTiger
2014-07-31 16:26:06
java-gaming.org is not responsible for the content posted by its members, including references to external websites, and other references that may or may not have a relation with our primarily gaming and game production oriented community. inquiries and complaints can be sent via email to the info‑account of the company managing the website of java‑gaming.org
Powered by MySQL Powered by PHP Powered by SMF 1.1.18 | SMF © 2013, Simple Machines | Managed by Enhanced Four Valid XHTML 1.0! Valid CSS!