şu oyuna bir bakın

şu oyuna bir bakın

elix

network dersi projesi için basit bi oyun yazmıştım, tatilde biraz düzenleyip tek bilgisayardan oynanabilir hale getirdim.

bu adreste ekran görüntüsü var:
http://img54.imageshack.us/img54/9219/resim3tx6.jpg

Ortada nehir var, sağ ve soldaki toplar birbirlerini vurmaya çalışıyorlar. Oyuncular aynı anda hareket edip ateş edebiliyorlar. namlu, yukarı aşağı tuşlarıyla kontrol ediliyor.

birinci oyuncunun tuşları: yön tuşları ve ateş için L tuşu.
ikinci oyuncunun tuşları: A-S-D-W ve ateş için space tuşu.
Alttaki bar, topun hızını belirler. Basılı tuttukça barın boyu artar. Ateş edebilmek için barın kırmızı olması gerek.

bu tarz bir oyunun eğlenceli bişey olacağını düşünüyordum, kimseyle oynayamadım henüz ama oynanabilirlik çok düşük geldi bana.

Özenle yapılmış bir oyun değil(görünce anlarsınız zaten); giriş ekranı, menüler vs o tip şeylerle uğraşmadım. maksadım sadece basit ama eğlenceli bişeyler yazmaktı ama görünüşe göre pek işe yarar bişey çıkmadı. Gene de göstereyim dedim.

Oyun javada yazıldı. Tek dosya haline getirdim aşağıya kopyaladım. Direk aşağıdaki metni kopyalayıp Pencere.java adlı bir dosyaya kaydedip çalıştırabilirsiniz. Java kullananlar bilir zaten nasıl çalıştıracağını, java kullanmayanlar ise bu kod için java kurmaya kalkmazlar heralde.








import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.ArrayList;


