Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Robię grę 2D rpg. Proszę o usprawnienia i pomysły.


Rekomendowane odpowiedzi

Opublikowano

Siemano. Nie jestem jakimś super programistą, ale sam uważam to za jakiś progress, że napisałem sam taką 'apke'.

 

W grze tej są 3 pictureboxy.

Player

block

block1

 

kod gry na samym dole.

 

Gra nie jest jakaś super, w sumie na razie nie ma w niej nawet sensu. 

Można w niej chodzić, atakować za pomocą CTRL + jesli stoi się obok block1 to co pół sekundy zadaje nam on obrażenia.

 

Jeśli jest jakoś to możliwe, pogrupowanie np bloków (block1 i block) żeby nie pisać jeszcze raz takiego samego kodu, żeby 

były one jako kolizje, przez które gracz nie może się poruszyć.

 

W planach mam też dodanie możliwości chodzenia tych bloków. 

 

Jeśli ktoś się na tym dobrze zna, proszę o pomoc.

 

Kod:

 

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;
 
namespace WindowsFormsApplication1
{
    
    public partial class Form1 : Form
    {
        public Rectangle actor;
        public Rectangle wall_1;
        public Rectangle wall_2;
        public int PlayerSpeed = 3;
        public List<Rectangle> wallList = new List<Rectangle>();
        public Point lastLocation;
        Timer clk = new Timer();
 
 
 
 
 
 
        public bool right;
        public bool left;
        public bool up;
        public bool down;
        public bool shift;
        public bool slow;
        public bool gover;
 
        public int speed = 14;
 
        public bool wtf;
 
 
        public bool hit;
 
        public int ehp = 20;
        public int edamage = 1;
 
 
        public int hp = 20;
        public int damage = 1;
        public bool respawn;
        public int resp = 5;
 
 
        public Form1()
        {
            InitializeComponent();
 
            clk.Tick += new EventHandler(clk_Tick);
            clk.Interval = 55;
            clk.Enabled = true;
            clk.Start();
            //Określenie rozmiaru obiektów na "scenie"
            actor.Width = Player.Width;
            actor.Height = Player.Height;
 
            wall_1.Width = block1.Width;
            wall_1.Height = block1.Height;
        }
        void clk_Tick(object sender, EventArgs e)
        {
            if (up == true)
            {
                actor.Location = new Point(Player.Location.X, Player.Location.Y - PlayerSpeed);
            }
            if (down == true)
            {
                actor.Location = new Point(Player.Location.X, Player.Location.Y + PlayerSpeed);
            }
            if (left == true)
            {
                actor.Location = new Point(Player.Location.X - PlayerSpeed, Player.Location.Y);
            }
            if (right == true)
            {
                actor.Location = new Point(Player.Location.X + PlayerSpeed, Player.Location.Y);
            }
 
            //aktualizacja pozycji gracza
            actor.Location = new Point(Player.Location.X, Player.Location.Y);
            //a tu się dzieje magia odbicia od ścian
            //dla każdego Rectangla
            foreach (Rectangle x in wallList)
            {
                
                //Kiedy Rectangle player styka się z x
                if (actor.IntersectsWith(x))
                {
                    //Przywracanie lokacji do ostatniej
                    Player.Location = lastLocation;
                }
                else
                {
                    //Ustawienie ostatniej lokalizacji
                    lastLocation = Player.Location;
                }
            }
            wall_1.Location = new Point(block1.Location.X, block1.Location.Y);
            wallList.Add(wall_1);
        }
 
        private void screen_KeyDown(object sender, KeyEventArgs e)
        {
            if (gover == false)
            {
                #region PORUSZANIE
                if (e.KeyCode == Keys.A)
                {
                    if (Player.Left >= screen.Left) { left = true; }
                }
                if (e.KeyCode == Keys.D)
                {
                    if (Player.Right < screen.Right) { right = true; }
                }
                if (e.KeyCode == Keys.W)
                {
                    if (Player.Top > screen.Top) { up = true; }
                }
                if (e.KeyCode == Keys.S)
                {
                    if (Player.Bottom < screen.Bottom) { down = true; }
                }
                if (e.KeyCode == Keys.ShiftKey)
                {
                    shift = true;
                    timer1.Interval = 10;
                }
                if (e.KeyCode == Keys.ControlKey)
                {
 
                    clk.Interval = 50;
                    Player.Size = new System.Drawing.Size(64, 64);
                    if (Player.Right > block1.Left - 5 && Player.Bottom > block1.Top - 6 && Player.Left < block1.Right - -2 && Player.Top < block1.Bottom - -5)
                    {
                        if (ehp > 0)
                        {
                            if (ehp > 0)
                            {
                                ehp -= 1;
                            }
                            if (ehp == 0)
                            {
                                block1.Visible = false;
                                block1.Enabled = false;
                                txtEstat.Visible = false;
                            }
 
                        }
                    }
 
                }
            }
 
 
 
            #endregion
 
                
        }
 
