J2MeForum Foren-Übersicht J2MeForum
Willkommen im J2MeForum! Hier gehts um die Entwicklung mobiler Applikationen in J2ME (Java 2 Micro Edition) für Handys von Nokia, Sonyericsson, Motorola, Samsung uvm. aber auch um die Programmierung von Organizern unter PalmOS, Android oder dem iPhone bzw. iPod Touch. Viel Vergnügen!
 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen   RegistrierenRegistrieren 
 ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin Seacrh Users Suche Usernamen




Bilder/Design allgemein

 
Neues Thema eröffnen   Neue Antwort erstellen    J2MeForum Foren-Übersicht -> Gamedesign
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
CocoonOffline
junior j2me developer
junior j2me developer
Anmeldungsdatum: 23.05.2007
Beiträge insgesamt: 377
Wohnort: Würzburg
Alter: 22
Geschlecht: männlich

9476.26 Freiminuten

BeitragVerfasst am: 04.06.2007, 08:03    Titel: Bilder/Design allgemein Antworten mit Zitat

Hi,

nachdem ich jetzt 2 eher "billige" Spiele erstellt habe, würde ich jetzt gerne etwas grafisch anspruchsvolleres erstellen. Mir schwebt da ein einfaches 2D-Jump-And-Run vor. Nur habe ich keine Ahnung wie ich am besten Anfange, ohne, dass das Ganze in einem rießengroßen Desaster endet Winken . Ich fang am Besten einfach mal am Besten mit ein paar Fragen an Winken :

1. Wo bekomme ich grafiken her? Bin kein besonders begabter Designer und kenne auch niemanden, der soetwas für mich machen würde.

2. Bis jetzt habe ich es so gehandhabt, dass sich das Spiel komplett an die jeweilige Display-Größe anpasst, das sollte jetzt aber mit Grafiken schwierig werden. Ich kann ja schlecht für jede mögliche Display-Größe eine entsprechend skallierte Graifk mitliefern. Wie geht man hier vor? Gibts dafür eine allgemeine vorgehensweiße? Erstellt man für jede Display-Größe ein eigenes Jar?

3. Wie werden Levels gestaltet (hab mir dazu schon den Thread in diesem Form durchgelesen, steigt für mich aber eine Stufe zu hoch ein Verlegen )? Besteht ein Level aus einer einzigen Grafik? Oder wird das Level aus mehreren kleinen Grafiken (die dann vermutlich öffters dargestellt werden) angezeigt?

4. Wie funktioniert das mit der Kollisionsabfrage? Wird ein 2D-Array angelegt um zu überprüfen, wo sich etwas befindet?

Das wars (erstmal Winken ). Danke für eure Antworten!
Nach oben
Benutzer-Profile anzeigen Website dieses Benutzers besuchen 
BackwardsmanOffline
addicted j2me junkie
addicted j2me junkie
Anmeldungsdatum: 20.06.2006
Beiträge insgesamt: 1163
Geschlecht: männlich

23107.91 Freiminuten

BeitragVerfasst am: 04.06.2007, 08:50    Titel: Re: Bilder/Design allgemein Antworten mit Zitat

bin zwar jetzt nicht so der spiele entwickler aber ich versuch mal mein bestes Winken
Cocoon hat folgendes geschrieben:

1. Wo bekomme ich grafiken her?

da stellt sich als erstes mal die frage, ob du das spiel später verkaufen möchtest! falls nein, sollte es kein problem sein, da es unzällige seiten gibt, die grafiken für den nicht-kommerziellen gebrauch zur verfügung stellen. falls ja, wird es schwerer, niemand möchte natürlich seine arbeit bzw grafik kostenlos ins web stellen damit jemand anderes damit profit machen kann... wenn du lange genug suchst, findest du bestimmt auch seiten, auf denen es kostenlose/lizenzfreie grafiken gibt. aber prinzipiell heißt es selbst machen oder dafür bezahlen Winken

Zitat:

2. ... Erstellt man für jede Display-Größe ein eigenes Jar?