//birinci oyuncunun tuslari: Yon tuslari ve ´L´ ates
//ikinci oyuncunun tuslari: A-S-D-W tuslari ve ´space´ ates
public class Pencere extends JFrame implements KeyListener,Runnable{
Image db;
Graphics g2;
ArrayList tops;
Oyuncu playerA,playerB;

int motionA,motionB,rotationA,rotationB,barA,barB,barMotion=2,yercekimi=2;

int aYerX=0,bYerX=500,yerY=500,yerUzunluk=300,yerYukseklik=100;

int suY=525,suUzunluk=200,suYukseklik=75;

double cubukUzunluk=40,cubukGen=12;

int oyuncuBoy=50,topBoy=20;

int namluMinAci=20;
int speedA,speedB,speedLimit=30,speedCf=7;
ImageIcon top;

//oyuncu vurulmussa true olur
boolean patA=false,patB=false;
int patCounterA,patCounterB;


public Pencere(){
playerA=new Oyuncu(100,60);
playerB=new Oyuncu(700,120);
tops=new ArrayList();
top=new javax.swing.ImageIcon("ball.gif");

System.gc();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(800,600);
setVisible(true);
db=createImage(800,600);
g2 = db .getGraphics();
addKeyListener(this);

}

public static void main(String[] args) {

Pencere p=new Pencere();
Thread th=new Thread(p);
th.start();
}

public void paint(Graphics g){
g2.setColor(new Color(150,150,250));
g2.fillRect(0,0,800,600);
drawTops();
g2.setColor(Color.BLUE);
g2.fillRect(300,525,200,75);

drawOyuncu(playerA);
drawOyuncu(playerB);

if(patA){
patlat(playerA);
patCounterA--;
if(patCounterA==0)
patA=false;
}
if(patB){
patlat(playerB);
patCounterB--;
if(patCounterB==0)
patB=false;
}
g2.setColor(Color.DARK_GRAY);

//karalar
g2.fillRect(500,500,300,300);
g2.fillRect(0,500,300,300);

//atis gucu
drawBars();

g2.setFont(new Font("Chicago", Font.PLAIN, 35));
g2.setColor(Color.white);

g2.drawString("hit: "+playerA.hit,aYerX+100,100);
g2.drawString("hit: "+playerB.hit,bYerX+100,100);


g.drawImage(db,0,0,this);
}

public void drawBars() {
g2.setFont(new Font("Chicago", Font.PLAIN, 15));
//playerA
if(barA>speedLimit)
g2.setColor(new Color(250,0,0));
else
g2.setColor(new Color(100,200,200));
g2.fillRect(aYerX+100,yerY+50,barA+3,15);
g2.drawString(""+barA,aYerX+80,yerY+63);

//playerB
if(barB>speedLimit)
g2.setColor(new Color(250,0,0));
else
g2.setColor(new Color(100,200,200));
g2.fillRect(bYerX+100,yerY+50,barB+3,15);
g2.drawString(""+barB,bYerX+80,yerY+63);
}

public void patlat(Oyuncu oy){
int x=oy.getX();
int[] xs={x+25,x+30,x+15,x,x-15,x-30,x-25};
int[] ys={yerY,yerY-25,yerY-20,yerY-35,yerY-20,yerY-25,yerY};
int[] xs2={x+15,x+20,x+5,x,x-5,x-20,x-15};
int[] ys2={yerY,yerY-15,yerY-10,yerY-25,yerY-10,yerY-15,yerY};

g2.setColor(new Color(250,0,0));
g2.fillPolygon(xs,ys,7);
g2.setColor(new Color(250,250,0));
g2.fillPolygon(xs2,ys2,7);
}

private void drawOyuncu(Oyuncu oy) {
drawCubuk(oy);
g2.setColor(Color.GREEN);
g2.fillOval(oy.getX()-oyuncuBoy/2,yerY-oyuncuBoy/2, 50,50);
}

public void drawCubuk(Oyuncu oy){
double ax=oy.getX();
double ay=yerY;
double bx=ax+cubukUzunluk*Math.cos(degToRad(oy.getAngle()));
double by=ay-cubukUzunluk*Math.sin(degToRad(oy.getAngle()));

int[] xs=new int[4];
int[] ys=new int[4];

xs[0]=(int)ax+(int)(cubukGen*Math.cos(degToRad(oy.getAngle()+270)));
ys[0]=(int)ay-(int)(cubukGen*Math.sin(degToRad(oy.getAngle()+270)));

xs[1]=(int)bx+(int)(cubukGen*Math.cos(degToRad(oy.getAngle()+270)));
ys[1]=(int)by-(int)(cubukGen*Math.sin(degToRad(oy.getAngle()+270)));

xs[2]=(int)bx-(int)(cubukGen*Math.cos(degToRad(oy.getAngle()+270)));
ys[2]=(int)by+(int)(cubukGen*Math.sin(degToRad(oy.getAngle()+270)));

xs[3]=(int)ax-(int)(cubukGen*Math.cos(degToRad(oy.getAngle()+270)));
ys[3]=(int)ay+(int)(cubukGen*Math.sin(degToRad(oy.getAngle()+270)));
g2.setColor(new Color(200,5,10));
g2.fillPolygon(xs,ys,4);

}

public static double degToRad(double deg){
double rad=deg*Math.PI/180;
return rad;
}

private void drawTops() {
if(!tops.isEmpty()){
int size=tops.size();
for(int i=0;i<size;i++){
Top t=(Top)tops.get(i);
t.dy-=yercekimi;
t.x+=(int)t.dx;
t.y-=(int)t.dy;
top.paintIcon(this,g2,t.getX()-10,t.getY()-10);
//top.paintIcon(this,g2,300,300);
if(((t.getY()>yerY-oyuncuBoy/2)&&t.getY()<yerY&&
t.getX()>playerB.getX()-oyuncuBoy/2-topBoy/2&&t.getX()<playerB.getX()+oyuncuBoy/2+topBoy/2)&&t.plNum==1){
playerA.hit++;
patB=true;
patCounterB=10;
}else if(((t.getY()>yerY-oyuncuBoy/2)&&t.getY()<yerY&&
t.getX()>playerA.getX()-oyuncuBoy/2-topBoy/2&&t.getX()<playerA.getX()+oyuncuBoy/2+topBoy/2)&&t.plNum==2){
playerB.hit++;
patA=true;
patCounterA=10;
}
}

for(int i=0;i<size;i++){
Top t=(Top)tops.get(i);
if(t.getX()>this.getWidth()||t.getX()<0||t.getY()>this.getHeight()){

tops.remove(t);
t=null;
}

}

}
}

public void keyPressed(KeyEvent e) {

switch (e.getKeyCode()) {
case KeyEvent.VK_SPACE:
speedA=3;
break;
case KeyEvent.VK_W:
rotationA=3;
break;
case KeyEvent.VK_S:
rotationA=-3;
break;
case KeyEvent.VK_D:
motionA=3;
break;
case KeyEvent.VK_A:
motionA=-3;
break;


case KeyEvent.VK_L:
speedB=3;
break;
case KeyEvent.VK_UP:
rotationB=3;
break;
case KeyEvent.VK_DOWN:
rotationB=-3;
break;
case KeyEvent.VK_RIGHT:
motionB=3;
break;
case KeyEvent.VK_LEFT:
motionB=-3;
break;
}

}

public void keyReleased(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_SPACE:
if(barA>speedLimit){
tops.add(new Top(playerA.getX(),yerY,barA*speedCf,playerA.getAngle(),1));
}
barA=0;
speedA=0;
break;
case KeyEvent.VK_W:
rotationA=0;
break;
case KeyEvent.VK_S:
rotationA=0;
break;
case KeyEvent.VK_D:
motionA=0;
break;
case KeyEvent.VK_A:
motionA=0;
break;

case KeyEvent.VK_L:
if(barB>speedLimit)
tops.add(new Top(playerB.getX(),yerY,barB*speedCf,playerB.getAngle(),2));
barB=0;
speedB=0;
break;
case KeyEvent.VK_UP:
rotationB=0;
break;
case KeyEvent.VK_DOWN:
rotationB=0;
break;
case KeyEvent.VK_RIGHT:
motionB=0;
break;
case KeyEvent.VK_LEFT:
motionB=0;
break;
}
}