        private void timer1_Tick(object sender, EventArgs e)
        {
 
            if (wtf == true)
            {
                console.Visible = false;
                wtf = false;
            }
 
            timer1.Interval = speed;
 
            if (gover == true)
            {
                label2.Visible = true;
            }
            if (hp <= 0)
            {
                gover = true;
            }
 
            #region Respawn
 
            if (block1.Visible == false)
            {
                timer2.Start();
                respawn = true;
            }
            if (respawn == true && licznik.Text == "0")
            {
                block1.Visible = true;
                txtEstat.Visible = true;
                ehp = 20;
            }
 
            #endregion
 
            #region Kolizje bloku
 
 
 
            #endregion
 
            #region kolizje poza wyjscie mapy
            if ( Player.Left - screen.Left < 0)
            {
                left = false;
            }
            if (Player.Top - screen.Top < 42)
            {
                up = false;
            }
            if (Player.Bottom - screen.Bottom > -1)
            {
                down = false;
            }
            if (Player.Right >= screen.Right)
            {
                right = false;
            }
            #endregion
 
            #region Ruch
 
            if (right == true)
            {
                Player.Left += 2;
            }
            if (left == true)
            {
                Player.Left -= 2;
            }
            if (down == true)
            {
                Player.Top += 2;
            }
            if (up == true)
            {
                Player.Top -= 2;
            }
            #endregion
 
                //tekst
                licznik.Text = resp.ToString();
                txtStat.Text = "HP: " + hp + "\nDamage: " + damage;
                txtEstat.Text = "HP: " + ehp + "\nDamage: " + edamage;
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            label2.Visible = false;
            screen.Focus();
            timer3.Start();
            
        }
 
        private void screen_KeyUp(object sender, KeyEventArgs e)
        {
            #region PoruszaniesieOFF
            if (e.KeyCode == Keys.ShiftKey)
            {
                shift = false;
                speed = 16;
            }
            if (e.KeyCode == Keys.A)
            {
                if (Player.Left >= screen.Left) { left = false; }
            }
            if (e.KeyCode == Keys.D)
            {
                if (Player.Right < screen.Right) { right = false; }
            }
            if (e.KeyCode == Keys.W)
            {
                if (Player.Top > screen.Top) { up = false; }
            }
            if (e.KeyCode == Keys.S)
            {
                if (Player.Bottom < screen.Bottom) { down = false; }
            }
            if (e.KeyCode == Keys.ControlKey)
            {
                speed = 14;
                Player.Size = new System.Drawing.Size(66, 66); 
            }
            #endregion
        }
 
        private void screen_MouseUp(object sender, MouseEventArgs e)
        {
            screen.Focus();
           
        }
 
        private void timer2_Tick(object sender, EventArgs e)
        {
            
            
            resp -= 1;
            if ( resp < 0)
            {
                respawn = false;
                resp = 5;
                timer2.Stop();
            }
        }
 
        private void timer3_Tick(object sender, EventArgs e)
        {
            #region uderzenie
            if (block1.Right > Player.Left - 2 && block1.Bottom > Player.Top - 6 && block1.Left < Player.Right - -2 && block1.Top < Player.Bottom - -5 && block1.Visible == true && hp > 0)
            {
                hit = true;
            }
            else
            {
                hit = false;
 
            }
 
            if (hit == true)
            {
 
                hp -= edamage;
                block1.Size = new System.Drawing.Size(153, 76);
                block1.BackColor = Color.FromName("Red");
            }
            if (hit == false)
            {
                block1.Size = new System.Drawing.Size(155, 78);
                block1.BackColor = Color.FromName("Cyan");
 
            }
            #endregion
        }
 