Ja! ... oder zumindest ein eigenes jar für eine klasse von display-größen, insgesamt ist es wohl weniger aufwendig mehrere jars zu erstellen anstatt eine einzige dynamische version zu erstellen (was aber durchaus möglich ist)

Zitat:

3. ...Besteht ein Level aus einer einzigen Grafik? Oder wird das Level aus mehreren kleinen Grafiken (die dann vermutlich öffters dargestellt werden) angezeigt?

also eine große grafik würde die meisten geräte überlasten, man benutzt dafür "kacheln" (tile) und pflastert damit das level... schau mal nach der Klasse TiledLayer so weit ich weiß ist die genau für so was gedacht.

Zitat:

4. Wie funktioniert das mit der Kollisionsabfrage? Wird ein 2D-Array angelegt um zu überprüfen, wo sich etwas befindet?

meinst du jetzt einen 2d-array, welcher für jeden pixel des displays einen eintrag hat? also ich hab das jetzt selbst noch nicht gemacht, aber das hört sich für mich viel zu aufwendig an... zumal du denn array bei der kleinsten bewegung, also im grunde jedesmal wenn eine taste gedrückt wird aktualisieren musst.
stattdessen bräuchtest du dir nur merken, welche objekte gerade sichtbar sind. dann vergleichst du das sich bewegende objekt mit allen anderen objekten und findest relativ schnell raus, ob sich was schneidet, immerhin wirst du ja weniger objekte als pixel auf dem display anzeigen ,-) und die postion bzw. größe der objekte kennst du ja ohnehin, da du sie in der paint-methode zeichnen musst


Zitat:
Danke für eure Antworten!

bitte
_________________

The Backwardsman. The Backwardsman. I can walk backwards as fast as you can...
Nach oben
Benutzer-Profile anzeigen 
CocoonOffline
junior j2me developer
junior j2me developer
Anmeldungsdatum: 23.05.2007
Beiträge insgesamt: 377
Wohnort: Würzburg
Alter: 22
Geschlecht: männlich

9476.26 Freiminuten

BeitragVerfasst am: 04.06.2007, 11:55    Titel: Re: Bilder/Design allgemein Antworten mit Zitat

Backwardsman hat folgendes geschrieben:
bin zwar jetzt nicht so der spiele entwickler aber ich versuch mal mein bestes


Ist ja immerhin schonmal ein Anfang Smilie

Backwardsman hat folgendes geschrieben:
da stellt sich als erstes mal die frage, ob du das spiel später verkaufen möchtest!


sowohl als auch Winken .

Backwardsman hat folgendes geschrieben:
falls nein, sollte es kein problem sein, da es unzällige seiten gibt, die grafiken für den nicht-kommerziellen gebrauch zur verfügung stellen. falls ja, wird es schwerer, niemand möchte natürlich seine arbeit bzw grafik kostenlos ins web stellen damit jemand anderes damit profit machen kann... wenn du lange genug suchst, findest du bestimmt auch seiten, auf denen es kostenlose/lizenzfreie grafiken gibt. aber prinzipiell heißt es selbst machen oder dafür bezahlen Winken


Du kennst nicht zufällig ein paar solcher Seiten!? Winken

Backwardsman hat folgendes geschrieben:
Ja! ... oder zumindest ein eigenes jar für eine klasse von display-größen, insgesamt ist es wohl weniger aufwendig mehrere jars zu erstellen anstatt eine einzige dynamische version zu erstellen (was aber durchaus möglich ist)


Gibt es eigentlich Standard-Bildschirmgrößen, auf die man optimieren kann? Könnte man ein Canvas auch für die kleinste unterstützte Bildschirmgröße optimieren und es dann für unbedeutend größere Displays im "Fenster-Modus" laufen lassen?

Backwardsman hat folgendes geschrieben:
meinst du jetzt einen 2d-array, welcher für jeden pixel des displays einen eintrag hat? also ich hab das jetzt selbst noch nicht gemacht, aber das hört sich für mich viel zu aufwendig an... zumal du denn array bei der kleinsten bewegung, also im grunde jedesmal wenn eine taste gedrückt wird aktualisieren musst.
stattdessen bräuchtest du dir nur merken, welche objekte gerade sichtbar sind. dann vergleichst du das sich bewegende objekt mit allen anderen objekten und findest relativ schnell raus, ob sich was schneidet, immerhin wirst du ja weniger objekte als pixel auf dem display anzeigen ,-) und die postion bzw. größe der objekte kennst du ja ohnehin, da du sie in der paint-methode zeichnen musst


