zupełnie zapomniałem jeszcze o tej c# wersji
using System;
using System.Timers;
using System.Windows.Forms;
using AllegNet;
namespace Game4{
class Obiekt{ //klasa wszelkich obiektow w grze
public double x, y;
public int punkty, r, g, b, promien;
public Obiekt(double x, double y, int r, int g, int b, int promien){
this.r = r; this.g = g; this.b = b;
this.x = x; this.y = y; this.promien = promien;
punkty = 0;
}
public BITMAP bitmapa;
public int getColor(){
return API.Makecol(r,g,b);
}
public void reset(double x, double y){
this.x = x;
this.y = y;
}
}
class MainClass:API{
int ticks = 0;
System.Timers.Timer Zegar;
bool wyjscie = false;
BITMAP bufor;
BITMAP tlo;
string sciezkaTlo = "C:\\Users\\Albert\\Desktop\\In_progres\\code\\Game4\\bin\\Debug\\obraz2.bmp";
int kolor = API.Makecol(11,37,0);
//x, y, R, G, B, r
Obiekt gracz1 = new Obiekt(250, 430, 210, 17, 17, 13);
Obiekt gracz2 = new Obiekt(750, 430, 38, 122, 165, 13);
Obiekt pilka = new Obiekt(504, 430, 255, 255, 255, 6);
double wektor1, wektor2;
KEY klawisz = new KEY();
//zwiekszanie zegarka
public void timerproc(object source, ElapsedEventArgs e){
++ticks; //Console.WriteLine(ticks); //tylko do testow
}
//inicjalizacja biblioteki
public void init(){
Allegro_init();
Install_keyboard();
Set_color_depth(COLOR_DEPTH.BITS_32);
Set_gfx_mode(GFX_MODES.GFX_AUTODETECT_WINDOWED, 1000, 700);
//ustawienia zegara
Zegar = new System.Timers.Timer(30); //Zegar.Interval = 30; //w razie jakby wartosc z konstruktora nie dzialala
Zegar.Elapsed += new ElapsedEventHandler(timerproc);
Zegar.Enabled = true;
}
//ladowanie zasobow
public void load(){
bufor = Create_bitmap(1000, 700); //tworzenie bufora grafiki
if(bufor.BitmapPointer == null) Console.WriteLine("Nie mozna stworzyc bufora!");
tlo = Load_bitmap(sciezkaTlo); //ladowanie grafiki tla
if(tlo.BitmapPointer == null) Console.WriteLine("Nie mozna zaladowac tla!");
gracz1.bitmapa = Create_bitmap(27,27); //grafika gracza1
Clear_to_color(gracz1.bitmapa, kolor);
Circlefill(gracz1.bitmapa, gracz1.promien, gracz1.promien, gracz1.promien, gracz1.getColor());
gracz2.bitmapa = Create_bitmap(27,27); //grafika gracza2
Clear_to_color(gracz2.bitmapa, kolor);
Circlefill(gracz2.bitmapa, gracz2.promien, gracz2.promien, gracz2.promien, gracz2.getColor());
pilka.bitmapa = Create_bitmap(13,13); //grafika pilki
Clear_to_color(pilka.bitmapa, kolor);
Circlefill(pilka.bitmapa, pilka.promien, pilka.promien, pilka.promien, pilka.getColor());
}
//rysowanie grafiki
void draw(){
Clear_to_color(bufor, 0);
//wyswietlenie calej grafiki
Blit(tlo, bufor, 0, 0, 0, 0, 1000, 700); //Jak cos nie podziala, to: Blit(bufor, Screen, 0, 0, 0, 0, 800, 600);
Blit(gracz1.bitmapa, bufor, 0, 0, (int)gracz1.x, (int)gracz1.y, 1000, 700);
Blit(gracz2.bitmapa, bufor, 0, 0, (int)gracz2.x, (int)gracz2.y, 1000, 700);
Blit(pilka.bitmapa, bufor, 0, 0, (int)pilka.x, (int)pilka.y, 1000, 700);
//wszystkie napisy
Textout_ex(bufor, Font, "Wcisnij ESC zeby zakonczyc", 680, 670, Makecol(60,60,60), -1);
Textout_ex(bufor, Font, "Wcisnij P zeby zresetowac pozycje pilki", 640, 680, Makecol(60,60,60), -1);
Textout_ex(bufor, Font, "Czerwony", 420, 160, Makecol(240,60,60), -1);
Textout_ex(bufor, Font, gracz1.punkty.ToString(), 450, 180, Makecol(240,60,60), -1);
Textout_ex(bufor, Font, "Niebieski", 540, 160, Makecol(60,60,240), -1);
Textout_ex(bufor, Font, gracz2.punkty.ToString(), 570, 180, Makecol(60,60,240), -1);
//bufor na ekran
Blit(bufor, Screen, 0, 0, 0, 0, 1000, 700);
}
//mechanika
void logic(){
if(klawisz[ALL_KEYS.KEY_ESC]) wyjscie = true; //wyjscie z gry
if(klawisz[ALL_KEYS.KEY_P]) pilka.reset(504, 430); //reset pilki
//gracz1
if(klawisz[ALL_KEYS.KEY_A] && gracz1.x>=90) gracz1.x-=3.3;
if(klawisz[ALL_KEYS.KEY_D] && gracz1.x<=908) gracz1.x+=3.3;
if(klawisz[ALL_KEYS.KEY_W] && gracz1.y>= 228) gracz1.y-=3.3;
if(klawisz[ALL_KEYS.KEY_S] && gracz1.y<=621) gracz1.y+=3.3;
//gracz2
if(klawisz[ALL_KEYS.KEY_LEFT] && gracz2.x>=90) gracz2.x-=3.3;
if(klawisz[ALL_KEYS.KEY_RIGHT] && gracz2.x<=908) gracz2.x+=3.3;
if(klawisz[ALL_KEYS.KEY_UP] && gracz2.y>=228) gracz2.y-=3.3;
if(klawisz[ALL_KEYS.KEY_DOWN] && gracz2.y<=621) gracz2.y+=3.3;
//pilka
wektor1 = Math.Sqrt(Math.Pow(pilka.x-gracz1.x,2)+Math.Pow(pilka.y-gracz1.y,2));
if(wektor1>16 && wektor1<18){
if(klawisz[ALL_KEYS.KEY_A]) pilka.x-=3.3;
if(klawisz[ALL_KEYS.KEY_D]) pilka.x+=3.3;
if(klawisz[ALL_KEYS.KEY_W]) pilka.y-=3.3;
if(klawisz[ALL_KEYS.KEY_S]) pilka.y+=3.3;
//strzal gracz1
if(klawisz[ALL_KEYS.KEY_E]) pilka.x+=100;
}
wektor2 = Math.Sqrt(Math.Pow(pilka.x-gracz2.x,2)+Math.Pow(pilka.y-gracz2.y,2));
if(wektor2>16 && wektor2<18){
if(klawisz[ALL_KEYS.KEY_LEFT]) pilka.x-=3.3;
if(klawisz[ALL_KEYS.KEY_RIGHT]) pilka.x+=3.3;
if(klawisz[ALL_KEYS.KEY_UP]) pilka.y-=3.3;
if(klawisz[ALL_KEYS.KEY_DOWN]) pilka.y+=3.3;
//strzal gracz2
if(klawisz[ALL_KEYS.KEY_M]) pilka.x-=100;
}
//punkty
if(pilka.x<79 && pilka.y>368 && pilka.y<487){
++gracz2.punkty;
pilka.reset(504, 430);
gracz1.reset(250, 430);
gracz2.reset(750,430);
Console.WriteLine("GOOOLLLLLL!!!!!!!");
}
if(pilka.x>926 && pilka.y>368 && pilka.y<487){
++gracz1.punkty;
pilka.reset(504, 430);
gracz1.reset(250, 430);
gracz2.reset(750,430);
Console.WriteLine("GOOOLLLLLL!!!!!!!");
}
//rozny_aut_1
if((pilka.x<79 && (pilka.y<368 || pilka.y>487)) || (pilka.y>621 || pilka.y<228)){
gracz1.reset(100, 430);
gracz2.reset(500, 430);
pilka.reset(120, 430);
Console.WriteLine("Pilka opuscila linie boiska!");
}
//rozny_aut_2
if((pilka.x>926 && (pilka.y<368 || pilka.y>487)) || (pilka.y>621 || pilka.y<228)){
gracz1.reset(500, 430);
gracz2.reset(900, 430);
pilka.reset(880, 430);
Console.WriteLine("Pilka opuscila linie boiska!");
}
}
//zwolnienie zasobow
void release(){
Destroy_bitmap(tlo);
Destroy_bitmap(gracz1.bitmapa);
Destroy_bitmap(gracz2.bitmapa);
Destroy_bitmap(pilka.bitmapa);
Destroy_bitmap(bufor);
}
public static void Main(){
MainClass gra = new MainClass();
gra.init();
gra.load();
while(!gra.wyjscie){
gra.draw();
while(gra.ticks>0){
gra.logic();
gra.ticks--;
}
}
gra.release();
}
}
}
od strony kodu trochę się różni, jest bardziej obiektowo bo sam c# kładzie większy nacisk na obiektowość no i dotnetowa wersja allegro czyli allegnet, też trochę bardziej stawia na obiektowość
od strony tego jak gra działa nie ma praktycznie żadnej różnicy poza tym, że w wersji c++ komunikaty były w messageboxie, a tutaj są w konsoli, reszta jest dokładnie identyczna