        private void label2_Click(object sender, EventArgs e)
        {
            Player.Location = new Point(55, 446);
            hp = 20;
            ehp = 20;
            damage = 1;
            edamage = 1;
            label2.Hide();
            gover = false;
        }
 
 
 
 
 
 
 
 
    }
}
 

 

 

 

 

 

Screen: 

post-394185-0-18414800-1397750123_thumb.png

sygnatura niezgodna z regulaminem forum mpc rozdział II pkt. 7

Opublikowano

Usprawnienie:

zamiast tyle if'ów daj else ify (np. sprawdzanie wciśnięcia klawiszy), zwiększy to wydajność oraz zmniejszy zużycie zasobów.

qxv1fr.jpg


by NovusOrdo


It is better to keep your mouth closed and let people think you are a fool than to open it and remove all doubt. ~Mark Twain

Opublikowano

Usprawnienie:

zamiast tyle if'ów daj else ify (np. sprawdzanie wciśnięcia klawiszy), zwiększy to wydajność oraz zmniejszy zużycie zasobów.

 

Ale masz swiadomosc ze to nie ma ZADNEJ roznicy?

Opublikowano

Ale masz swiadomosc ze to nie ma ZADNEJ roznicy?

Aha, wcale, tylko to, że gdy wciśniesz np. lewy przycisk to przeszuka cały kod w poszukiwaniu działania jego, a gdy użyjesz else if to zatrzyma się, co zwiększy wydajność.

qxv1fr.jpg


by NovusOrdo


It is better to keep your mouth closed and let people think you are a fool than to open it and remove all doubt. ~Mark Twain

Opublikowano

Aha, wcale, tylko to, że gdy wciśniesz np. lewy przycisk to przeszuka cały kod w poszukiwaniu działania jego, a gdy użyjesz else if to zatrzyma się, co zwiększy wydajność.

 

lmao

 

To teraz powiedz mi o ile przyspieszy to dzialanie programu przy 5 if-ach, mozesz rowniez sprawdzic ile zajmuje sprawdzenie tego jednego warunku, chetnie sie dowiem ile pomoze taka pro optymalizacja...

Opublikowano

lmao

 

To teraz powiedz mi o ile przyspieszy to dzialanie programu przy 5 if-ach, mozesz rowniez sprawdzic ile zajmuje sprawdzenie tego jednego warunku, chetnie sie dowiem ile pomoze taka pro optymalizacja...

Z takim podejściem nigdy nie będziesz miał dobrze zoptymalizowanego programu i ludzie będą narzekać tak jak na ten twój "Mingrawd", że nie umieją dobrze zoptymalizować go.

@@Minecraft2RP

Optymalizacja polega na odpowiednim doborze zmiennych oraz poleceń.

Aktualnie piszę bota który ma na razie 6k linijek (przewiduję 7-9 tyś.)

qxv1fr.jpg


by NovusOrdo


It is better to keep your mouth closed and let people think you are a fool than to open it and remove all doubt. ~Mark Twain

Opublikowano

Z takim podejściem nigdy nie będziesz miał dobrze zoptymalizowanego programu i ludzie będą narzekać tak jak na ten twój "Mingrawd", że nie umieją dobrze zoptymalizować go.

 

LMAO

 

Zrobiles juz te testy czy nie? Bo naprawde chce wiedziec o ile skroci sie czas sprawdzania warunkow po zastosowaniu twojej optymalizacji...

 

Pisales w ogole jakis program wiekszy niz 100 linijek? Bo jak myslisz ze optymalizacja polega na zamianie kilku ifow na elseify albo swtich to jestes w bledzie.

Opublikowano

@AdirasOwns 

Wiek ma znaczenie? :D Mam 16 lat, zabawę z C# dopiero zaczynam, nie jestem jakiś super w tym, dlatego przy pomocy, coś może uda mi się osiągnąć. Nigdzie nie bd wystawiał tej 'gry', ma to być taki mój projekt, na którym bd się uczył.

 

 

@@@@@@@@@@@@@@@

Update do kodu :)
@@@@@@@@@@@@@@@

sygnatura niezgodna z regulaminem forum mpc rozdział II pkt. 7

Opublikowano

Z takim podejściem nigdy nie będziesz miał dobrze zoptymalizowanego programu i ludzie będą narzekać tak jak na ten twój "Mingrawd", że nie umieją dobrze zoptymalizować go.