Hm, und woher weiß dann mein Canvas was es zeichnen muss? Ich kann ja schlecht 20.000 Abfragen machen, was gerade gezeichnet werden muss.
Nach oben
Benutzer-Profile anzeigen Website dieses Benutzers besuchen 
BackwardsmanOffline
addicted j2me junkie
addicted j2me junkie
Anmeldungsdatum: 20.06.2006
Beiträge insgesamt: 1163
Geschlecht: männlich

23107.91 Freiminuten

BeitragVerfasst am: 04.06.2007, 12:15    Titel: Antworten mit Zitat

Zitat:
Du kennst nicht zufällig ein paar solcher Seiten!? Winken

auswendig nicht...aber google wirst du noch bedienen können, oder? Winken ...erwarte aber keine high-end design bitmaps, da gibts meistens einfach nur die standard icons.

Zitat:
...Könnte man ein Canvas auch für die kleinste unterstützte Bildschirmgröße optimieren und es dann für unbedeutend größere Displays im "Fenster-Modus" laufen lassen?

naja, die kleinste unterstützte größe liegt bei 96x64 oder so was, das würde schon richtig blöd aussehen, auf den großen displays die es heute gibt Winken kannst dich einfach an den gängigsten display-größen orientieren und dir deine eigene mindest-größe festlegen.

kommt halt auch drauf an was das für ein spiel ist... wenn es ein jump & run ist, in dem nur horizontal gescrollt wird, ist die display breite zum beispiel relativ egal, dann wäre nur die höhe interessant...

Zitat:
Hm, und woher weiß dann mein Canvas was es zeichnen muss? Ich kann ja schlecht 20.000 Abfragen machen, was gerade gezeichnet werden muss.

na wenn du das nicht weiß, kannst du das spiel ja gar nicht erst erstellen... Winken

also ich habe wie gesagt noch kein spiel geschrieben, aber ich würde mir überlegen wie ein level aussieht, die maße festhalten und innerhalb des levels objekte platzieren, wenn es halt 20.000 stück sind, bleibt dir nix anderes übrig das per hand zu machen...außer du willst die level zufällig generieren. je nachdem wo sich sich der bildschirm ausschnitt gerade in dem level befindet muss du abfragen welche objekte gerade sichbar sind, bzw sich in dem ausschnitt befinden und dazu musst du entweder alle objekte durchgehen oder das level vorher in größere bereiche einteilen... was da das beste ist oder ob man das so macht weiß ich wie gesagt nicht genau.
_________________

The Backwardsman. The Backwardsman. I can walk backwards as fast as you can...
Nach oben
Benutzer-Profile anzeigen 
CocoonOffline
junior j2me developer
junior j2me developer
Anmeldungsdatum: 23.05.2007
Beiträge insgesamt: 377
Wohnort: Würzburg
Alter: 22
Geschlecht: männlich

9476.26 Freiminuten

BeitragVerfasst am: 04.06.2007, 13:53    Titel: Antworten mit Zitat

OK, danke. Das hat mich jetzt alles erstmal zufrieden gestellt Winken . Sollte noch jemand Tipps haben, nur her damit Sehr glücklich
Nach oben
Benutzer-Profile anzeigen Website dieses Benutzers besuchen 
bprischlOffline
professional j2me developer
professional j2me developer
Anmeldungsdatum: 28.01.2004
Beiträge insgesamt: 886
Wohnort: Linz
Geschlecht: nicht angegeben

7336.89 Freiminuten

BeitragVerfasst am: 04.06.2007, 19:40    Titel: Antworten mit Zitat

Wie schon von Backwardsman erwähnt wirst du für Klassen von Displaygrößen verschiedene Builds benötigen (und wenn du ein Spiel verkaufst brauchst ohnehin noch einige Builds mehr die mit gewissen Eigenheiten - man könnte auch Bugs dazu sagen - bei gewissen Handys umgehen können).