public void keyTyped(KeyEvent e) {

}

public void run() {
while(true){
//ilk oyuncu

//hareket ettir
if(!(playerA.getX()<aYerX+oyuncuBoy/2&&motionA==-3)&&
!(playerA.getX()>aYerX+yerUzunluk-oyuncuBoy/2-3&&motionA==+3)){
playerA.move(motionA);
}

//guc durumunu ciz
if(speedA==3&&barA<100)
barA+=barMotion;

//namluyu dondur
if(!(playerA.getAngle()>180-namluMinAci&&rotationA==3)&&
!(playerA.getAngle()<namluMinAci&&rotationA==-3))
playerA.rotate(rotationA);

//ikinci oyuncu

//hareket ettir
if(!(playerB.getX()<bYerX+oyuncuBoy/2&&motionB==-3)&&
!(playerB.getX()>bYerX+yerUzunluk-oyuncuBoy/2-3&&motionB==3))
playerB.move(motionB);

//namluyu dondur
if(speedB==3&&barB<100)
barB+=barMotion;

//namluyu dondur
if(!(playerB.getAngle()>180-namluMinAci&&rotationB==3)&&
!(playerB.getAngle()<namluMinAci&&rotationB==-3))
playerB.rotate(rotationB);

try{
Thread.sleep(30);
repaint();
}catch(Exception e){
e.printStackTrace();
}
}
}

}


class Top extends Thread{

int x,y;
double v;
double dx,dy;
int ax,ay,bx,by;
int plNum;
public Top(int x,int y,double v, double angle,int pl){
this.x=x;
this.y=y;
this.v=v;
plNum=pl;
dx=v*Math.cos(angle*Math.PI/180)/10;
dy=v*Math.sin(angle*Math.PI/180)/10;
}


public double getDx() {
return dx;
}

public void setDx(double dx) {
this.dx = dx;
}

public double getDy() {
return dy;
}

public void setDy(double dy) {
this.dy = dy;
}

public double getV() {
return v;
}

public void setV(double v) {
this.v = v;
}

public int getX() {
return x;
}

public void setX(int x) {
this.x = x;
}

public int getY() {
return y;
}

public void setY(int y) {
this.y = y;
}

}


class Oyuncu {

int x;
double angle;
int hit;

public Oyuncu(int x){
this.x=x;
}
public Oyuncu(int x, double ang){
this.x=x;
angle=ang;
}
public void rotate(int rotation) {
setAngle(angle+rotation);
}
public void move(int motion) {
setX(x+motion);
}

public double getAngle() {
return angle;
}

public void setAngle(double angle) {
this.angle = angle;
}

public int getX() {
return x;
}

public void setX(int x) {
this.x = x;
}

}

//emre onal --- elix

2007-05-19 20:31:05

Cvp

elix

Direk bunu indirin. Java yüklüyse oyun.jar dosyasını çift tıkladığınızda oyunun çalışması gerek. Kaynak kodu da yanında.


http://www.4shared.com/...4173/dd675c7f/Oyun.html

2007-03-09 19:22:08

Cvp

mj

javaFrame ve grafik alt yapısı için güzel bir örnek..
daha da güzel olabilirmiş ama...

2007-05-19 18:31:51

Cvp

FatihÖzen

emre emeğine sağlık arkadaşım.Bu tarz bir oyun vardı amiga döneminde deli gibi oynardım.Basit olan eğlencelidir.Büyük oyunlar stres yapıyor bende[G1].Uğraşmıyosun sanırım artık.Başka bir projen yoksa geliştir derim bu oyunu.[G5]

link´te sorun var sanırım.

2007-05-19 20:31:05

Cvp

YuTo

abi inanamıyorum C# nekadar özenti bi dilmiş :( kodları tek tek anlıyorum harfi harfine aynı nerdeyse C#la

2007-07-22 11:34:33

Re:Cvp

elix

[quote=1226] Yazan: FatihÖzen

emre emeğine sağlık arkadaşım.Bu tarz bir oyun vardı amiga döneminde deli gibi oynardım.Basit olan eğlencelidir.Büyük oyunlar stres yapıyor bende[G1].Uğraşmıyosun sanırım artık.Başka bir projen yoksa geliştir derim bu oyunu.[G5]

link´te sorun var sanırım.[/quote]

[url]http://www.box.net/shared/ganp29qotn[/url]

işler yolunda giderse 3d oyunlar geliyor inşaallah ilerde ;)

2007-10-03 14:03:34

Cvp

ozmoz

Eline emeğine sağlık bekleriz :~)

2007-10-27 01:26:34