2013-08-07 8 views
6

मैं यह पता लगाने की कोशिश कर रहा हूं कि एक ऐप्पल विंडो में दृश्यमान छवि को तिरछे तरीके से कैसे स्थानांतरित किया जाए।एक दृश्यमान छवि को तिरछे कैसे स्थानांतरित करें?

यदि आप छवि को दबाकर नीचे, नीचे, बाएं या दाएं दबाते हैं (एक gif) तदनुसार चलता है, हालांकि यदि आप एक बार में दो कुंजी दबाएंगे (उदाहरण के लिए एक ही समय में ऊपर और दाएं) छवि केवल तभी चलती है जिस दिशा को आपने दूसरी बार दबाया था (भले ही आप एक ही समय में चाबियाँ दबाएं, फिर भी सूक्ष्म विलंब हो)।

यह ठीक करने का एक आसान तरीका हो सकता है कि मुझे पता नहीं है कि शायद मुझे पता नहीं है, या शायद किसी कामकाज को पता चला है ... मैं किसी भी मदद या सलाह की सराहना करता हूं।

धन्यवाद

हीरो क्लास (इस वर्ग को परिभाषित करता है क्या "हीरो" है, इस मामले में एक सरल पिक्सेल आदमी है, और वह क्या कर सकते हैं)

import objectdraw.*; 
import java.awt.*; 

public class Hero extends ActiveObject { 

private DrawingCanvas canvas; 
private VisibleImage player; 

public Hero(Location initLocation, Image playerPic, DrawingCanvas aCanvas) { 
canvas = aCanvas; 

player = new VisibleImage(playerPic, canvas.getWidth()/3, 
     canvas.getWidth()/3, canvas); 
start(); 

} 
public void run() 
{ 

} 

public void move(double dx, double dy) 
{ 
player.move(dx, dy); 
} 
} 

HeroGame वर्ग (इस वर्ग "हीरो" बनाता है और स्थान है, साथ ही क्या कुंजी बनाने के लिए उपयोग किया जाता है उसे ले जाने के)

import objectdraw.*; 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class HeroGame extends WindowController implements KeyListener { 
private Hero theHero; 
private Image playerPic; 
private Location initLocation; 
public void begin() { 
    playerPic = getImage("player.gif"); 
    canvas.addKeyListener (this); 
    this.addKeyListener (this); 
    requestFocusInWindow(); 
    theHero = new Hero(initLocation, playerPic, canvas); 
    } 
public void keyTyped(KeyEvent e) { } 
public void keyReleased(KeyEvent e) { } 
public void keyPressed(KeyEvent e) { 

    if (e.getKeyCode() == KeyEvent.VK_UP) { 
     theHero.move(0,-5); 
    } 
    else if (e.getKeyCode() == KeyEvent.VK_DOWN) { 
     theHero.move(0,5); 
    } 
    else if (e.getKeyCode() == KeyEvent.VK_LEFT) { 
     theHero.move(-5,0); 
    } 
    else if (e.getKeyCode() == KeyEvent.VK_RIGHT) { 
     theHero.move(5,0); 
    } 
    } 
} 

धन्यवाद एक बार बार इस पढ़ने के लिए और उम्मीद है कि मदद लेने के लिए अधिक निर्दिष्ट करता है।

उत्तर

0

से भी सहमत हूं यह कुंजीपटल इनपुट स्वीकार करने वाले गेम में एक सामान्य स्थिति है। समस्या यह है कि आपके गेम को पर कार्य करने की आवश्यकता है जो वर्तमान में दबाए गए हैं, जहां तक ​​गेम संबंधित है (जिसका अर्थ है कि सभी कुंजी जिसके लिए KEY_RELEASE ईवेंट अभी तक नहीं निकाल दिया गया है)।

KeyListener केवल दबाया पिछले कुंजी के लिए आपको सूचित करेंगे (और है कि एक ही कुंजी के लिए आपको यह सूचित करते अगर आप पकड़ यह दबाया रखना होगा) ताकि आप कुंजी खुद के आराम के लिए राज्य का ट्रैक रखने की जरूरत है।

कि कैसे करना है पर एक विचार प्राप्त करने के लिए, कीबोर्ड मतदान (here an example) एक लोकप्रिय तकनीक जहां खिलाड़ी के इनपुट करने के लिए तुरंत कार्रवाई नहीं करते बल्कि एक कतार और बाद में सर्वेक्षण में कुंजी दबाव की दुकान के लिए खोज है कि नियमित अंतराल पर कतार (यानी आपके गेम लूप में) यह तय करने के लिए कि किन कुंजियां दबाई जाती हैं या नहीं और तदनुसार कार्य करती हैं।