Für die Jump and Run Games die ich bis jetzt erstellt habe haben sich 3 verschiedene Tile-Größen als sinnvoll herausgestellt: 16x16, 24x24 und 32x32 (man könnte für die Riesendisplays wie 352x416 auch noch 64x64 nehmen, aber es ging bisher auch so). Dann verwendet man z.B. für Displays kleiner als 176x208 die 16x16 Tiles, unter 240x320 die 24x24 und darüber die 32x32. Man sollte natürlich auch nicht zuviele verschiedene Tiles im Tileset haben (Heap/JAR-Size Limit!), so irgendwo zwischen 64 und 192 wars bei mir bisher immer (schwache Handys bekamen ein abgespecktes Tileset wo weniger Deko-Tiles drin waren - in der Levelmap wurden dann viele Deko-Tiles zu wenigen zusammengefaßt und die Tileindexes einfach ersetzt).

Wenn du nicht die fertige Tileengine (TiledLayer) verwenden möchtest (hab ich nie verwendet, gibts auch nur unter MIDP2) muß du dir auf jeden Fall selber eine Engine zusammenbasteln die den Level hinzeichnet (Sprites werden üblicherweise in einem zweiten Schritt noch drübergezeichnet und haben mit der Tileengine nichts zu tun). Dafür wirst du dir ziemlich sicher einen Caching-Algo audenken müssen damit schwache Handys nicht gleich zum ruckeln anfangen wenn sie beim Screenrefresh 50 bis 100 Tiles zeichnen müssen. Damit du eine Vorstellung davon hast: meine eigene Engine zeichnet im Schnitt nur 15-20% der Tiles die man ohne Buffer zeichnen müßte, damit gewinnt man schon viel an Performance die man dann in andere Dinge stecken kann (Sprites, Gameplay, gute Steuerung, ...)

Wir hatten schon einige Diskussionen in diesem Forum wo es um Tileengines und Backbuffer ging (also ein Image in das man den Ausschnitt des Levels reinzeichnet, und das dann am Screen angezeigt und verschoben wird) - einfach mal danach suchen. Das Thema ist zwar nicht ganz so easy zu begreifen, aber du schaffst das schon Winken
Nach oben
Benutzer-Profile anzeigen 
CocoonOffline
junior j2me developer
junior j2me developer
Anmeldungsdatum: 23.05.2007
Beiträge insgesamt: 377
Wohnort: Würzburg
Alter: 22
Geschlecht: männlich

9476.26 Freiminuten

BeitragVerfasst am: 04.06.2007, 20:54    Titel: Antworten mit Zitat

Danke, hat mir sehr geholfen Sehr glücklich .
Nach oben
Benutzer-Profile anzeigen Website dieses Benutzers besuchen 
herontronicOffline
junior j2me developer
junior j2me developer
Anmeldungsdatum: 10.10.2006
Beiträge insgesamt: 437
Wohnort: Stuttgart
Alter: 33
Geschlecht: männlich

10180.38 Freiminuten

BeitragVerfasst am: 05.06.2007, 11:25    Titel: Antworten mit Zitat

Ich habe hier mal das Grundgerüst einer Jump'n'Run-Engine, im Prinzip läuft man nur, Plattformen gibt es hier noch nicht:

Code:

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

import java.util.*;
import java.lang.Math.*;

public class Cliffhanger extends MIDlet
   {
   private Display display;
         private MyCanvas canvas;

         public Cliffhanger ()
            {
      display = Display.getDisplay(this);
                 canvas = new MyCanvas(this);
                 }

   protected void startApp()
            {
      display.setCurrent(canvas);
                 }

   protected void pauseApp(){}

         protected void destroyApp(boolean unconditional) {}

         public void exitMIDlet()
            {
      destroyApp(true);
                 notifyDestroyed();
                 }
         }