@@Minecraft2RP

Optymalizacja polega na odpowiednim doborze zmiennych oraz poleceń.

Aktualnie piszę bota który ma na razie 6k linijek (przewiduję 7-9 tyś.)

 

No i na tym mozna skonczyc dyskusje bo widac ze nie masz pojecia o czym piszesz

Opublikowano

@JestemPolakiem

 

Po 1. Zmienisz działanie kodu, bo stosując elseif możliwe będzie zareagowanie tylko na jeden klawisz.

Po 2. Nawet przy 100000 ifów zamienionych na elseify nie zauważysz różnicy w przeciętnym przypadku. (Może nawet i przy większej ilości), a jak masz >5 to przeważnie coś masz źle, albo można to zrobić lepiej.

Po 3. Jak masz problem z wydajnością, to przeważnie jest to przez algorytm, a nie przez ify.

Po 4. Pisz wszystko w jednej funkcji i nie używaj polimorfizmu, bo takie wywołania też nie są za szybkie.

Po 5. Najlepiej to w ogóle pisz w ASM.

Po 6. Założę się, że dbasz o te ify jak o nie wiem co, a tak na prawdę w innych miejscach w kodzie tracisz 1000 razy więcej na wydajności robiąc głupie rzeczy. Dbasz aby twój kod był cache-friendly i w ogóle? Pewnie nie, bo najważniejsze dla ciebie są elseify.

Opublikowano

Jeśli chodzi o programowanie to wiek nie ma najmniejszego znaczenia. Ja też mam 16lat, ale programować zacząłem uczyć się już trochę wcześniej od Ciebie. Najważniejsze to żebyś nie rezygnował i uczył się dalej, ponieważ wiadomo, że wiedza sama nie przyjdzie. :)

Tutaj masz screenshot'a z jakiejś mojej gierki, nie jest dopracowana ale satysfakcja, że zrobiłeś coś samemu jest ogromna.

 

 

50989611446863288636.png.

 

 

2mmtzeu.jpg

Opublikowano

Zamiast porównywać boolean w taki sposób: "== true", "!= false" możesz po prostu napisać if (twojaZmienna), tudzież "== false", "!= true" zapisać możesz tak: if (!twojaZmienna).

Opublikowano

Ogólnie najlepiej unikać mocno zagnieżdżonych instrukcji warunkowych. Wszystko zależy od tego co chcesz zrobić. Ważne aby przyjąć sobie jedną, stałą konwencję. Identyczne nazewnictwo klas, zmiennych i metod we wszystkich projektach.

 

Czyli np ja robie tak:

 

a) Klasy z dużej litery; public class Faktura {}

B) Właściwości z dużej litery np public string Name { get; set; }

c) Pola prywatne z podkreślnikiem np. private readonly IRepository _repo;

 

Staraj się aby nazwy funkcji ( w programowaniu obiektowym metody ) były napisane w taki sposób abyś od razu wiedział co dana funkcja robi. Unikaj tworzenia funkcji, które będą wykonywać więcej niż 1 funkcjonalność. Jeśli są w Twoim projekcie takie to warto rozbić je na mniejsze.

 

Czyli np:

 

public void SaveToDataBaseAndDisplay() {}

 

Zamień na 2 oddzielne funkcje

 

public void SaveObjectToDataBase()

{

 

}

 

public void DisplayObjectFromDataBase()

{

 

}

 

Taka architektura pozwoli Ci na moduowość w swoim programie.

 

Unikaj komentarzy. Dobrze napisany kod to taki, który ich nie wymaga. To kod w którym nazwy zmiennych, metod i interfejsów napisane są w taki sposób, że wszyscy wszystko wiedzą. Nadmierna ilość komentarzy zaciemnia kod.

 

Ogólnie poczytaj troche o czymś takim jak:

a) SOLID

B) Smell Code ( gnicie kodu )

c) Kod Spaghetti

d) Zasada DRY and KISS

 

Te kilka prostych zasad sprawi, że Twój kod stanie się czysty i prosty w konserwacji. 

 

Staraj się nie potrzebnie nie komplikować. Pewne rzeczy da się zrobić w prosty sposób a inne w trudniejszy, ale jeśli możesz zrobić to proście to zrób. O tym mówi zasada KISS. (Nie komplikuj)

 