मुझे उम्मीद है कि यह

3

मैं आपको स्विंग (जेप्लेट) और की बाइंडिंग का उपयोग करने का सुझाव दूंगा। एक ही समय में दबाए जा रहे कई कुंजियों को संभालने के लिए एक समाधान के साथ एक KeyListener का उपयोग करने में समस्याओं के लिए Motion Using the Keyboard देखें।

+0

ठीक है, धन्यवाद, मैं उनको जांचूंगा; अगर मुझे लगता है कि यह क्या है तो मैं इसे पोस्ट करना सुनिश्चित कर दूंगा। – Greywarden

2

परिवर्तन

if (e.getKeyCode() == KeyEvent.VK_UP) { 
    theHero.move(0,-5); 
} 
else if (e.getKeyCode() == KeyEvent.VK_DOWN) { 
    theHero.move(0,5); 
} 
else if (e.getKeyCode() == KeyEvent.VK_LEFT) { 
    theHero.move(-5,0); 
} 
else if (e.getKeyCode() == KeyEvent.VK_RIGHT) { 
    theHero.move(5,0); 
} 

को
if (e.getKeyCode() == KeyEvent.VK_UP) { 
    theHero.move(0,-5); 
} 
if (e.getKeyCode() == KeyEvent.VK_DOWN) { 
    theHero.move(0,5); 
} 
if (e.getKeyCode() == KeyEvent.VK_LEFT) { 
    theHero.move(-5,0); 
} 
if (e.getKeyCode() == KeyEvent.VK_RIGHT) { 
    theHero.move(5,0); 
} 

और यह दोनों कुंजी पर प्रतिक्रिया करनी चाहिए।

+0

प्रतिपादन कोड को देखे बिना, मुझे यकीन नहीं है कि यह काम करेगा। यदि उपयोगकर्ता हिट और बाएं हो जाता है, तो वर्ण आंदोलन डेल्टा अभी भी -5,0 – MadProgrammer

+0

धन्यवाद-हालांकि, हालांकि, मैंने उन परिवर्तनों के बाद परिणाम जारी रहे, हालांकि आपके सुझाव ने मुझे समझ लिया। – Greywarden

+0

'हैरो.मोव (0,5); 'एकाधिक कॉल के लिए अनुमति देता है? जैसे, यदि खिलाड़ी आगे बढ़ रहा है, तो क्या दूसरी बार 'हेरो' के लिए 'move() 'विधि को कॉल करना संभव होगा? – bas

0

आपको क्या करना है छवि की अंतर्निहित AffineTransform कक्षा तक पहुंच है, और सही अनुवाद विधियां सेट करें। इससे आपको किसी भी कुंजी (किसी भी स्थिति में, किसी भी दिशा में) किसी भी कुंजी (जिसे आप उस कॉल से जोड़ते हैं) के साथ छवि को स्थानांतरित करने की अनुमति देंगे।

पढ़ें इस पर: http://docs.oracle.com/javase/7/docs/api/java/awt/geom/AffineTransform.html

+0

घूर्णन के अलावा, जो मुझे यकीन है कि नहीं पूछा जा रहा है, मुझे नहीं लगता कि AffineTranform कैसे मदद करेगा। ग्राफिक्स # DrawInage और एक दूसरे के शीर्ष पर सरल ओवरलेइंग छवियों के साथ क्या गलत है? – MadProgrammer

+0

। AffansTransform सेtranslate() विधि? –

+0

अभी भी यह सुनिश्चित नहीं है कि यह ओपीएस समस्या को कैसे ठीक करने जा रहा है: पी – MadProgrammer

1
कुंजी के लिए अपने if-else बयान के बजाय

, आप if बयान की एक श्रृंखला का उपयोग करना चाहिए।

इसके बजाय इन if बयान में दोनों x और y आंदोलन के लिए ' hero रों दिशा की स्थापना के

, आप केवल उचित delta

(एक बहुत ही सरल) उदाहरण के लिए अद्यतन करने की जानी चाहिए ...

if (up) yDelta = -5; 
if (down) yDelta = 5; 
if (left) xDelta = -5; 
if (right) xDelta = 5; 

hero.move(xDelta, yDelta); 

मैं कैमिकर

संबंधित मुद्दे