class MyCanvas extends Canvas implements CommandListener
   {
         private Command commandExit;
         private Cliffhanger main;
         Random random = new Random();
         private int[] feld = new int[3];
   private int x=0, y=0; // Koordinaten Sprite
   private int richtungX=0, richtungY=0; // Laufichtung Sprite (Steuerung)
         private int laufrichtung=0; // Laufrichtung Sprite (Sprite)
         private int beschleunigungX=0, beschleunigungY=0; // Beschleunigungen Sprite
         private int screendesign=0; // Design der Levels [0..1]

         private int p=0, i=0; // allgemeine Zaehler

   private int anim=0;
         private int timer=0;
         private int tmenu = 0;
         private int Xmax=getWidth();
         private int Ymax=getHeight();
         private int Xhalf=getWidth()/2;
         private int Yhalf=getHeight()/2;

           private Image i_hammel = null,
                  i_titel = null,
                       i_wolke = null,
                       i_fg = null,
                       i_bg = null;


         public MyCanvas (Cliffhanger main)
            {
      this.main = main;
                 commandExit = new Command("Exit", Command.EXIT, 1);
                 addCommand(commandExit);
                 setCommandListener(this);
                 setFullScreenMode(true);
                 try    {i_hammel  = Image.createImage("/sprite.png");}    catch (Exception e) {System.out.println("Couldn't initialize data");}
                 try    {i_fg      = Image.createImage("/fg.png");}       catch (Exception e) {System.out.println("Couldn't initialize data");}
                 try    {i_bg      = Image.createImage("/bg.png");}       catch (Exception e) {System.out.println("Couldn't initialize data");}
                   }


         public void setHammel(Graphics g, int x, int y, int anim)
                 {
                 g.setClip(x,y,31,31);
                 if (anim==-1) g.drawImage(i_hammel,x-279,y-laufrichtung*62,Graphics.LEFT|Graphics.TOP);
                       else g.drawImage(i_hammel,x-31*((anim+laufrichtung*18)%9),y-31*((anim+laufrichtung*18)/9),Graphics.LEFT|Graphics.TOP);
                 }

         public void setLandscape(Graphics g, int x, int y, int anim)
                 {
                 g.setClip(x,y,50,50);
                 g.drawImage(i_fg,x-50*(anim%3),y-50*(anim/3),Graphics.LEFT|Graphics.TOP);
                 }


         protected void paint (Graphics g)
            {
            long started=System.currentTimeMillis();

            timer=(timer+1)%100000;
            if (richtungX==1) if (beschleunigungX<5) {beschleunigungX+=1; laufrichtung=0;}
            if (richtungX==-1) if (beschleunigungX>-5) {beschleunigungX-=1; laufrichtung=1;}
            if (richtungX==0)
                  {
                  if (beschleunigungX>0) beschleunigungX-=1;
                  if (beschleunigungX<0) beschleunigungX+=1;
                  }

            anim=(x+100000)%(18*3);
            if (y<(Ymax-40)) {beschleunigungY+=1;anim=-3;}
            if (y>(Ymax-40)) {y=Ymax-40; beschleunigungY=0;}

            y+=beschleunigungY;
            x+=beschleunigungX;

            switch (screendesign)
                  {
                  case 0: g.setColor(107,173,255); break;
                  case 1: g.setColor(0,0,0); break;
                  default: g.setColor(107,173,255); break;
                  }
            g.fillRect(0, 0, getWidth(), getHeight());

            // Ebene 3, Gadget (Wolke, Mond, etc..)
            g.setClip(Xmax-((timer+x)%(Xmax*+100)/20)%(Xmax+100),Ymax-100,100,36);
            g.drawImage(i_bg, Xmax-((timer+x)%(Xmax*+100)/20)%(Xmax+100)-screendesign*100, Ymax-100-64,Graphics.LEFT|Graphics.TOP);

            // Ebene 2, Hintergrund, Berge
            for (p=-1; p<Ymax/100+2; p++)
                  {
                  g.setClip(p*100-((x/6)%100),Ymax-54,100,64);
                  g.drawImage(i_bg,p*100-((x/6)%100)-screendesign*100,Ymax-54,Graphics.LEFT|Graphics.TOP);
                  }
            // Boden
            for (p=-1; p<Ymax/50+2; p++) setLandscape(g, p*50-(x%50),Ymax-14,1);
            // Sprite
            setHammel(g, Xhalf-30,y,anim/3);


            while (System.currentTimeMillis() - started < 25) {}
            repaint();
                 }

         public void commandAction(Command c, Displayable d)
            {
                 if (c == commandExit) main.exitMIDlet();
                 }

         protected void keyPressed(int code)
            {
                 switch(getGameAction(code))
                         {
                         case UP:    if (y==(Ymax-40)) beschleunigungY=-15;break;
                         case DOWN:  break;
                         case LEFT:  richtungX=-1; break;
                         case RIGHT: richtungX=1; break;
                         }
                 }

         protected void keyReleased(int code)
            {
                 switch(getGameAction(code))
                         {
                         case UP:    beschleunigungY/=2; break;
                         case DOWN:  break;
                         case LEFT:  richtungX=0; break;
                         case RIGHT: richtungX=0; break;
                         case FIRE:  break;
                         }
                 }
           }