Oprócz tego nie twórz kodu nadmiarowego. Staraj się nie powtarzać kodu, który później będzie nawarstwiał się w Twoim projekcie. Nie pisz czegoś do przodu, czyli nei deklaruj 100 metod na przód, lepiej zadeklarować 5 i je skończyć a później dopisać kolejnych 5 ( DRY - Nie powtarzaj się )

 

Unikaj instrukcji GOTO! GOTO to jest zabójca dla Twoich programów. 

 

Zasad programowania i inżynierii oprogramowania jest bardzo wiele i nie sposób wymienić i opisać je tutaj wszystkie w takim zwykłym, nędznym poście.

Ogólnie, jeśli dopiero zaczynasz swoją przygodę z programowaniem to najlepiej uczyć się praktycznie. 

 

Masz jakiś cel, chcesz zrealizować jakąś funkcjonalność. To siadasz, analizujesz co musisz zrobić. Najlepiej dokonać dekompozycji dużego problemu na mniejsze i wtedy będzie Ci łatwiej to wszystko jakoś ogarnąć.

 

Np.

 

Piszesz aplikacje webową do obsługi zakupów przez internet.

Taka aplikacja składa się z wielu składowych:

- Tworzenie bazy danych wraz z odpowiednimi modelami

- Tworzenie interfejsu użytkownika

- Tworzenie możliwości rejestracji użytkownika

- Później możliwość zalogowania się po rejestracji.

- Filtrowanie produktów po nazwie, kategoriach i cenie.

- Dodawanie produktów do koszyka.

- Edycja i personalizacja konta.

- Zamawianie wybranych produktów

 

etc. etc... itd...

 

I bierzesz np, taka funkcjonalność jak rejestracja nowego użytkownika. Najlepiej na kartce skorzystać z schematu UML czyli narysować sobie takie bloczki. Jak będziesz mieć chwile to poczytaj o USE CASE Diagram UML ( to jest jeden z kilku takich diagramów )

 

No i zaczynasz np:

a) Musisz stworzyć formularz rejestracji ( zawierający pola do rejestracji )

B) Po wypełnieniu formularza przez użytkownika i kliknięciu w przycisk rejestruj powinna się uruchomić jakaś metoda ( akcja )

c) Na pewno na tym etapie po stronie widoku należy zwalidować dane ( czyli sprawdzić, czy np. podany ciąg znaków w polu EMAIL jest faktycznie EMAILEM czyli chodzby zawiera malpę itp ), do tego możesz sprawdzić czy np. PESEL zawiera 11 znaków, czy kod pocztowy ma odpowiednią maskę ( xx-xxx) itp. Tutaj można sprawdzać również czy w bazie istnieje już taki użytkownik ( lub ten adres email )

Jeśli użytkownik wypełnij wszystkie dane poprawnie to przechodzimy dalej, jeśli nie to okrzycz użytkownika i zbluzgaj go, że jest matołem i wypełnił źle.

d) Dodajemy tego użytkownika jeśli nie istnieje. Tutaj pamiętaj, że haseł w bazie nie powinno się przechowywać w postać jawnej. Musi być ono zaszyfrowane. Najlepiej MD5 albo innym algorytmem. Czyli do bazy zapisujesz ciąg znaków zaszyfrowanych i nawet podglądając zawartość bazy ( edit top 100 rows w phpmyadmin nie jesteś w stanie sczytać hasła) 

e) Wysyłamy formularz aktywacyjny na maila. Znowu tutaj sposobów jest wiele, ale choćbyś zrobił sobie w bazie pole IsActivated ( 0 - nie, 1 - tak ) to domyślnie jest na 0 a po kliknięciu w link aktywacyjny będzie 1.

 

Bardzo ważne aby dobrze przemyśleć sobie cały projekt.

 

Jak już trochę ogarniesz programowanie ( mówie tutaj o samych podstawach języka ) to warto zagłębić się w poszczególne technologie i biblioteki, z których możesz skorzystać, żebyś nie musiał sam pisać wszystkiego od nowa. Bardzo dużo rzeczy już ktoś kiedyś napisał i cała reszta korzysta z gotowych źródeł. Ważne żebyś TY wiedział jak z tego skorzystać.

 

