Canvas Probleme

  • Antworten:2
Gelöschter Account
  • Forum-Beiträge: 2.492

13.01.2014, 15:06:20 via Website

Hallo,

ich möchte gerne, dass sich ein Ball auf dem Bildschirm bewegt und an den Rändern abprallt. Wenn man dann auf den Bildschirm drückt, soll genau da ein Block gesetzt werden, wo der Ball auch abprallt.
Ich habe bisher eine Klasse (Level1) in der die Klasse Ball aufgerufen wird und in dieser wird ein Ball auf einem Canvas gezeichnet und bewegt sich dort (Kollision mit Wand klappt).
Dann habe ich noch die Klasse Block, Wenn man auf den Bildschirm drückt, reagiert in der Level1 Klasse der onTouchListener und ruft die Klasse Block auf, in der dann ein Block gemalt wird. Mein Problem ist jetzt, das immer nur ein Block gemalt wird und wenn man nochmal irgendwo drückt verschwindet der alte und ein neuer wird gemalt. Ich möchte aber gerne das dann 2 vorhanden sind.
Ich habe die Blöcke mal in einer Liste gespeichert aber das hilft leider auch nicht.

Level1 Klasse:
1protected void onCreate(Bundle savedInstanceState) {
2 // TODO Auto-generated method stub
3 super.onCreate(savedInstanceState);
4 BlockAdapter = new ArrayAdapter<Block>(this,android.R.layout.simple_list_item_1, BlockList);
5 gBlock = BitmapFactory.decodeResource(getResources(), R.drawable.block);
6 rl = new RelativeLayout(this);
7 rl.setOnTouchListener(this);
8 ball = new Ball(this);
9 rl.addView(ball);
10 setContentView(rl);
11 }
12
13 @Override
14 public boolean onTouch(View v, MotionEvent event) {
15 // TODO Auto-generated method stub
16 switch(event.getAction()){
17 case MotionEvent.ACTION_DOWN:
18 blockX = event.getX(); //public Variable, die in der Block Klasse abgefragt werden um Position herauszufinden)
19 blockY = event.getY();// s.o.
20 BlockList.add(new Block(this));
21 for(int j = 0; j < BlockList.size(); j++){
22 ll.removeView(BlockList.get(j));
23 ll.addView(BlockList.get(j));
24 }
25 break;
26 }
27 return false;
28 }
Ball Klasse:
1public Ball(Context context) {
2 super(context);
3 // TODO Auto-generated constructor stub
4 gBall = BitmapFactory.decodeResource(getResources(), R.drawable.greenball);
5 yPosition = 20;
6 xPosition = 5;
7 geschwindigkeit = 1.5f;
8 richtungX = 5;
9 richtungY = 5;
10 }
11
12 @Override
13 protected void onDraw(Canvas canvas) {
14 // TODO Auto-generated method stub
15 super.onDraw(canvas);
16
17 //Bitmap auf canvas (Ball
18 canvas.drawBitmap(gBall, xPosition, yPosition, null);
19 xPosition = (xPosition + richtungX);
20 yPosition = (yPosition + richtungY);
21
22 wandkollisionen();
23 invalidate();
24 }
Block Klasse:
1public Block(Context context) {
2 super(context);
3 jaj = context;
4 // TODO Auto-generated constructor stub
5 gBlock = BitmapFactory.decodeResource(getResources(), R.drawable.block);
6 }
7
8 @Override
9 protected void onDraw(Canvas canvas) {
10 // TODO Auto-generated method stub
11 super.onDraw(canvas);
12 canvas.drawBitmap(gBlock, (int)Level1.blockX, (int)Level1.blockY, null);
13 invalidate();
14 }

Wär echt cool wenn da jemand eine Idee hat, ich hab nämlich echt schon viel ausprobiert aber entweder wird gar nichts angezeigt oder halt nur ein Block der immer "springt".

Gruß
Lars

— geändert am 13.01.2014, 15:07:02

Antworten
impjor
  • Forum-Beiträge: 1.793

13.01.2014, 16:28:15 via App

Deine Block-Liste ist seltsam, warum nutzt du nicht einfach Array-/LinkedList?
Du fragst in der Block-Klasse x/y-Werte aus der Level1-Klasse ab, ist doch klar, dass da alle Blöcke an der selben Stelle gezeichnet werden.
-> Jede Block-Klasse braucht selber x/y-Koordinaten, wie die Ball-Klasse.

Weitere Tipps zur Verbesserung:
1. Level1 ist ein schlechter Klassenname/Konzept. Lieber eine Klasse Level, diese bekommt dann im Konstruktor mittgeteilt, dass sie Level1, 2,... ist und lädt dann entsprechend das Level.
2. Du lädst irgendwie zweimal die Block-Ressourcen: In der Level1 und Block-Klasse.
3. Erstelle eine Oberklasse Sprite/WordObject/oä. die Koordinaten etc. beinhaltet. Ball und Block leiten sich davon ab und laden nur noch die Bilder, setzen Breite und Höhe etc. Das Abprallen von Wand etc. (Kollision) sollte auch in die Ball-Klasse.
LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

13.01.2014, 17:09:50 via Website

Oh stimmt danke daran lag es.

zu 1. Okay gute Idee ich hatte auch schon darüber nachgedacht wie man es machen soll weil für jedes Level eine eigene Klasse wär bisschen viel. Danke für den Hinweis
zu 2. Oh stimmt das kommt noch vom testen habe ich vergessen rauszunehmen
zu 3. Okay werde ich mal probieren

Gruß
Lars

Antworten