Pixel Cohesion screen sizing implementation

Co-authored-by: sigonasr2 <sigonasr2@gmail.com>
gpu
sigonasr2 2 years ago
parent 087cd3bcb5
commit cb255277a4
  1. 6
      src/sig/JavaProjectTemplate.java
  2. 73
      src/sig/engine/Panel.java

@ -25,10 +25,8 @@ class Player{
public class JavaProjectTemplate { public class JavaProjectTemplate {
public static final String PROGRAM_NAME="Sig's Java Project Template"; public static final String PROGRAM_NAME="Sig's Java Project Template";
public static int WINDOW_WIDTH=256; public static int WINDOW_WIDTH=1280;
public static int WINDOW_HEIGHT=240; public static int WINDOW_HEIGHT=720;
public static int PIXEL_SIZE_X=4;
public static int PIXEL_SIZE_Y=4;
public static Panel game; public static Panel game;
Player pl = new Player(); Player pl = new Player();

@ -66,8 +66,28 @@ public class Panel extends JPanel implements Runnable,KeyListener {
public static JFrame f; public static JFrame f;
int ACTUAL_WINDOW_WIDTH,ACTUAL_WINDOW_HEIGHT; int ACTUAL_WINDOW_WIDTH,ACTUAL_WINDOW_HEIGHT;
Point<Integer> vViewSize = new Point<Integer>(1,1);
Point<Integer> vViewPos = new Point<Integer>(1,1);
static Cursor currentCursor = new Cursor(Cursor.DEFAULT_CURSOR); static Cursor currentCursor = new Cursor(Cursor.DEFAULT_CURSOR);
// Recursive function to return gcd of a and b in single line
static int gcd(int a, int b)
{
return b == 0 ? a : gcd(b, a % b);
}
static void setupNonPixelCohesion(){
Dimension d = p.getSize();
int ww = JavaProjectTemplate.WINDOW_WIDTH;
int wh = JavaProjectTemplate.WINDOW_HEIGHT;
double wasp = (double)ww/(double)wh;
p.vViewSize.x=(int)d.getWidth();
p.vViewSize.y=(int)((double)p.vViewSize.x/wasp);
if (p.vViewSize.y>d.getHeight()) {
p.vViewSize.y=(int)d.getHeight();
p.vViewSize.x=(int)((double)p.vViewSize.y*wasp);
}
}
public static void InitializeEngine(JavaProjectTemplate instance){ public static void InitializeEngine(JavaProjectTemplate instance){
System.setProperty("sun.java2d.transaccel", "True"); System.setProperty("sun.java2d.transaccel", "True");
@ -87,36 +107,30 @@ public class Panel extends JPanel implements Runnable,KeyListener {
f.setSize(JavaProjectTemplate.WINDOW_WIDTH,JavaProjectTemplate.WINDOW_HEIGHT); f.setSize(JavaProjectTemplate.WINDOW_WIDTH,JavaProjectTemplate.WINDOW_HEIGHT);
f.addComponentListener(new ComponentAdapter() { f.addComponentListener(new ComponentAdapter() {
public void componentResized(ComponentEvent e) { public void componentResized(ComponentEvent e) {
Dimension d = p.getSize(); p.ACTUAL_WINDOW_WIDTH=JavaProjectTemplate.WINDOW_WIDTH;
p.pixel=new int[(int)d.getWidth()*(int)d.getHeight()]; p.ACTUAL_WINDOW_HEIGHT=JavaProjectTemplate.WINDOW_HEIGHT;
p.ACTUAL_WINDOW_WIDTH=(int)d.getWidth(); int bw = p.ACTUAL_WINDOW_WIDTH;
p.ACTUAL_WINDOW_HEIGHT=(int)d.getHeight(); int bh = p.ACTUAL_WINDOW_HEIGHT;
p.init(false);
/*{
int32_t ww = vScreenSize.x * vPixelSize.x;
int32_t wh = vScreenSize.y * vPixelSize.y;
float wasp = (float)ww / (float)wh;
if (bPixelCohesion) Dimension d = p.getSize();
{ int xmult = (int)d.getWidth()/bw;
vScreenPixelSize = (vWindowSize / vScreenSize); if (xmult!=0) {
vViewSize = (vWindowSize / vScreenSize) * vScreenSize; p.vViewSize.x=(int)(d.getWidth()/bw)*bw;
} p.vViewSize.y=bh*xmult;
else if (d.getWidth()/bw>d.getHeight()/bh){
{ int ymult=(int)d.getHeight()/bh;
vViewSize.x = (int32_t)vWindowSize.x; if (ymult==0) {
vViewSize.y = (int32_t)((float)vViewSize.x / wasp); setupNonPixelCohesion();
} else {
if (vViewSize.y > vWindowSize.y) p.vViewSize.y=(int)(d.getHeight()/bh)*bh;
{ p.vViewSize.x=bw*ymult;
vViewSize.y = vWindowSize.y;
vViewSize.x = (int32_t)((float)vViewSize.y * wasp);
} }
} }
} else {
vViewPos = (vWindowSize - vViewSize) / 2; setupNonPixelCohesion();
} }
*/ p.vViewPos.set((int)((d.getWidth()-p.vViewSize.x)/2),(int)((d.getHeight()-p.vViewSize.y)/2));
p.init(false);
} }
}); });
p = new Panel(f); p = new Panel(f);
@ -254,7 +268,9 @@ public class Panel extends JPanel implements Runnable,KeyListener {
mImageProducer = new MemoryImageSource(ACTUAL_WINDOW_WIDTH, ACTUAL_WINDOW_HEIGHT, cm, pixel,0, ACTUAL_WINDOW_WIDTH); mImageProducer = new MemoryImageSource(ACTUAL_WINDOW_WIDTH, ACTUAL_WINDOW_HEIGHT, cm, pixel,0, ACTUAL_WINDOW_WIDTH);
mImageProducer.setAnimated(true); mImageProducer.setAnimated(true);
mImageProducer.setFullBufferUpdates(true); mImageProducer.setFullBufferUpdates(true);
imageBuffer = Toolkit.getDefaultToolkit().createImage(mImageProducer); if (p.ACTUAL_WINDOW_WIDTH!=0&&p.ACTUAL_WINDOW_HEIGHT!=0) {
imageBuffer = Toolkit.getDefaultToolkit().createImage(mImageProducer).getScaledInstance(ACTUAL_WINDOW_WIDTH,ACTUAL_WINDOW_HEIGHT,Image.SCALE_FAST);
}
if(runThread && thread.isInterrupted() || !thread.isAlive()){ if(runThread && thread.isInterrupted() || !thread.isAlive()){
thread.start(); thread.start();
} }
@ -264,7 +280,8 @@ public class Panel extends JPanel implements Runnable,KeyListener {
public void paintComponent(Graphics g) { public void paintComponent(Graphics g) {
// perform draws on pixels // perform draws on pixels
long startTime = System.currentTimeMillis(); long startTime = System.currentTimeMillis();
g.drawImage(this.imageBuffer,0,0,ACTUAL_WINDOW_WIDTH,ACTUAL_WINDOW_HEIGHT,0,0,ACTUAL_WINDOW_WIDTH,ACTUAL_WINDOW_HEIGHT,this); g.fillRect(0,0,getWidth(),getHeight());
g.drawImage(imageBuffer,vViewPos.x,vViewPos.y,vViewSize.x+vViewPos.x,vViewSize.y+vViewPos.y,0,0,ACTUAL_WINDOW_WIDTH,ACTUAL_WINDOW_HEIGHT,this);
scaleTime=System.currentTimeMillis()-startTime; scaleTime=System.currentTimeMillis()-startTime;
} }

Loading…
Cancel
Save