Hier sind die Images dazu (als Test):
http://herontronic.de/sprite.png
http://herontronic.de/fg.png
http://herontronic.de/bg.png

Kannst ein bißchen rumexperimentieren! Über die Variable "screendesign" kannst Du bspw. zwischen zwei Hintergründen switchen, Sprunghöhe wird über die Länge des Tastendrucks geregelt, sogar eine simple Form des Parallaxscrolling ist integriert (vorne scrollt schneller als hinten).

Wenn Du Plattformen oder Gegner einbauen willst, funktioniert das in etwa ähnlich, wie bspw. die Darstellung der Hintergrundwolke. Items (also Hintergründe, Plattformen, Gegner, Aufsammelobjekte, etc) werden hier also über Vektoren dargestellt, jedes Item wird also nur dargestellt, wenn der Inhalt auch auf dem Bildschirm ist. Nachteil dieser Methode ist, dass man keinen aufwändigen (detailreichen) Hintergrund generieren kann.

Ob der Code allerdings auch für weniger leistungsfähigere Handys als Sony K750i gut ist, weiß ich nicht! Würde mich freuen, wenn das hier jemand mal testen könnte:

Download JAR
Download JAD
_________________
___________________________
,.-=( Idee )=-.,
Nach oben
Benutzer-Profile anzeigen Website dieses Benutzers besuchen 
CocoonOffline
junior j2me developer
junior j2me developer
Anmeldungsdatum: 23.05.2007
Beiträge insgesamt: 377
Wohnort: Würzburg
Alter: 22
Geschlecht: männlich

9476.26 Freiminuten

BeitragVerfasst am: 05.06.2007, 12:27    Titel: Antworten mit Zitat

WOW, super! Hab momentan ein bisschen Stress, werd mir das aber aufjedenfall spätestens nächste Woche mal anschauen! Danke!
Nach oben
Benutzer-Profile anzeigen Website dieses Benutzers besuchen 
allergonautOffline
greenhorn
greenhorn
Anmeldungsdatum: 29.04.2010
Beiträge insgesamt: 3
Geschlecht: nicht angegeben

53.51 Freiminuten

BeitragVerfasst am: 07.06.2010, 07:56    Titel: Bilder/Design allg Antworten mit Zitat

ich bin dabei, von Opera auf firefox umzusteigen.
In der Ansichtsleiste von Opera gibt es die buttons "Bilder zeigen - Bilder im cash - keine Bilder" nicht zu verwechsenln mit Werbe/Popup-Blocker
und dann auch "an Breite anpassen".
Beide Funktionen sind sehr hilfreich.
Bietet firefox Г¤hnliche Funktionen?
Wer kann mir helfen?
Danke
rato
Nach oben
Benutzer-Profile anzeigen 
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    J2MeForum Foren-Übersicht -> Gamedesign Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

Werbe Banner:
.



Powered by phpBB © 2001, 2005 phpBB Group


java-forum.net Aktien Fonds Vermögensaufbau Linz Kostenlose Handygames
Quiz konstenlos gutschein gewinnen Perl, Mason Tutorials und Forum Manufacturing Execution System MES