Permalänk
Medlem

Hjälp med Java programmering

Tjena!

Jag håller på med ett projekt i skolan där man ska skapa sitt eget program och jag valde då att göra ett spel. Jag har dock ett problem nu med att skicka vissa värden från olika klasser. Jag har en "main" klass som kommer att rita allt på skärmen samt lite annat lull lull. Sen har jag en AI klass som ska lagra X och Y värdena på alla AIs. Problemet är att jag har inte hittat något bra sätt att göra detta på.

Först använde jag AI monster = new AI(); för att kunna ta emot värden från AI klassen men om jag använder samma sätt för att ta emot värden från main till AI så får jag något random felmeddelande (kan inte skicka det exakta felmeddelandet då jag inte har programmet på denna dator). Om jag tar bort koden från ena klassen (skickar då inga värden) så fungerar koden men monstret står då stilla.

Tacksam för hjälp!

Edit1: För att klargöra lite så står det AI monster = new AI(); i main klassen och Main main = new Main(); i AI klassen och sedan för att ta emot värden så skriver jag ex monster.getX för att få x värdet från AI klassen.

Permalänk

Förstår jag dig rätt nu, i ditt program startar först main klassen som skapar en ny instans av klassen AI, som sedan skapar en ny instans av klassen main, som därefter skapar en ny instans av AI och så håller det på..

Det du skulle kunna göra är att skapa en grafic class som du sedan skickar med som referens till klassen AI när du initierar den. (alltså till konstruktion)

Sedan ska Mainklassen inte innehålla så mycket kod, det blir mycket enklare att få en överblick över programmet om man därifrån inte behöver se alla detaljer om hur det grafiska sköts.

Visa signatur

[Core i7-3930K med 32GB ram, 2*256GB SSD] & [Core i7 3770K med 16 GB RAM, 256GB SSD] som tillsammans har ett [HD 5850 1GB] och 3st 24".

Permalänk
Medlem
Skrivet av PyzzeN:

Edit1: För att klargöra lite så står det AI monster = new AI(); i main klassen och Main main = new Main(); i AI klassen och sedan för att ta emot värden så skriver jag ex monster.getX för att få x värdet från AI klassen.

Klasserna Main och AI har alltså referenser till varandra? Det är sällan en bra idé. Att Main behöver få information från AI kan jag förstå men inte varför AI behöver ha en Main. Att du dessutom verkar skapa nya Main i varje AI verkar inte helt logiskt.

Det känns som om du vill ha ett ett till många förhållande här. Låt AI och Main implementera varsitt interface, IMain och IMainListener eller nåt. IMainListener kan ha en metod för att registrera en IMain. Då kan Main registrera sig i varje AI-objekt.

// IMain.java public interface IMain { } // IMainListener.java public interface IMainListener { public void registerMain(IMain mainObject) { } } // AI.java public class AI implements IMainListener { IMain main; public void restisterMain(IMain mainObject) { this.main = mainObject; } .... } // Main.java public class Main implements IMain { .... public MinMetod() { AI monster = new AI(); monster.registerMain(this); .... } }

Permalänk
Medlem

Har hållit på med programmering nu i ca 3 månader så jag tenderar att göra lite nybörjarfel lite då och då.
KGB_HC jag ska testa ditt förslag så återkommer jag senare.
Tack för hjälpen!

Permalänk
Medlem
Skrivet av PyzzeN:

Har hållit på med programmering nu i ca 3 månader så jag tenderar att göra lite nybörjarfel lite då och då.
KGB_HC jag ska testa ditt förslag så återkommer jag senare.
Tack för hjälpen!

Med denna struktur får man kraftfulla möjligheter till att kommunicera mellan objekt. Kan vara ganska användbart vid trådning eller om man arbetar med events. Frågan är dock om din AI-klass verkligen behöver ha tillgång till Main-objektet. Vad är det i Main som AI behöver komma åt?

Permalänk
Medlem

Jag ställer mig dock frågan varför main gör något alls utöver att sätta igång applikationen.
Main bör endast starta skapandet av appen å då antagligen bygga upp GUI.

T.ex. typ

public static void main(String[] args) { //Initialize the game Initializer init = new Initializer(); }

Sedan står Initializer för att bygga upp ev GUI, skapa någon form av kontrollklass för spelet, typ GameEngine ?
Initilizern ser till att eventuella kopplingar mellan GUI å GameEngine är korrekta (typ länka New Game knapp till rätt metod osv ? ). Sedan låter du GameEngine äga samtliga objekt som har med spelet att göra osv. Vill man göra nåt med spelet så är det invokering av metoder hos GameEngine som gäller, du bör då även få en bra separation av GUI och Logik. Att skriva massa kod i Main är iaf usch å fy enligt mig.

Edit:
Finns även vad jag minns Observer och Observable som man kan använda i Java för att ha klasser som lyssnar på ändringar hos andra klasser som du kanske kan använda för att få ändringar mellan spelet och gränssnittet, vettefan om det är "good practice" när det kommer till Spel men men Sysslar inte med spelprogrammering

Visa signatur

Spelrigg: 800D| i7 3930K@4,7 GHz - Custom WC | 32 GB Kingston HyperX Beast | 7970 GHz X-Edition |1x30 Dell U3011, 2x27" | Sennheiser HD650 | Xonar Essence STX |
Laptop: G74SX 17,3" 120 Hz 3D |
Server: Phenom II X4 955BE | Corsair XMS3 8 GB | 16 HDDs, 27 TB |
HTPCs: ASUS EEE Box 1.8 Ghz | Blu-Ray | OCZ Vertex 2 60 GB | 4 GB RAM |

Permalänk
Medlem

Just nu är det så att AI klassen ska bara hålla koll på alla monstrens koordinater och att main(som egentligen inte är main utan Grafikmotorn) gör så att alla monstren går mot spelaren och håller koll på kollisioner. Sen hade jag en main som var main som bara startar allt.

Jag har programmering A i skolan så jag pratade med min lärare som hjälpte mig med att AI klassen hela tiden skickar koordinater till Grafikmotorn och inget mer. Hur han löste detta kan jag lägga upp senare ifall ni vill veta.

Till moderatorer, skulle vara glad om denna tråd skulle kunna vara öppen ifall jag stöter på liknande problem.