Jeśli programujesz sobie w Visual Studio a jest to w obecnych czasach jedyne słuszne środowisko programistyczne dla .NETu to warto pobawić się Nugetmanagerem i poprzeglądać dostępne dodatki. Niektóre rzeczy znajdziesz na portalach z kontrolą wersji takich jak bitbucket czy github.

 

Ooo i pamiętaj aby zrobić sobie jakieś repozytorium. Korzystaj z GITa albo z TFSa bo to ogromnie ułatwia życie i pracę zdalną.

 

Później pobaw się wzorcami projektowymi. One sprawią, że Twoje projekty będą napisane po Bożemu.

Czyli np.:

-MVC ( dla asp. net )

-MVVM ( dla wpfa )

- Command

- Factory ( Fabryka )

- Nancy

- Fasada

- Unit of Work

- Wstrzykiwanie zależności

- Inversion of Controll

 

Cokolwiek co może ułatwić Ci pracę.

 

Programowanie to na prawdę fascynująca ale i trudna nauka. Wymaga siedzenia na czterech literkach i stukania palcami w klawiaturę przez 8 godzin dziennie, 5 dni w tygodniu. To stukanie nie jest bezmyślne bo wymaga wytężonego myślenia i logik, którą możesz wyćwiczyć tylko pisząc. Więc ćwicz. Powodzenia :)


Jeśli chodzi jeszcze o te IFy to możesz zastosować wersję skróconą

 

<condition> ? <expression 1> : <expression 2>

(zmienna != null) ? zwrocWartosc1 : zwrocWartosc2;

Może nie jest ona łatwiejsza w zrozumienia ale jest na pewno bardziej elegancka  :)


Jeśli na poważnie chcesz zająć się rozwijaniem swojego projektu tej gry to zachęcam do nauki OpenGLa albo XNA. Dla .NET najlepiej XNA.

 

http://msdn.microsoft.com/pl-pl/library/podstawy-xna--sterowanie-za-pomoca-klawiatury.aspx

Opublikowano

XNA 2D Niby w c#, ale dużo nowych rzeczy. Staram się coś tam zrobić, jednak aplikacja okienkowa to cos innego niz dodawanie wszystkiego samemu ;P

sygnatura niezgodna z regulaminem forum mpc rozdział II pkt. 7

Opublikowano

No to spoko jak starasz się sam coś ogarniać. Wtedy się najwięcej nauczysz. Ogólnie C# to nie zbyt dobry język do pisania gier ale coś tam zawsze napiszesz ;)

Opublikowano

@up Długo bawiłem się w C++, jest podobny do C#, jestem na takim etapie, że liznąłem tego i tego. Na który się przerzucić + jaki silnik wybrać? 

sygnatura niezgodna z regulaminem forum mpc rozdział II pkt. 7

Opublikowano

Jeśli chcesz pisać gry w C++ to możesz wykorzystać Allegro, OpenGL lub DirectX.

 

C# stosuje sie bardziej do aplikacji biznesowych dla firm. Pisze się w tym bardzo szybko w porównaniu do C++

Opublikowano

Ale XNA zostało przecież stworzone do gier.

 

W unity tak samo istnieje funkcja pisania kodu w C# (choć tam jest wiele tych języków)

 

W moim mniemaniu lepiej pisze się w c#, ale C++ też mozna się poduczyć :P

sygnatura niezgodna z regulaminem forum mpc rozdział II pkt. 7

Opublikowano

Oczywiście, że lepiej pisze się w C#, ale C# nie jest językiem stworzonym do pisania gier. Wiem, że ludzie wymyślają tego typu biblioteki do sharpa ale nigdy nie będzie to tak wydajnie chodzić jak w C++.

  • 2 miesiące temu...
Opublikowano

Zrób grafikę jak w battlefield 4 (nie bierzcie sobie tego na poważnie to tylko żart :D )

Opublikowano

odkopujecie nieaktualny temat sprzed kilku miesięcy ._.

@Prośba do moderatora:
    Czy w wyniku potencjalnej nieprzydatności tego tematu oraz wyżej powstałego spamu możesz zamknąć temat - twórca i tak przerzucił się na XNA?

"Zwei Dinge sind unendlich, das Universum und die menschliche Dummheit, aber beim Universum bin ich mir nicht ganz sicher."
~A. Einstein

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...