Gå til innhold

Jeg lærer meg grafikkprogrammering: Bevegende bilder [part 1]


Anbefalte innlegg

Har akkurat begynt å prøve å lære meg grafikkprogrammering i java. Og tenkte jeg skulle dele litt kunnskap med andre som har lyst til det samme. Folk må gjerne påpeke feil i koden, eller komme med bedre løsninger.

 

I denne tråden ligger kode for et program, der et bilde beveger seg lineært nedover.

 

Game.java:

package grxTest;

import java.awt.*;
import javax.swing.*;

public class Game extends JFrame {

private boolean gameRunning;

Image offscreenImage;
Graphics offscreenGraphics;

private Image player1;

private int x = 0;
private int y = 0;

public static void main(String[] args) {
	new Game();
}

public Game() {
	// selvforklarende?  Ignore får appen til å ignorer kall til paint elns.
	setSize(800, 600);
	setBackground(Color.red);
	setIgnoreRepaint(true);
	setResizable(false);
	setVisible(true);

	loadImages();

	// start the game
	gameRunning = true;
	gameLoop();
}

private void loadImages() {
	// loader inn i minnet
	player1 = loadImage("/home/nab/Pictures/java/player1.png");
}

private void gameLoop() {

	while(gameRunning) {

		drawStuff();

		// vi pauser for å ikke stjele all cpu tid
		try { Thread.sleep(20); } catch (Exception e) {}
	}
}

private void drawStuff() {

	// double buffer for å forhindre flickering(bildet hakker)
	offscreenImage = createImage(800, 600);
	offscreenGraphics = offscreenImage.getGraphics();
	offscreenGraphics.clearRect(0, 0, 800, 600);

	offscreenGraphics.drawImage(player1, x, y, null);

	// moves the player
	y++;
	x++;

	Graphics2D g = (Graphics2D) getGraphics();
	g.drawImage(offscreenImage, 0, 0, null);
	g.dispose();
}
public Image loadImage(String s) {
	return new ImageIcon(s).getImage();
}	
}

 

Da er mine første skritt tatt. Dette var jo lett! Tegneteknikken som brukes her kalles for active rendering. D.v.s. at vi aktivt går inn og tenger på skjermen, i motsetning til passive rendering der vår implementasjon av paint(Graphics g) blir kallt på jevnlig.

 

I drawStuff() tegnes først bildet på en bildebuffer, istedenfor rett på skjermen. Dette forhindrer at bildet "blinker". Prøv å tegn rett på skjermen så vil du se hva jeg mener med flickering.

 

Ja nå har vi faktisk et lite rammeverk klart til å utvides enda mer. Neste post vil handle om animering av bildet. D.v.s. bilder i rekkefølge som danner en animasjon/bevegelse.

Endret av oransjeFugl
Lenke til kommentar
Videoannonse
Annonse

Hvis du bare flytter litt rundt på ting så blir det mye bedre=)

 

 

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;

import javax.swing.ImageIcon;
import javax.swing.JFrame;

public class Game extends JFrame {
  private boolean gameRunning;
  private BufferedImage bufferedImage;

  private int x = 0;
  private int y = 0;

  public static void main(String[] args) {
     new Game();
  }

  public Game() {
     setSize(800, 600);
     setBackground(Color.red);
     setIgnoreRepaint(true);
     setResizable(false);
     setVisible(true);

     final Image player1 = new ImageIcon("/home/nab/Pictures/java/player1.png").getImage();
     bufferedImage = new BufferedImage(player1.getWidth(null), player1.getHeight(null), BufferedImage.TYPE_INT_RGB);
     bufferedImage.getGraphics().drawImage(player1, 0, 0, null);
     gameRunning = true;
     gameLoop();
  }


  private void gameLoop() {
     while (gameRunning) {
        drawStuff();
        try {
           Thread.sleep(20);
        } catch (Exception e) {
        }
     }
  }

  private void drawStuff() {
     final Graphics2D g = (Graphics2D) getGraphics();
     g.clearRect(0, 0, getWidth(), getHeight());
     g.drawImage(bufferedImage, x++, y++, null);
  }
}

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...